Oracle Pl SQL,以UPDATE语句为条件

时间:2014-09-05 19:24:24

标签: sql oracle plsql sql-update conditional

我想创建一个存储过程,该存储过程可以灵活地处理表的多个列的更新,但是可能会或可能不会提供所有或部分值。

例如:

UPDATE some_table
SET

IF(I_COLUMN_1 is not NULL) THEN
   COLUMN_1 = I_COLUMN_1
END IF;

IF(I_COLUMN_2 is not NULL) THEN
   COLUMN_2 = I_COLUMN_2
END IF;

WHERE
SOME_KEY = I_SOME_KEY;

显然不对,只是给你一些伪代码来描绘我的想法。

我现在能想到的唯一方法是检查每个变量,并为每个感觉非常蹩脚的列运行单独的更新语句。

3 个答案:

答案 0 :(得分:2)

我首先想到的是在执行UPDATE语句之前操作PL / SQL中的变量。这是伪代码,但是像这样:

I_COLUMN_1 [Datatype] := NVL2([Value of Incoming Parameter], [Value for Update if Not Null], NULL);
I_COLUMN_2 [Datatype] := NVL2([Value of Incoming Parameter], [Value for Update If Not Null], NULL);
UPDATE [some_table]
    SET COLUMN_1 = I_COLUMN_1, COLUMN_2 = I_COLUMN_2
    WHERE [some_key] = I_SOME_KEY;

使用NVL2(表达式,return-if-not-null,return-if-null)函数将计算表达式,如果表达式不为null则返回值,如果表达式为null,则返回第二个值。

评估输入,然后更新表格。 :)

答案 1 :(得分:2)

这是一个可以完成工作的查询命题:

UPDATE some_table
SET COLUMN_1 = NVL(I_COLUMN_1, COLUMN_1)
   ,COLUMN_2 = NVL(I_COLUMN_2, COLUMN_2)
WHERE SOME_KEY = I_SOME_KEY

我不太熟悉Oracle,但在T-SQL中,我会使用ISNULL()函数来完成这项工作,Oracle中的等效函数是NVL()函数。

希望这会有所帮助。

答案 2 :(得分:2)

尝试条件更新,条件更新为案例。

以下是示例查询

我们正在尝试根据其名称和总体经验更新员工表中的薪水。

 UPDATE Employee emp
SET emp_sal = (
  case 
    when emp.designation = 'SA' AND emp.totalExp > 5 then 5000
    when emp.designation = 'A' AND emp.totalExp > 3 then 3000
    else 15000
  end
) 

根据您的具体要求尝试查询。希望这会有所帮助。