PL SQL - 如果参数不为NULL,则存储过程更新列

时间:2016-03-21 14:34:20

标签: oracle stored-procedures plsql

我已经编写了一个更新表的存储过程。 但我想考虑一个或多个参数为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,在这种情况下,我想保留现有值。

提前致谢。

3 个答案:

答案 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;