【问题标题】:Case statement in Trigger in OracleOracle触发器中的case语句
【发布时间】:2017-01-21 19:29:26
【问题描述】:

我在运行 Trigger 时遇到问题。它编译成功,没有错误,但是在尝试运行它时,它会抛出一个错误ORA-04091 table is mutating。当向表中添加新记录(ATTD_DETAILS)时,我实际上是在尝试在表中插入一行(ATTDETAIL)。 并且必须用新格式替换EADEMPID

触发器

CREATE OR REPLACE TRIGGER ATTENDANCE
AFTER INSERT ON ATTD_DETAILS
FOR EACH ROW
 DECLARE
    EMCODE VARCHAR2(50) := 'NA';
 BEGIN

      SELECT CASE
     WHEN EAD.EADEMPID LIKE 'A%' THEN
      '1V' || EADEMPID
     WHEN EAD.EADEMPID LIKE 'C%' THEN
      'LM' || EADEMPID
     WHEN EAD.EADEMPID LIKE 'S%' THEN
      'LM' || EADEMPID
      ELSE EAD.EADEMPID  
      END INTO EMCODE
    FROM ATTD_DETAILS EAD
    WHERE EAD.EADEMPID = :NEW.EADEMPID;

  IF (:NEW.EADREMARKS = 'Successful' OR :NEW.EADREMARKS = 'SUCCESSFUL') THEN
  INSERT INTO ATTDETAIL
  (CODE,
   CARDID,
   ATT_DATE,
   ATT_TIME,
   EMPID,
   PROCODE)
   VALUES
   (:NEW.EADSITECODE,
   :NEW.EADEMCARDID,
   :NEW.EADATT_DATE,
   :NEW.EADATT_TIME,
   EMCODE,
   '880');
  END IF;
  END;

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    假设您要根据刚刚插入的行向emcode 提供值,您需要检查:NEW 记录中的列。您不能从触发器表中选择(在行级触发器中)。

    认为你想要的是:

    CREATE OR REPLACE TRIGGER ATTENDANCE
    AFTER INSERT ON ATTD_DETAILS
    FOR EACH ROW
     DECLARE
        EMCODE VARCHAR2(50) := 'NA';
     BEGIN
    
         emcode := CASE
           WHEN :new.EADEMPID LIKE 'A%' THEN '1V' || :new.EADEMPID
           WHEN :new.EADEMPID LIKE 'C%' THEN 'LM' || :new.EADEMPID
           WHEN :new.EADEMPID LIKE 'S%' THEN 'LM' || :new.EADEMPID
           ELSE :new.EADEMPID
          END;
    
      IF (:NEW.EADREMARKS = 'Successful' OR :NEW.EADREMARKS = 'SUCCESSFUL') THEN
      INSERT INTO ATTDETAIL
      (CODE,
       CARDID,
       ATT_DATE,
       ATT_TIME,
       EMPID,
       PROCODE)
       VALUES
       (:NEW.EADSITECODE,
       :NEW.EADEMCARDID,
       :NEW.EADATT_DATE,
       :NEW.EADATT_TIME,
       EMCODE,
       '880');
      END IF;
    END;
    

    【讨论】:

    • 编译时出错。错误:PLS-00201:必须声明标识符 'EADEMPID' 行:9 文本:WHEN :NEW.EADEMPID LIKE 'A%' THEN '1V' || EADEMPID 错误:PL/SQL:语句被忽略 行:8 文本:emcode := CASE
    • @Sam:抱歉,忘记:new
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2011-09-15
    • 2011-06-24
    相关资源
    最近更新 更多