我有两个表 -XX
并且YY
它们的触发器在更新的情况下相互调用。
XX 上的触发器是这样的:
CREATE OR REPLACE TRIGGER SCMA.XX_RBIU
BEFORE INSERT OR UPDATE
ON SCMA.XX FOR EACH ROW
-- PL/SQL BLOCK
BEGIN
IF UPDATING THEN
-- Only update the YY row if the branch id has
-- been modified on the XX row
IF :NEW.BRANCH_ID <> :OLD.BRANCH_ID THEN
UPDATE YY TP
SET TP.BRANCH_ID = :NEW.BRANCH_ID
WHERE TP.XX_ID = :NEW.XX_ID;
END IF;
END IF;
...
... -- Other PL/SQL statements that do some necessary
... -- computation and do not use any SQL.
...
END;
/
YY上的触发器是这样的:
CREATE OR REPLACE TRIGGER SCMA.YY_RBIU
BEFORE INSERT OR UPDATE
ON SCMA.YY
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_xx_type xx.xx_type_code%TYPE;
BEGIN
select x.xx_type_code
into v_xx_type
from XX x
where x.xx_id = :new.xx_id;
...
... -- Other PL/SQL statements that do some necessary
... -- computation and do not use any SQL.
...
END;
/
我知道SELECT
触发器中的语句YY_RBIU
给出了这个错误。如何对触发器进行编码以避免它?
我试图将SELECT
语句包装YY_RBIU
在一个IF INSERTING THEN
块中,但这不适用于任何更新。SELECT
如果从触发器调用更新,如何跳过此语句XX_RBIU
?
我也尝试过PRAGMA AUTONOMOUS_TRANSACTION
,XX_RBIU
但它导致了僵局。
我也尝试参考this , this , this和this但找不到解决方案。
任何帮助深表感谢。