我试图寻找这个问题的答案,但找不到任何有用的东西。要么没有,要么我的搜索能力受到打击。无论如何,这是我的情况:
我有一个案例,我有 2 个相同的表,Z_TEST 和 Z_TEST2。如果您愿意,可以将 Z_TEST2 称为审计表。
两者都有 2 列,ID(编号)和 CFIELD(CLOB)。Z_TEST 有一个触发器,它将插入或更新 Z_TEST2(实际上只有 CLOB 字段)。
场景一:
如果我在 Z_TEST 上创建以下触发器,这是一个正常的触发器,审计表也会更新:
CREATE OR REPLACE TRIGGER Z_TEST_TRIG
AFTER INSERT OR UPDATE ON Z_TEST
FOR EACH ROW
Begin
If inserting then
Begin
insert into Z_TEST2 values(:new.ID, :new.CFIELD);
end;
end if;
if updating then
begin
update Z_TEST2 Set CFIELD = :new.CFIELD where ID = :new.id;
end;
end if;
End;
场景二:
如果我创建以下作为复合触发器的触发器并使用其“在每一行之后”块,则审计表的 CLOB 会更新为空值:
create or replace trigger Z_TEST_TRIG
FOR UPDATE OR INSERT ON Z_TEST
COMPOUND TRIGGER
AFTER EACH ROW IS
Begin
If inserting then
Begin
insert into Z_TEST2 values(:new.ID, :new.CFIELD);
end;
end if;
if updating then
begin
update Z_TEST2 Set CFIELD = :new.CFIELD where ID = :new.id;
end;
end if;
END AFTER EACH ROW;
END Z_TEST_TRIG;
有谁知道为什么这适用于场景 1,但不适用于场景 2?我们的整个框架基于场景 2(复合触发器),我最近才遇到使用 CLOB 数据类型的需求,随之而来的是这个问题。
为什么会有差异,我的代码是否遗漏了什么?