我试着寻找这个答案,但实际上找不到任何有用的东西。要么没有,要么我的搜索能力发生了变化。无论如何,这是我的情况:
我有一个案例,我有两个相同的表,Z_TEST和Z_TEST2。如果您愿意,可以在Z_TEST2中调用审计表。
两者都有2列,ID(数字)和CFIELD(CLOB)。 Z_TEST有一个触发器,它将插入或更新Z_TEST2(实际上只有CLOB字段)。
情景1:
如果我在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;
情景2:
如果我创建以下触发器,它是一个复合触发器并使用其“After each row”块,则审计表的CLOB更新为nothing,
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?我们的WHOLE框架基于场景2(复合触发器),我最近才遇到使用CLOB数据类型的需要,并且随之而来的是这个问题。
为什么差异并且我的代码遗漏了什么?
答案 0 :(得分:2)
没有时间在这个问题上徘徊,我通过使用变量来解决它。
在声明部分声明一个CLOB变量,并在BEFORE EACH ROW或AFTER EACH ROW中为其分配值:new.clob_field,并使用insert / update语句中的变量而不是:new.clob_field在触发器内解决了这个问题。
我遇到了许多与此有争议的帖子(复合触发器具体而非简单的触发器),所以我希望我花在这上面的时间可以帮助别人并节省时间。
如果有人知道原因,那么我的理智真的很有帮助:new.clob_field在每个行部分的BEFORE / AFTER中的插入/更新语句中使用时,在复合触发器中丢失了它的值。有一天,这种想法陷入我的脑海,真是太可怕了......
我也会假设这也适用于BLOB(如果这会导致问题)。
答案 1 :(得分:1)
像这样......你只需要添加更新子句
CREATE OR REPLACE TRIGGER after_row_insert
AFTER INSERT
ON Z_TEST
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
Begin
insert into Z_TEST2 values(:new.ID, :new.CFIELD);
End;