2013-12-21 61 views
0

存儲過程如下所示。ORACLE中的空處理

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 I AM GETTING run time ERROR in the SELECT statement。請注意我的表也包含NULL值。如何處理這種情況。

ID1:= null; 調用程序

請讓我知道我需要做什麼改變?

+2

你的'FROM'子句中需要一個表名。 –

+0

你應該使用'nvl'函數。 –

+0

用相同的查詢,我看到很多問題在這裏搖擺! –

回答

0

NULL不等於NULL。所以當你傳遞NULL,並且只使用一個相等條件進行查詢時,你不能得到一個匹配。所以我假設你得到一個沒有數據發現的例外(P.S.而不是說你得到了「一個錯誤」,這可能會有助於具體說明你得到的錯誤)。

您必須明確處理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值的多個行,則此查詢將引發太多行。

0

NULL不等於NULL,但你可以使用nvl功能來解決這樣的

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

你平等比較一個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; 
/