我已经编写了一个更新表的存储过程。 但我想考虑一个或多个参数为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'可以为NULL,在这种情况下,我想保留现有值。
提前致谢。
答案 0 :(得分: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)
答案 1 :(得分:2)
要保留现有值,您需要引用现有列值:
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
答案 2 :(得分:0)
您可以使用解码语句,例如
update my_table t
set username = decode(p_NewUsrname, NULL, t.username, p_NewUsrname)
where t.id = p_UserId;