【问题标题】:How to Fix "NEW or OLD references not allowed "?如何修复“不允许新或旧引用”?
【发布时间】:2019-06-04 01:43:32
【问题描述】:

我正在尝试在触发器中使用 new 和 old 作为引用,但我不知道如何解决我的问题。

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 - “表级触发器中不允许新或旧引用”
    *原因:触发器正在访问表触发器中的“新”或“旧”值。
    *操作:删除任何新的或旧的引用。

【问题讨论】:

    标签: oracle plsql database-trigger


    【解决方案1】:

    您正在创建一个无法访问单个行的语句级触发器。

    你显然想要一个行级触发器,所以你需要这样声明它:

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

    【讨论】:

    • declare 块引用 COMMANDE 中的游标,这是拥有触发器的表。所以将触发器转换为 FOR EACH ROW 会导致变异表问题。
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2021-05-06
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多