【问题标题】:Ora-04072: INVALID TRIGGER TYPEOra-04072: 无效的触发器类型
【发布时间】:2011-07-05 14:48:02
【问题描述】:

我正在尝试在 Oracle 11g 上执行以下 SQL 语句。我对甲骨文没有经验,我不确定为什么会失败。此查询由我们的开发人员提供给我。

我试图通过 OEM 中的 SQL 工作表执行此操作。

CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG BEFORE 
INSERT OR UPDATE ON tbl_AdminCommands FOR EACH ROW 
BEGIN 
IF inserting
AND :new.ADMINCOMMANDID IS NULL THEN
SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL;
END IF;
END;
ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE;

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    您显示的代码对我有用,但仅作为两个单独的命令:

    1)

    CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG BEFORE 
    INSERT OR UPDATE ON tbl_AdminCommands FOR EACH ROW 
    BEGIN 
    IF inserting
    AND :new.ADMINCOMMANDID IS NULL THEN
    SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL;
    END IF;
    END;
    

    2)

    ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE;
    

    尝试一次做一个。

    顺便说一句,这行:

    SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL;
    

    在11G可以简化成这样:

    :new.ADMINCOMMANDID := TBL_ADMINCOMMANDS_SEQ.nextval;
    

    其实整个触发器可以简化为:

    CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG
    BEFORE INSERT ON tbl_AdminCommands 
    FOR EACH ROW 
    WHEN (NEW.ADMINCOMMANDID IS NULL)
    BEGIN 
        :new.ADMINCOMMANDID := TBL_ADMINCOMMANDS_SEQ.nextval;
    END;
    

    【讨论】:

    • 我在 SQL*Plus 中重新运行了查询,它运行良好。我认为这是通过 OEM 特定于 SQL 工作表的东西。谢谢大家的提示!
    【解决方案2】:

    如果您使用的是 SQL*Plus,您应该在 PL/SQL 命令的最后一行单独加上一个正斜杠:

    CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG
    BEFORE INSERT OR UPDATE ON tbl_AdminCommands
    FOR EACH ROW 
    BEGIN 
      IF inserting AND :new.ADMINCOMMANDID IS NULL
      THEN
        SELECT TBL_ADMINCOMMANDS_SEQ.nextval
          INTO :new.ADMINCOMMANDID
          FROM DUAL;
      END IF;
    END;
    /
    
    ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE;
    

    另请注意,如果您的触发器使用IF inserting,您只能使用触发器BEFORE INSERT

    【讨论】:

    • 我通过 OEM 使用 SQL Worksheet。我切换到 SQL*PLUS,它们运行正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多