我收到此错误:“ 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约束中的子查询正常工作。
答案 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