【发布时间】:2013-12-30 12:57:53
【问题描述】:
当我尝试在乘客表上插入后触发触发器时,我会收到此错误。这个触发器应该调用一个过程,该过程采用新插入的值的两个参数,并基于它更新另一个表,即预订表。但是,我收到此错误:
ORA-04091: table AIRLINESYSTEM.PASSENGER is mutating, trigger/function may not see it
ORA-06512: at "AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 11 ORA-06512: at
"AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 15 ORA-06512: at
"AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1", line 3 ORA-04088: error during execution of
trigger 'AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1' (Row 3)
我在 SQL 命令行中编译并测试了该过程,它工作正常。问题似乎出在触发器上。这是触发代码:
create or replace trigger "CALCULATE_FLIGHT_PRICE_T1"
AFTER
insert on "PASSENGER"
for each row
begin
CALCULATE_FLIGHT_PRICE(:NEW.BOOKING_ID);
end;
为什么触发器没有调用过程?
【问题讨论】:
-
ORA-04091 告诉您,如果表
PASSENGERS在过程CALCULATE_FLIGHT_PRICE中,您正在修改/查询数据 - 这是非法的。 -
@haki 我更新了触发器,仍然得到同样的错误
-
@Rachcha 我发布了程序
-
@haki 说的是您正在查询与您有触发器相同的内容。因此,在您在 PASSENGER 表上插入数据后,您的触发器正在查询
SELECT dob from passenger WHERE booking_id = p_bookingid;上的 sable 表,这只是非法的数据尚未提交,您正在尝试从中获取数据。 -
@Wabbit- 这就是问题所在!您正在向
passengers表中插入一行,在该表上执行一个触发器,该触发器调用一个存储过程,该过程又从“乘客”表中调用SELECTs。SELECTing 在运行 DML 的表时是被禁止的。您不能从触发器中的任何位置以及从触发器调用的任何过程或函数对passengers表发出SELECT。