SQL> create table t1 (old number(1), new number(1));
表已创建。
SQL> truncate table t2;
表已截掉。 SQL> create or replace trigger tri_t2 2 before insert or update or delete on t2 3 begin 4 insert into t1 values(:old.x, :new.x); 5 end; 6 / create or replace trigger tri_t2 * ERROR 位于第 1 行: ORA-04082: NEW 或 OLD 引用不允许在表级触发器中 SQL> create or replace trigger tri_t2 2 before insert or update or delete on t2 for each row 3 begin 4 insert into t1 values(:old.x, :new.x); 5 end; 6 /
触发器已创建
SQL> insert into t2 values(1);
已创建 1 行。
SQL> select * from t1;
OLD NEW ---------- ---------- 1
SQL> update t2 set x = 2;
已更新 1 行。
SQL> select * from t1;
OLD NEW ---------- ---------- 1 1 2
SQL> delete t2;
已删除 1 行。
SQL> select * from t1;
OLD NEW ---------- ---------- 1 1 2 2
"ERROR 位于第 1 行: ORA-04082: NEW 或 OLD 引用不允许在表级触发器中"这句啥意思?不明白 (*^__^*) ……
这个俺知道 我是想问为啥创建失败了,刚又看了下,语法错误,您第一次创建时,忘记 for each row 了。谢谢啦 before insert or update or delete on t2 for each row
行级trigger才能使用old new,也就是你这样提到的for each row.表级trigger是不能使用old new的
表级触发器而不是针到行,所以NEW,OLD就没有对应的行了,所以出错.
接着再问,这种情况我测试是不会走到if语句块里去的,请问这是为什么? 难不成是null值跟非null值比较,null!=非null 这种返回值是false 才导致不进去if语句块的? 请高手指点迷津^_^ 给v_str1_no赋个值,只要不为空,就会进入if语句块 DECLARE v_str1_no VARCHAR2(10); v_str2_no VARCHAR2(10):='ss'; begin -- Call the procedure
IF(v_str2_no IS NOT NULL AND v_str2_no !=v_str1_no ) THEN
在触发器中,有时候需要使用相关表修改前/后的值,可以使用 :new 和 :old 来获取。你可以把 :new/:old 看作是相关表的一条记录,通过它们来获取到相关列的数值。它们只能用在行级触发器中。
SQL> drop table t1 purge;
表已丢弃。
SQL> create table t1 (old number(1), new number(1));
表已创建。
SQL> truncate table t2;
表已截掉。
SQL> create or replace trigger tri_t2
2 before insert or update or delete on t2
3 begin
4 insert into t1 values(:old.x, :new.x);
5 end;
6 /
create or replace trigger tri_t2
*
ERROR 位于第 1 行:
ORA-04082: NEW 或 OLD 引用不允许在表级触发器中
SQL> create or replace trigger tri_t2
2 before insert or update or delete on t2 for each row
3 begin
4 insert into t1 values(:old.x, :new.x);
5 end;
6 /
触发器已创建
SQL> insert into t2 values(1);
已创建 1 行。
SQL> select * from t1;
OLD NEW
---------- ----------
1
SQL> update t2 set x = 2;
已更新 1 行。
SQL> select * from t1;
OLD NEW
---------- ----------
1
1 2
SQL> delete t2;
已删除 1 行。
SQL> select * from t1;
OLD NEW
---------- ----------
1
1 2
2
ORA-04082: NEW 或 OLD 引用不允许在表级触发器中"这句啥意思?不明白 (*^__^*) ……
我是想问为啥创建失败了,刚又看了下,语法错误,您第一次创建时,忘记 for each row 了。谢谢啦
before insert or update or delete on t2 for each row
行级trigger才能使用old new,也就是你这样提到的for each row.表级trigger是不能使用old new的
难不成是null值跟非null值比较,null!=非null 这种返回值是false 才导致不进去if语句块的?
请高手指点迷津^_^
给v_str1_no赋个值,只要不为空,就会进入if语句块
DECLARE
v_str1_no VARCHAR2(10);
v_str2_no VARCHAR2(10):='ss';
begin
-- Call the procedure
IF(v_str2_no IS NOT NULL AND v_str2_no !=v_str1_no ) THEN
action; END IF;
end;