For me, a compound trigger worked. In this compound trigger, I removed the UPDATE
statement from BEFORE EACH ROW
segment and put it into AFTER STATEMENT
segment and it worked. I used a collection to hold the necessary values.
Here is the trigger:
CREATE OR REPLACE TRIGGER SCMA.TRANSACTION_COMPOUND
FOR INSERT OR UPDATE ON SCMA.XX
COMPOUND TRIGGER
-- DECLARE GLOBAL VARIABLES THAT WOULD BE USED ACROSS
-- THE DIFFERENT EVENTS.
TYPE rec_chg_br IS RECORD (
xx_id XX.xx_id%TYPE,
branch_id jbs_branch.branch_id%TYPE
);
TYPE t_chg_br IS TABLE OF rec_chg_br
INDEX BY PLS_INTEGER;
chg_branch t_chg_br;
BEFORE EACH ROW IS
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
chg_branch(:new.xx_id).xx_id := :new.xx_id;
chg_branch(:new.xx_id).currency_id := :new.currency_id;
chg_branch(:new.xx_id).branch_id := :new.branch_id;
END IF;
END IF;
...
... -- Other PL/SQL statements that do some necessary
... -- computation and do not use any SQL.
...
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
-- NULL; -- Do something here.
FORALL i IN chg_branch.FIRST..chg_branch.LAST
UPDATE YY
SET BRANCH_ID = chg_branch(i).branch_id,
CURRENCY_ID = chg_branch(i).currency_id
WHERE xx_id = chg_branch(i).xx_id;
END AFTER STATEMENT;
END TRANSACTION_COMPOUND;
/
No change was necessary in trigger YY_RBIU
.