我有这个触发器:
create or replace
TRIGGER Trigger_X
before INSERT ON THING
FOR EACH ROW
DECLARE
V_NEWTHING VARCHAR2(20);
BEGIN
NEW_THING('THING'||:old.CDTHING, V_NEWTHING);
UPDATE THING
SET NUMBERTHING = V_NEWTHING
WHERE :new.CDTHING = :old.CDTHING;
end;
但是这段代码不起作用 - 它在编译时没有显示错误,但它不会更新THING。
更多详细信息:在NEW_THING行,是存储过程。它返回一个V_NEWTHING,它基本上是一个插入THING的代码。但是这段代码根本没有运行,ORA会返回这个:
ORA-04092:无法在触发器中执行COMMIT ORA-06512:在“MYDATABASE.NEW_THING”,第33行 ORA-06512:在“MYDATABASE.Trigger_X”,第4行
我该如何解决这个问题?我对Oracle很新。
答案 0 :(得分:1)
您有一个行级触发器,因此您不希望对DML
表执行THING
。只需指定:new.numberting
列
new_thing( 'THING' || :old.cdthing, v_newthing );
:new.numberthing := v_newthing'
当然,假设您的UPDATE
语句的目标是修改正在插入的行中的数据。如果cdthing
不是主键,则会遇到更大的问题。