【问题标题】:Oracle triggers - what value does :new have when nothing is passed?Oracle 触发器 - 当什么都没有传递时 :new 有什么值?
【发布时间】: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() 付出了代价:)

标签: sql oracle triggers


【解决方案1】:

如果更新语句中省略了该列,则:NEW.column 值与:OLD.column 值相同。这是更新语句运行之前存储在表中的值

【讨论】:

    【解决方案2】:

    documentation is not entirely clear 与此有关,但 :NEW:OLD 表示 当前行 的版本。

    所以,:NEW.col23 表示新版本行中该列的值。如果事务没有更改该列的值,那么它将与:OLD.col23 相同。事实上,我们可以使用它在触发器中编写测试代码,以查看更新是否更改了列中的值:

    if :NEW.col23 = :OLD.col23 then
       --  value not changed
    

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多