【问题标题】:null handling in ORACLEORACLE 中的空值处理
【发布时间】:2013-12-21 03:18:30
【问题描述】:

存储过程如下。

CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 OUT NUMBER )
AS 

BEGIN
 SELECT id2val INTO ID2
 FROM 
 WHERE id1val = ID1;
END

如果我路过

如果我传递了有效值,那么我将得到输出。

ID1 := 5;

ID1 as NULL VALUE 我在 SELECT 语句中遇到运行时错误。请注意我的表也包含 NULL 值。如何处理这种情况。

ID1 := null; 调用过程

请让我知道我需要进行哪些更改?

【问题讨论】:

  • FROM 子句中需要一个表名。
  • 你应该使用nvl函数。
  • 用同样的查询,我确实看到很多问题在这里摇摆不定!

标签: sql oracle stored-procedures


【解决方案1】:

NULL 不等于 NULL。因此,当您传入NULL 并仅使用相等条件进行查询时,您将无法获得匹配。所以我假设你得到了一个 no-data-found 异常(PS,而不是说你得到“一个错误”,具体说明你得到了什么错误会很有帮助)。

你必须明确处理NULL

SELECT id2val INTO id2
FROM whatever
WHERE ( id1val = id1 OR (id1val IS NULL AND id1 IS NULL) )

另一种可能性是使用NVL( id1val, -1 ) = NVL( id1, -1 ) 之类的条件,其中-1 是您的数据中永远不会实际出现的某个值。但这取决于选择一个好的标记值,并且会影响查询中索引的有效性。

请注意,如果您的表包含多行,其中 NULL 的值为 ID1VAL,则此查询将引发太多行。

【讨论】:

    【解决方案2】:

    NULL 不等于 NULL,但您可以使用 nvl 函数来修复您的相等性

    WHERE nvl(id1val, 'na')=nvl(id1, 'na')
    

    【讨论】:

      【解决方案3】:

      比较一个NULL 值是否等于另一个值(包括另一个NULL)将始终返回false。相反,您可以比较这两个值是否相等,或者第一个值 IS NULL 和第二个值 IS NULL 是否相等。

      修改my previous answer to your last question:

      CREATE OR REPLACE PROCEDURE FIRSTPROC (
        ID1 IN  table_name.id1val%TYPE,
        ID2 OUT table_name.id2val%TYPE
      )
      AS
      BEGIN
        SELECT id2val
        INTO   ID2
        FROM   table_name
        WHERE  ( id1val = ID1 OR ( ID1 IS NULL AND id1val IS NULL ) );
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          ID2 := NULL;
        WHEN TOO_MANY_ROWS THEN
          ID2 := NULL;
      END;
      /
      

      【讨论】:

        猜你喜欢
        • 2020-03-01
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2017-06-05
        • 2014-02-09
        • 2012-05-23
        相关资源
        最近更新 更多