我想编写一个Oracle存储过程来更新数据库中的表,其中有一种方法可以给程序提供(或不给出)columname参数意味着“不要更新此列”。
与不完全相同update tablename set columnname = nvl(p_columnname, columnname), ... where key = p_key
如果这样做,则无法使列无效。我希望能够使列无效。如果Oracle支持无类型关键字UNKNOWN,我可以说p_columname varchar2:= UNKNOWN,并测试是否在自定义函数中省略了参数。但是没有它,它会产生毛茸茸的定义魔术值,意思是“不更新那个列”,每个数据类型一个,这样我就不会在比较不兼容的数据类型时出错。
这看起来像是一个常见的问题(一个存储过程来处理对表的所有更新,而不需要对未更改的列进行先读后读操作)。当然有人找到了处理它的最佳做法。无论如何都希望如此。提前致谢。
答案 0 :(得分:1)
在一方面提供完美聚焦的更新与另一方面更新所有内容的易于开发之间存在着平衡。它们都会对性能产生负面影响。
当您更新每个列时,显然会增加重做,增加撤消,重做日志上的更高负载,更长时间等待日志文件同步,多余外键值检查的可能性等开销。性能不佳通常等于时间丢失由开发人员进行故障排除和重新开发。
然而另一方面,如果每次更新都完全集中在一起,那么您可能现在拥有五个,十个,二十个等等,而不是共享池中的一个更新语句 - 但是可以进行多种更改组合。这本身就是一件坏事,可能导致硬解析的增加,以及后来在故障排除中丢失的时间。
中间层可能是尝试识别更常见的更新类型(例如,更改电话号码,更新订单状态等)并为这些更新提供专用更新,并将其余的(希望是少数人)发送给一般更新。
要特别小心,您可以考虑记录每次使用常规更新的第60次,以确切了解正在发生的变化,并尝试通过检查来了解任何意外的常见组合(或使用错误更新API的开发人员):
extract(second from systimestamp) < 1
......或其他什么。
答案 1 :(得分:0)
如果要有条件地设置列,可以使用case语句:
update table
set column = case
when <your condition here> then
column
else
parameter
end
当您的&#34;无更新条件&#34;时,这会将列设置为自身(即不更新)。满足了。您需要确定识别此标识所需的参数。相对于nvl,它提供的优势是允许您在需要时将列设置为null。