sql - Ora-04072 : INVALID TRIGGER TYPE

标签 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;

最佳答案

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

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 - Ora-04072 : INVALID TRIGGER TYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584613/

相关文章:

php - 帮我查询

sql - 使用 SQL 检查列中是否存在某种模式的最快方法

sql - 查询拉取所有表名和列名

Oracle 相当于 MySQL INSERT IGNORE?

oracle - oracle中 'enq:TM contention'等待事件的原因

mysql - 查询 table.column 不在替换另一个表的更改列中的位置

c# - 防止 SQL 注入(inject),同时让用户在查询结束时输入自己的条件

oracle - Oracle 序列存储在哪个表空间中?

sql - 在 Oracle11g 中按级别排序

sql - Oracle - 检查同一表中两列中的重复项