在触发器中使用立即执行来引用新变量
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视图,存储过程,函数,事务,触发器,以及动态执行sql