存储过程如下所示。
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 := null;调用过程
发布于 2013-12-21 11:26:10
NULL不等于NULL。因此,当您传入NULL并仅使用相等条件进行查询时,您无法获得匹配。所以我假设你得到了一个没有找到数据的异常(附注:不是说你得到了“一个错误”,而是明确地说你得到了什么错误)。
您必须显式地处理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是某个永远不会出现在数据中的值。但这依赖于选择一个好的标记值,并且可能会影响索引对查询的有效性。
请注意,如果您的表包含多个具有ID1VAL的NULL值的行,则此查询将引发太多的行。
发布于 2013-12-21 11:28:08
NULL不等于NULL,但是您可以使用nvl函数来修复您的相等,如下所示
WHERE nvl(id1val, 'na')=nvl(id1, 'na')发布于 2013-12-21 16:41:34
比较一个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;
/https://stackoverflow.com/questions/20715041
复制相似问题