Plsql PL/SQL无法运行

Plsql PL/SQL无法运行,plsql,Plsql,我目前正在尝试实现一个行触发器,当插入到表中的新员工编号不连续时触发该触发器 在与员工编号的关系中,“连续”表示插入的第一条记录的员工编号为1,第二条记录的员工编号为2,并且每个下一个职位的编号必须大于上一个职位的编号 我已经成功地创建了触发器,但是当我插入了一个新记录,该记录的员工编号不是连续的,我的触发器不会被触发 我不确定我哪里出错了,希望我能得到一些解释和更正我的代码 CREATE OR REPLACE TRIGGER CONTENUM AFTER INSERT ON TRKEMPLO

我目前正在尝试实现一个行触发器,当插入到表中的新员工编号不连续时触发该触发器

在与员工编号的关系中,“连续”表示插入的第一条记录的员工编号为1,第二条记录的员工编号为2,并且每个下一个职位的编号必须大于上一个职位的编号

我已经成功地创建了触发器,但是当我插入了一个新记录,该记录的员工编号不是连续的,我的触发器不会被触发

我不确定我哪里出错了,希望我能得到一些解释和更正我的代码

CREATE OR REPLACE TRIGGER CONTENUM

AFTER INSERT ON TRKEMPLOYEE
FOR EACH ROW 

DECLARE 
continuous_value EXCEPTION;
PRAGMA exception_init(continuous_value, -20111);

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN 

IF (:NEW.E# > :OLD.E# + 1) THEN 
    RAISE_APPLICATION_ERROR (-20111,'The value of  Employee number must be continuous');

END IF;

END CONTENUM;
/
下面是我的示例TRKEMPLOYEE表的格式

 CREATE TABLE TRKEMPLOYEE(
    E#              NUMBER(12)      NOT NULL,
    NAME            VARCHAR(50)     NOT NULL,
    DOB             DATE                    ,
    ADDRESS         VARCHAR(300)    NOT NULL,
    HIREDATE        DATE            NOT NULL,
    CONSTRAINT TRKEMPLOYEE_PKEY PRIMARY KEY(E#) );
这是我的插入语句。 目前在我的表TRKEMPLOYEE中只有15行,因此我的insert语句应该触发触发器,但它没有发生

INSERT INTO TRKEMPLOYEE VALUES( 17, 'David', NULL, 'GB',sysdate );

谢谢。

首先,您在TRKEMPLOYEE上检查插入后的
,这将在插入行后执行

其次,您不能检查
:OLD.E#
,因为您没有更新,也没有使用旧值

此外,您应该完全放弃触发器,使用
序列
,让Oracle在每次添加新员工时处理自动增量值

如果要继续使用当前逻辑,可以应用的修复程序包括:

  • 将在TRKEMPLOYEE上插入后的
    更改为在TRKEMPLOYEE上插入前的
  • 逻辑应更改如下:

    CREATE OR REPLACE TRIGGER contenum BEFORE
        INSERT ON trkemployee
        FOR EACH ROW
    DECLARE
        continuous_value EXCEPTION;
        PRAGMA exception_init ( continuous_value, -20111 );
        PRAGMA autonomous_transaction;
        max_e# INTEGER;
    BEGIN
        SELECT
            nvl(MAX(e#), 0)
        INTO max_e#
        FROM
            trkemployee;
    
        IF ( :new.e# > max_e# + 1 ) THEN
            raise_application_error(-20111, 'The value of  Employee number must be continuous');
        END IF;
    END contenum;
    /
    
我不推荐这种解决方案,因为随着表的增长,它将开始变慢