【发布时间】:2013-07-26 10:25:28
【问题描述】:
正如问题 - 当更新完全省略触发器中引用的列时,:new 将采用什么值?
我正在尝试调试一个存储过程,它在更新时触发一个触发器,该触发器使用一个接受 :new 字段和 DATE 值的函数。但是,我正在运行的更新不会更新引用的列。
触发器会使用存储在运行更新的表中的值吗?还是会从其他地方拿走它?
【问题讨论】:
-
您认为数据库还能从哪里获得价值?
-
我对 PL/SQL 很陌生,所以我希望会发生任何事情 :) 在 Oracle 中并非一切都遵循简单的逻辑,昨天我很挣扎,因为在日期列上调用 TO_DATE 会产生相当令人惊讶的结果: )
-
嗯,你不应该期待“任何东西”。 Oracle 数据库事务是完全可预测的,即使使用触发器也是如此。稍后你会遇到“mutating table”异常,当我们编写一个 Oracle 无法预测结果的愚蠢触发器时会发生这种情况。
-
至于您的日期问题,这只是表明您使用的是非常旧的数据库版本。过去,当我们将 TO_DATE 应用于具有 DATE 数据类型的列或变量时,Oracle 会遇到这种情况。这是可以理解的,因为 TO_DATE() 显然需要一个字符串参数。然而,最终 Oracle 重载了该函数是一种常见的咆哮,因此在 11g(我认为是 10g)中,我们可以运行
select to_date(sysdate) from dual而不会出错。不会阻止这是一件愚蠢的事情。 -
我可以在日期上运行 to_date,问题是它会产生乱码(通常类似于“0013-01-01”)。至于使用它的原因,我正在用它截断时间戳,当我认为这是一种愚蠢的做法时:)好吧,我为忘记使用 trunc() 付出了代价:)