【发布时间】:2021-05-06 13:54:17
【问题描述】:
假设我有这样的触发器规范:
create table "t" (
"i" number(10)
);
create or replace trigger "trg"
before insert on "t"
referencing new as "n"
for each row
begin
null;
end;
如何从正文中引用"n" 标识符?这些都不起作用:
"n"."i" := 2;
:"n"."i" := 2;
":n"."i" := 2;
:n."i" := 2;
所有这些尝试都会编译,但在尝试插入表时会产生此错误:
ORA-04098: 触发器“TEST.trg”无效且重新验证失败
显然,我可以避免引用变量名,但 1) 这是关于从工具生成代码的问题,无论引用如何,它都必须正确获取此语法,以及 2) 我对正确的语法很好奇。
绑定变量
在CREATE TRIGGER docs 中,有一个参考(重点是我的):
在简单触发器的 trigger_body 或复合触发器的 tps_body 中,关联名称是 绑定变量的占位符。
似乎绑定变量一般不支持引用,例如虽然这有效:
BEGIN
EXECUTE IMMEDIATE 'BEGIN dbms_output.put_line(:x); END;' USING 'a';
END;
这个或任何类似的语法不会:
BEGIN
EXECUTE IMMEDIATE 'BEGIN dbms_output.put_line(:"x"); END;' USING 'a';
END;
所以,这似乎是一致的,但我仍然对为什么我可以这样声明名称但似乎无法引用它的规范感到好奇。
数据库版本为 Oracle Database 18c Express Edition Release 18.0.0.0.0
【问题讨论】:
-
这能回答你的问题吗? Change inserted value with trigger
-
不是重复的。这是一个关于声明替代默认引用名称的语法的问题。
-
@Serg:没有
-
注意:在我的测试中,每当代码尝试使用
"作为参考时,触发器编译失败。