PLSQL-创建触发器抛出错误

PLSQL-创建触发器抛出错误,plsql,triggers,Plsql,Triggers,我有一个需要生成触发器的表。下面是我的代码: CREATE OR REPLACE EDITIONABLE TRIGGER "MYUSER"."REGISTRATION_TRG" BEFORE INSERT ON REGISTRATIONS FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN IF INSERTING AND :NEW.REGISTRATIONID IS

我有一个需要生成触发器的表。下面是我的代码:

CREATE OR REPLACE EDITIONABLE TRIGGER "MYUSER"."REGISTRATION_TRG" BEFORE
  INSERT ON REGISTRATIONS FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN IF INSERTING
  AND :NEW.REGISTRATIONID                              IS NULL THEN
  SELECT REGISTRATIONS_SEQ.NEXTVAL
  INTO :NEW.REGISTRATIONID
  FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
创建或替换可编辑触发器“MYUSER”。“REGISTRATION\u TRG”之前
每行注册时插入如果插入,则开始
并且:NEW.REGISTRATIONID为空
选择注册_SEQ.NEXTVAL
进入:NEW.REGISTRATIONID
来自SYS.DUAL;
如果结束;
结束列_序列;
结束;
当我运行此命令时,会出现以下错误:

Error starting at line 0 in command:
CREATE OR REPLACE EDITIONABLE TRIGGER "MYUSER"."REGISTRATIONS_TRG" BEFORE
  INSERT ON REGISTRATIONS FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN IF INSERTING
  AND :NEW.REGISTRATIONID                              IS NULL THEN
  SELECT REGISTRATIONS_SEQ.NEXTVAL
  INTO :NEW.REGISTRATIONID
  FROM SYS.DUAL
Error report:
SQL Command: CREATE OR REPLACE EDITIONABLE
Failed: Warning: execution completed with warning

Error starting at line 7 in command:
END IF
Error report:
Unknown Command

Error starting at line 8 in command:
END COLUMN_SEQUENCES
Error report:
Unknown Command

Error starting at line 9 in command:
END
Error report:
Unknown Command
命令中从第0行开始的
错误:
创建或替换可编辑触发器“MYUSER”。“REGISTRATIONS\u TRG”之前
每行注册时插入如果插入,则开始
并且:NEW.REGISTRATIONID为空
选择注册_SEQ.NEXTVAL
进入:NEW.REGISTRATIONID
来自SYS.DUAL
错误报告:
SQL命令:创建或替换可编辑的
失败:警告:执行已完成,但有警告
从命令中的第7行开始出错:
如果结束
错误报告:
未知命令
从命令中的第8行开始出错:
结束列顺序
错误报告:
未知命令
从命令中的第9行开始出错:
结束
错误报告:
未知命令
我做错了什么


谢谢

首先,它在SQL*Plus和PL/SQL Developer中对我有效:

create table registrations(registrationid integer);

create sequence registrations_seq;

CREATE OR REPLACE EDITIONABLE TRIGGER "REGISTRATION_TRG" BEFORE
  INSERT ON REGISTRATIONS FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN IF INSERTING
  AND :NEW.REGISTRATIONID                              IS NULL THEN
  SELECT REGISTRATIONS_SEQ.NEXTVAL
  INTO :NEW.REGISTRATIONID
  FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
/
那么

  • 如果它是唯一的块,则不需要命名块
  • 这是一个插入触发器,因此如果插入,则无需测试
  • 在同一列中同时允许生成值和用户输入值会导致灾难,但如果必须这样做,则可以在触发器规范中将其定义为
    when
    条件
  • PL/SQL语言有一个赋值运算符
    :=
    ,因此不需要查询来为变量赋值
  • 那么,为什么不简单地:

    create or replace trigger registration_trg
        before insert on registrations
        for each row
        when (new.registrationid is null)
    begin
        :new.registrationid := registrations_seq.nextval;
    end;
    
    更简单地说,从Oracle 12.1开始,您甚至不需要触发器:

    drop table registrations;
    
    create table registrations (id integer generated always as identity);
    
    insert into registrations values (default);
    
    select * from registrations;
    
            ID
    ----------
             1
    

    您使用什么工具来运行此操作?这对我有用。不过,你可以考虑把它整齐地放在可读性上。此外,在这样一个简单的触发器中不需要命名块。这是一个
    insert
    触发器,因此如果插入
    ,则无需测试
    。您甚至不需要从dual选择
    ,因为PL/SQL具有方便的
    :=
    赋值运算符。在12c中,您只需要一个标识列,而没有触发器。
    drop table registrations;
    
    create table registrations (id integer generated always as identity);
    
    insert into registrations values (default);
    
    select * from registrations;
    
            ID
    ----------
             1