首页 文章

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

提问于
浏览
0

我收到此错误:“ ORA-04091: table FASHIONRETAILER.Payslips is mutating, trigger/function may not see it ”在尝试更新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

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

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

  • 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
                     );
    
  • 1

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

相关问题