トリガーがテーブルのエラーを変異スローOracleで別のテーブルを更新し、テーブル上のトリガを書きます。 私は行レベルブロック内の参照であるテーブルを更新しているため、回避策を見つけることができないため、エラーが発生していることがわかりますPL/SQLトリガー変異表
EDIT:このコードはPL/SQL:数値または値のエラーをスローします。テーブルのキー値が、私は変異テーブルの周りを得たようです。
create or replace TRIGGER DSPLATE_WELL_VOLUME_V3
FOR UPDATE ON DSPLATE
COMPOUND TRIGGER
TYPE t_PLATE_ID IS TABLE OF DSPLATE.PLATE_ID%TYPE;
v_PLATE_ID t_PLATE_ID;
TYPE t_NEW_AMOUNT IS TABLE OF DSPLATE.AMOUNT%TYPE;
v_NEW_AMOUNT t_NEW_AMOUNT;
BEFORE STATEMENT IS
BEGIN
v_PLATE_ID := t_PLATE_ID();
v_NEW_AMOUNT := t_NEW_AMOUNT();
END BEFORE STATEMENT;
BEFORE EACH ROW IS
BEGIN
IF :NEW.PLATE_TYPE != :OLD.PLATE_TYPE AND :NEW.PLATE_TYPE = 'Assay Plate'
AND :NEW.AMOUNT_INITIAL IS NOT NULL AND :OLD.AMOUNT_INITIAL IS NULL THEN
v_PLATE_ID(v_PLATE_ID.LAST) := :OLD.PLATE_ID;
v_NEW_AMOUNT(v_NEW_AMOUNT.LAST) := :NEW.AMOUNT_INITIAL;
END IF;
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
FOR p IN 1..v_PLATE_ID.LAST LOOP
UPDATE DSPLATE_WELL
SET AMOUNT = AMOUNT - v_NEW_AMOUNT(p)
WHERE WELL_ID IN (SELECT DSPLATE_WELL.WELL_ID
FROM DSPLATE INNER JOIN DSPLATE_WELL ON DSPLATE_WELL.PLATE_ID = DSPLATE.PLATE_ID
WHERE DSPLATE_WELL.WELL_VALUE IN (SELECT DSPLATE_WELL.WELL_VALUE
FROM DSPLATE_WELL INNER JOIN DSPLATE ON DSPLATE.PLATE_ID = DSPLATE_WELL.PLATE_ID WHERE DSPLATE.PLATE_ID = v_PLATE_ID(p))
AND DSPLATE.PLATE_TYPE = 'Cherry Pick Plate' AND DSPLATE.LOCATION_ID = 1420);
END LOOP;
END AFTER STATEMENT;
END;
私が働いていたことを書いたオリジナルのトリガは、このですが、plate_typeが「アッセイプレート」に設定されている場合、私はそれではなく、複合トリガーとして書くことにしたい、クエリがテーブルの上にそのplate_idのすべてwell_valuesを検索しますDSPLATE_WELL、well_valuesは、plate_type 'cherry pick'とWELL_VALUESが元々由来した特定のWELL_IDを持つ表DSPLATEの多くの異なるplate_idsに対応し、ボリューム量が更新されている必要があります。
create or replace TRIGGER INSERT_DSPLATE_WELL_VOLUME
AFTER UPDATE ON DSPLATE
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
BEGIN
IF :NEW.PLATE_TYPE != :OLD.PLATE_TYPE AND :NEW.PLATE_TYPE = 'Assay Plate'
AND :NEW.AMOUNT_INITIAL IS NOT NULL AND :OLD.AMOUNT_INITIAL IS NULL
THEN
UPDATE DSPLATE_WELL
SET AMOUNT = AMOUNT - :NEW.AMOUNT_INITIAL
WHERE WELL_ID IN (SELECT DSPLATE_WELL.WELL_ID
FROM DSPLATE INNER JOIN DSPLATE_WELL ON DSPLATE_WELL.PLATE_ID = DSPLATE.PLATE_ID
WHERE DSPLATE_WELL.WELL_VALUE IN (SELECT DSPLATE_WELL.WELL_VALUE
FROM DSPLATE_WELL INNER JOIN DSPLATE ON DSPLATE.PLATE_ID = DSPLATE_WELL.PLATE_ID WHERE DSPLATE.PLATE_ID = :OLD.PLATE_ID)
AND DSPLATE.PLATE_TYPE = 'Cherry Pick Plate' AND DSPLATE.LOCATION_ID = 1420);
COMMIT;
END IF;
END;
(フォーマットされていない)コードを見て、コードが何を意味するのかすぐにはわかりません。なぜあなたはそれが更新されている間にテーブルを照会する必要がありますか? –
私は私はあなたが行っている方向を見たが、これはまだ含まれているコードは私の編集 –