【问题标题】:Invalid Trigger Exception无效的触发异常
【发布时间】:2017-11-14 08:28:13
【问题描述】:

我是 ORACLE SQL 的新手,我正在尝试创建一个触发器来生成 auto_incement 序列号作为我表中的主键,但不知道我犯了什么错误,因此我得到了:

执行部分保存事件时出错:错误代码=4098 ST= java.sql.BatchUpdateException: ORA-04098: 触发器 'TNTCA.STAGING_TRIGGER_ERROR_REASON' 无效且失败 重新验证\n,由 : \"ORA-04098: trigger 'TNTCA.STAGING_TRIGGER_ERROR_REASON' 无效且失败 重新验证\n\"

我的 SQL 语句是:

create global temporary table STAGING_ERROR_REASON (   STAGING_REASON_ID number(4) constraint STAGING_REASON_ID not null   ,REASON nvarchar2(1024) not null   ,constraint PK_STAGING_REASON_ID PRIMARY KEY(STAGING_REASON_ID) );

create sequence STAGING_SEQ_ERROR_REASON start with 1 increment by 1 minvalue 1 maxvalue 10000;

CREATE OR REPLACE TRIGGER "STAGING_TRIGGER_ERROR_REASON" 
   BEFORE INSERT ON STAGING_ERROR_REASON 
   REFERENCING NEW AS NEW 
   FOR EACH ROW 
BEGIN   
   if(:NEW.STAGING_REASON_ID is null) then   
      SELECT STAGING_SEQ_ERROR_REASON.NEXTVAL   
          INTO :NEW.STAGING_REASON_ID 
   END;

ALTER TRIGGER "STAGING_TRIGGER_ERROR_REASON" ENABLE;

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    你有两个错误:

    1. 您的IF 没有END IF
    2. 您的SELECT INTO 没有FROM

    但select不是必须以开头的,你可以简单地分配序列值:

    CREATE OR REPLACE TRIGGER "STAGING_TRIGGER_ERROR_REASON" 
       BEFORE INSERT ON STAGING_ERROR_REASON 
       REFERENCING NEW AS NEW 
       FOR EACH ROW 
    BEGIN   
       if :NEW.STAGING_REASON_ID is null then   
          :NEW.STAGING_REASON_ID := STAGING_SEQ_ERROR_REASON.NEXTVAL;
       END IF; --<< missing
    END;
    /
    

    不确定您运行 PL/SQL 的方式和位置,但您通常还会在 PL/SQL 块的末尾添加 need/

    【讨论】:

    • 为我工作。谢谢!
    【解决方案2】:

    在 Oracle 中,每个 SELECT 语句都应该有一个 FROM 子句。你应该至少使用

    SELECT STAGING_SEQ_ERROR_REASON.NEXTVAL INTO :NEW.STAGING_REASON_ID FROM DUAL;
    

    【讨论】:

      【解决方案3】:

      你可以使用:

      CREATE OR REPLACE TRIGGER "STAGING_TRIGGER_ERROR_REASON" 
      BEFORE INSERT ON STAGING_ERROR_REASON REFERENCING NEW 
      AS NEW FOR EACH ROW 
      BEGIN   
       if(:NEW.STAGING_REASON_ID is null) then  
       :NEW.STAGING_REASON_ID := (SELECT STAGING_SEQ_ERROR_REASON.NEXTVAL FROM dual);
       end if;
      END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 2012-04-07
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多