在触发器中使用立即执行来引用新变量

Posted

技术标签:

【中文标题】在触发器中使用立即执行来引用新变量【英文标题】:referencing new variable using execute immediate in trigger 【发布时间】:2016-10-06 09:51:31 【问题描述】:

我正在尝试从动态 sql 中引用我的新变量。

如果我尝试select :NEW.zh_naam into v_var from dual;,并打印出我的变量,那么一切都会完美运行。

但是当我尝试使用动态 sql 时,例如 execute immediate('select :NEW.zh_naam from dual') into v_var,我收到一条错误消息 ORA-01008: not all variables bound

有没有办法解决这个问题?

【问题讨论】:

fyi,这已经出现过:***.com/… 【参考方案1】:

execute immediate 语句不与调用者共享变量范围。 (引用语句中的 : 也表示绑定变量。)您必须将值作为绑定变量传递。

execute immediate 'select :b from dual' into v_var using :new.zh_naam;

更新:从下面的讨论来看,您似乎想要build the set of :new references dynamically。这是不可能的。相反,您可以在发布过程中动态生成整个触发器,或者启用内置的 Oracle auditing 或 Flashback Data Archive。

【讨论】:

感谢您的回答。我想我不能使 ':new.zh_naam' 变量? 你不能那样做。 :new 和 :old 是保留的关键字,并在表上发生某些事件时获取值。当你在动态查询中编写它时,这意味着你想将它用作绑定变量。 恐怕这是不可能的。您也许可以在发布过程中动态生成整个触发器,或者启用内置的 Oracle 审计或Flashback Data Archive(如果有帮助的话)。 做简单的v_var := :new.zh_naam; @WernfriedDomscheit - 同意,如果只是将:new.zh_naam 的值转换为v_var,那将是这样做的方法。不幸的是,他希望触发代码在运行时动态找出所有 :new 名称。

以上是关于在触发器中使用立即执行来引用新变量的主要内容,如果未能解决你的问题,请参考以下文章

触发器级联为啥会失败

mysql 初级篇 触发器存储过程游标

HSQLDB 触发器 - 引用新表

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

为啥 requestLocationUpdates 会在接收时立即触发?

Python-视图 触发器 事务 存储过程