Как исправить «НОВЫЕ или старые ссылки не допускаются»? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать новое и старое в качестве ссылки в моем триггере, но я не знаю, как решить мою проблему.

CREATE OR REPLACE TRIGGER verifcomglob

AFTER UPDATE OF COMETAT on COMMANDE
REFERENCING NEW AS NEW


DECLARE
  V_COMGLOB numeric;
  V_COMPROD P.PRODNUM%TYPE;
   CURSOR C_COMPROD IS
          SELECT P.PRODNUM
          FROM COMMANDE CM, COMMANDEGLOBALE CGN, PRODUIT P, CONCERNERGLOB CG, CONCERNER C
          WHERE CM.COMNUM = C.COMNUM
          AND C.PRODNUM = P.PRODNUM
          AND P.PRODNUM = CG.PRODNUM
          AND CG.COMGLOBNUM = CGN.COMGLOBNUM
          AND CGN.COMGLOBETAT = 'en constitution'
          AND CM.COMNUM=:new.COMNUM;

  CURSOR C_COMGLOB IS
          SELECT CGN.COMGLOBNUM
          FROM COMMANDE CM, COMMANDEGLOBALE CGN, PRODUIT P, CONCERNERGLOB CG, CONCERNER C
          WHERE CM.COMNUM = C.COMNUM
          AND C.PRODNUM = P.PRODNUM
          AND P.PRODNUM = CG.PRODNUM
          AND CG.COMGLOBNUM = CGN.COMGLOBNUM
          AND CGN.COMGLOBETAT = 'en constitution'
          AND P.PRODNUM=V_COMPROD
          AND CM.COMNUM=:new.COMNUM;

BEGIN
    OPEN C_COMPROD;
    LOOP
    FETCH C_COMPROD INTO V_COMPROD ;
        OPEN C_COMGLOB;
        LOOP
        FETCH C_COMGLOB INTO V_COMGLOB ;
        if(C_COMGLOB%ROWCOUNT) != 0   THEN
        UPDATE CONCERNERGLOB SET CONCERNERGLOB.qtecom = (CONCERNERGLOB.qtecom + (SELECT CONCERNER.QTECOM FROM CONCERNER, COMMANDE where COMNUM=:new.COMNUM AND PRODNUM=V_COMPROD)) WHERE CONCERNERGLOB.COMGLOBNUM=V_COMGLOB AND CONCERNERGLOB.PRODNUM=V_COMPROD;
        ELSE
        null;
        end if;
        END LOOP;

    END LOOP;

CLOSE C_COMGLOB ;
END;

Это ошибка Oracle:

  1. 00000 - «НОВЫЕ или СТАРЫЕ ссылки не допускаются в триггерах уровня таблицы»
    * Причина: триггер обращается к «новым» или «старым» значениям в триггере таблицы.
    * Действие: Удалить все новые или старые ссылки.

1 Ответ

0 голосов
/ 09 января 2019

Вы создаете триггер уровня оператора, который не имеет доступа к отдельным строкам.

Вы, очевидно, хотите триггер уровня строки, поэтому вам нужно объявить его так:

CREATE OR REPLACE TRIGGER verifcomglob
   AFTER UPDATE OF COMETAT on COMMANDE
   REFERENCING NEW AS NEW
   <b>FOR EACH ROW</b> --<< here
....
...