我写了一个SP
,它根据我从前端选择的条件给出了记录。
问题在于,无论何时我选择状态为Success
,它都能正常工作,并为我提供成功的结果。但是,当我选择Pending
IS NULL
时,它不能按要求运行。
以下是我的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;
答案 0 :(得分:0)
您需要明确NULL
值:
select *
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
(NE_STATUS is null and P_STATUS is null);
我不建议将NULL
用作“有效”值。 “待定”似乎是有效的状态;它应该存储为有效的状态值。
某些数据库支持NULL
- 安全比较(例如ANSI标准is not distinct from
。但是,Oracle尚不支持此功能。
编辑:
将p_status
作为字符串is null
传递似乎是一个非常糟糕的主意。你真的应该修复这些状态。但是你可以在逻辑中包含这个:
select *
from ubr_structure_details
where (NE_STATUS = P_STATUS) or
(NE_STATUS is null and P_STATUS = 'IS NULL');
答案 1 :(得分:0)
除了戈登之外,你也可以尝试一下:
SELECT * FROM ubr_structure_details
WHERE COALESCE(NE_STATUS, 'IS NULL') = COALESCE(P_STATUS, n'IS NULL');
非常肯定会破坏NE_STATUS
的任何索引。如果是这样,并且假设您无法修复您的架构(如Gordon推荐的那样),那么您可以添加基于函数的索引以匹配新的过滤器。