2

我想编写一个 Oracle 存储过程来更新数据库上的表,其中有一种方法可以为该过程提供(或不提供)一个 columname 参数,这意味着“不要更新此列”。这与

更新表名集
       列名 = nvl(p_columnname,列名),
       ...
其中键 = p_key

如果这样做,则不能将该列清空。我也希望能够取消该列。如果 Oracle 支持无类型关键字 UNKNOWN,我可以说 p_columname varchar2 := UNKNOWN,并测试自定义函数中参数的遗漏。但是如果没有这个,定义魔法值会变得很麻烦,这意味着“不要更新该列”,每个数据类型一个,这样我就不会在比较不兼容的数据类型时出错。

这似乎是一个常见的问题(一个存储过程来处理对表的所有更新,而不需要对未更改的列进行 read-before-write 选择)。肯定有人想出了一个最佳实践来处理它。无论如何希望如此。提前致谢。

4

2 回答 2

1

一方面提供完全集中的更新,另一方面通过更新所有内容来简化开发,这两者之间需要取得平衡。它们都可能对性能产生负面影响。

当您更新每一列时,显然会增加重做、增加撤消、重做日志负载更高、等待日志文件同步的时间更长、可能进行多余的外键值检查等方面的开销。性能不佳通常等于开发人员在故障排除和重新开发。

但是另一方面,如果每个更新都完全集中,那么您现在可能有五个、十个、二十个等,而不是共享池中的一个更新语句 - 但是可以进行多种更改组合。这本身就是一件坏事,可能会导致硬解析增加,并导致稍后在故障排除中浪费时间。

中间立场可能是尝试识别更常见的更新类型(例如,更改电话号码、更新订单状态等)并为这些更新提供专门的更新,并将其余的(希望是少数)发送到一般更新.

要格外小心,您可能会考虑记录每 60 次使用常规更新以准确查看发生了什么变化,并尝试通过检查以下内容来了解​​任何意​​外的常见组合(或开发人员使用错误的更新 API):

extract(second from systimestamp) < 1

... 或者其他的东西。

于 2013-05-28T20:04:07.640 回答
0

如果你想有条件地设置一个列,你可以使用 case 语句来做到这一点:

update table
set    column = case 
                  when <your condition here> then 
                    column
                  else 
                    parameter
                end

当满足“无更新条件”时,这会将列设置为自身(即无更新)。您需要决定需要哪些参数来识别它。与 nvl 相比,它提供的优势是允许您在需要时将列设置为 null。

于 2013-05-29T20:11:49.673 回答