Oracle 检查是否为NULL未按预期工作
我编写了一个Oracle 检查是否为NULL未按预期工作,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我编写了一个SP,它根据我从前端选择的条件提供记录 问题是,每当我选择状态为Success时,它都可以正常工作,并为我提供成功的结果。但是当我选择Pending时,为空它不按要求工作 下面是我的SP PROCEDURE GET_ALL_STATE_FOR_EXCEL ( P_STATUS NVARCHAR2, TBLDATA_STATE_ALL OUT SYS_REFCURSOR ) AS BEGIN OPEN TBLDATA_STATE_ALL FOR
SP
,它根据我从前端选择的条件提供记录
问题是,每当我选择状态为Success
时,它都可以正常工作,并为我提供成功的结果。但是当我选择Pending
时,为空
它不按要求工作
下面是我的SP
PROCEDURE GET_ALL_STATE_FOR_EXCEL
(
P_STATUS NVARCHAR2,
TBLDATA_STATE_ALL OUT SYS_REFCURSOR
)
AS BEGIN
OPEN TBLDATA_STATE_ALL FOR
Select * from ubr_structure_details where NE_STATUS = P_STATUS;
NULL;
END GET_ALL_STATE_FOR_EXCEL;
更新
当我选择ALL和Pending
时,它工作正常
但当我选择某个状态名和状态为挂起时,它无法正常工作。为此,我的问题如下
PROCEDURE GET_DATA_WITH_STATUS_EXL
(
P_STATE NVARCHAR2,
P_STATUS NVARCHAR2,
TBL_STATE_REP OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN TBL_STATE_REP FOR
select * from ubr_structure_details where (state = P_STATE) and (NE_STATUS = p_status OR NE_STATUS = 'IS NULL');
NULL;
END GET_DATA_WITH_STATUS_EXL;
您需要明确说明
NULL
值:
select *
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
(NE_STATUS is null and P_STATUS is null);
我不建议使用NULL
作为“有效”值。“待定”似乎是一种有效状态;应将其存储为有效的状态值
一些数据库支持NULL
-安全比较(例如ANSI标准与没有区别)。但是,Oracle还不支持此功能
编辑:
当字符串为空时传递p_status
似乎是一个非常糟糕的主意。您确实应该修复这些状态。但您可以在逻辑中包含以下内容:
select *
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
(NE_STATUS is null and P_STATUS = 'IS NULL');
除了戈登的,你也可以试试:
SELECT * FROM ubr_structure_details
WHERE COALESCE(NE_STATUS, 'IS NULL') = COALESCE(P_STATUS, n'IS NULL');
非常确定这会破坏NE_STATUS
tho上的任何索引。如果是这样,并且假设您无法修复Gordon推荐的体系结构,那么您可以添加一个基于函数的索引来匹配新的过滤器。我真的远不是PL/SQL专家,但是……使用单个NULL
as语句有什么目的lish?@lvaroGonzález:它会给我NULL值的状态@lvaroGonzález none。这可能是以前一个空块的遗留。VVv,你是想说PÁu status为NULL,因此查询不能按预期工作吗?如果是这样,NULL与等号一起使用时确实有一种特殊的行为,所以我鼓励你阅读 on@Sebas:是的,我想检查P_status=null,但它不是那样工作的。所以我需要使用IS null来检查它编辑你的问题,并提供样本数据和期望的结果。Flash Gordon,无处不在!:Dits不适合我,从前端我将挂起作为IS null
@vvv作为字符串传递???@Sebas是的,你能提出任何建议吗另一种方法是很好的,这澄清了问题。检查我帖子上的更新。但你需要认真地重新考虑你的架构。你越是等待重构,问题就会越多。它会做什么?将错误作为错误(192105):PL/SQL:ORA-12704:字符集不匹配
好的,看起来我们需要一些转换,尝试更新的代码仍然得到相同的错误错误(192,71):PL/SQL:ORA-12704:字符集不匹配
NEU状态的数据类型是什么?