2014-02-20 57 views
1

我有一個過程需要三個參數,然後根據這些參數查詢表。現在,其中一個可以爲null,如果是,我希望它在選擇的WHERE子句中被忽略。PL/SQL過程 - 如果爲空,則忽略參數

create or replace PROCEDURE Procedure1 
(
    COUNTRY IN VARCHAR2, MAKE IN VARCHAR2, SERIAL IN number 
) AS 

BEGIN 

DECLARE 
    CURSOR c1 IS select v.ID from vehicle v 
       where v.country = COUNTRY AND 
         v.make = MAKE AND 
         ((SERIAL IS NOT NULL AND v.serial = SERIAL) OR 1); 


BEGIN 

    FOR e_rec IN c1 LOOP 

    DBMS_OUTPUT.PUT_LINE(e_rec.id); 

    END LOOP; 

END; 
END Procedure1; 

我試過這樣的東西,但它不起作用。

+2

使用,這是相同的與列相同的參數名稱可能會導致混淆,我會這樣做。我認爲你的情況應該是這樣的:'(SERIAL IS NULL or v.serial = SERIAL)'。如果PL/SQL解析器在整個表達式中實際使用*列*串行,我不會感到驚訝。只需確保,更好地更改參數名稱。 –

+0

謝謝,它的工作原理。我會小心改變參數的名字。 –

回答

2

您可以像使用

WHERE v.country = COUNTRY AND 
         v.make = MAKE AND 
        (SERIAL IS NULL or v.serial = SERIAL) 

條件這也將工作

WHERE v.country = COUNTRY AND 
        v.make = MAKE AND 
((SERIAL IS NOT NULL AND v.Serial = SERIAL) OR SERIAL IS NULL) 
+1

這有效,但我認爲上面提供的解決方案更好:(SERIAL IS NULL或v.serial = SERIAL) –

+0

是的,我同意 – Miller

1

嘗試這一點 - 因爲@Miller提示只使用NVL函數

WHERE v.country = nvl(COUNTRY,v.country) 
AND v.make = nvl(MAKE,v.make) 
AND v.serial = nvl(SERIAL,v.serial) 
+0

它看起來很好,但當'v.serial'爲'null'時失敗,因爲' null = null'導致'未知'。 – Pylipala