2016-03-21 46 views
0

我已經編寫了一個更新表的存儲過程。 但我想考慮一個或多個參數是NULL的地方。 在這種情況下,我不想更新列,我想保留原有值。PL SQL - 如果參數不爲NULL,則存儲過程更新列

我試着使用:

UPDATE 
     VS_USER_T 
    SET 
     USR_FIRST_NAME = ISNULL(p_NewUsrFName, @p_NewUsrFName) 
    WHERE 
     USR_ID = lv_Num_UsrId; 

,但我得到的 '@',我使用的Oracle 12c中的錯誤。

這是過程調用

PROCEDURE UpdateUser 
    (p_UserId    IN   VS_USER_T.USR_ID%TYPE, 
     p_NewUsrFName  IN   VS_USER_T.USR_FIRST_NAME%TYPE, 
     p_NewUsrLName  IN   VS_USER_T.USR_LAST_NAME%TYPE, 
     p_NewUsrname   IN   VS_USER_T.USR_LOGIN%TYPE) 

請告知我的UPDATE語句應該怎麼樣子,當「p_NewUsrname」可以爲空,在這種情況下,我想離開現有的值是。

在此先感謝。

+0

請更新您的代碼,以便我們更好地瞭解您的SP是什麼樣的。 –

+0

您是否將參數設置爲可選項? –

+0

在Oracle手冊中,您是否找到了用'@'前綴變量的語法? –

回答

1

要保持現有的價值,你需要參考現有的列值:

USR_FIRST_NAME = ISNULL(p_NewUsrFName, USER_FIRST_NAME) 

或者你可以使用:

USR_FIRST_NAME = CASE WHEN p_NewUsrFName is null THEN USER_FIRST_NAME ELSE NewUsrFName END 
+0

Oracle沒有'ISNULL'函數:'ORA-00904:「ISNULL」:無效標識符。請參閱[@Niall answer](http://stackoverflow.com/a/36175914/1509264),瞭解執行相同操作的一些Oracle函數。 – MT0

+0

您可以使用'NVL()'或使用更詳細但通用的'CASE WHEN ... THEN..ELSE ... END'結構 – rpy

0

您可以使用解碼語句,例如

update my_table t 
set username = decode(p_NewUsrname, NULL, t.username, p_NewUsrname) 
where t.id = p_UserId; 
3

ISNULL()還不是一個標準的Oracle功能(至少在你說你正在使用的Oracle 12c版本中)。如果當然可以編寫一個名爲ISNULL()的PL/SQL函數並使用它。

對於標準的Oracle 12c安裝,請嘗試使用NVL或COALESCE。

USR_FIRST_NAME = NVL(p_NewUsrFName, USR_FIRST_NAME) 
    or 
USR_FIRST_NAME = COALESCE(p_NewUsrFName, USR_FIRST_NAME)