Oracle - 更新没有触发器的表时“表正在变异,触发器/函数可能看不到它”错误

时间:2016-10-08 12:36:06

标签: sql oracle plsql oracle-apex

我收到此错误:“ ORA-04091:表FASHIONRETAILER.Payslips正在变异,触发器/功能可能看不到它”当尝试更新Payslips表时,它没有触发器它。附上屏幕截图,证明桌面上没有触发器。以下是我的更新声明:

UPDATE "Payslips" 
SET "NETPAY" = calculate_net_pay(user_id)
WHERE "PAYSLIPSID" = (
    SELECT "Payslips"."PAYSLIPSID" FROM "Payslips" 
    WHERE "Payslips"."USERID" = user_id AND "Payslips"."Date" = (
        SELECT MAX("Payslips"."Date") FROM "Payslips" WHERE "Payslips"."USERID" = user_id 
        AND "Payslips"."NETPAY" IS NULL));

calculate_net_pay(user_id)函数和WHERE约束中的子查询正常工作。

No triggers on Payslips table

3 个答案:

答案 0 :(得分:1)

您无法在函数或触发器中查询要更新的同一个表 - 您的函数calculate_net_pay就是这样,它会尝试通过查询您尝试更新的表Payslips来计算用户的净工资。

尝试使用子查询而不是函数。

答案 1 :(得分:0)

这会解决问题并做你想做的事吗?

UPDATE "Payslips"  p
SET "NETPAY" = calculate_net_pay(p.user_id)
WHERE p."Date" = (SELECT MAX(p2."Date")
                  FROM "Payslips" p2
                  WHERE p2."USERID" = p."USERID" AND
                        p2."NETPAY" IS NULL
                 );

答案 2 :(得分:0)

您可以尝试在函数的声明部分中使用pragma autonomous_transaction 我不知道calculate_net_pay()函数究竟做了什么。因此,这可能不是您案件的最佳解决方案,但它应该有效 有关自治交易的更多信息,请参阅here