我想创建一个存储过程,该存储过程可以灵活地处理表的多个列的更新,但是可能会或可能不会提供所有或部分值。
例如:
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;
显然不对,只是给你一些伪代码来描绘我的想法。
我现在能想到的唯一方法是检查每个变量,并为每个感觉非常蹩脚的列运行单独的更新语句。
答案 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
)
根据您的具体要求尝试查询。希望这会有所帮助。