Ora-04072:无效触发类型

时间:2011-07-05 14:48:02

标签: sql oracle oracle11g

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

我试图通过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;

2 个答案:

答案 0 :(得分:6)

您展示的代码适用于我,但仅作为两个单独的命令:

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;

答案 1 :(得分: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