【问题标题】: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;
调用过程
请让我知道我需要进行哪些更改?
【问题讨论】:
标签:
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;
/