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状态的数据类型是什么?