Plsql PL/SQL无法运行
我目前正在尝试实现一个行触发器,当插入到表中的新员工编号不连续时触发该触发器 在与员工编号的关系中,“连续”表示插入的第一条记录的员工编号为1,第二条记录的员工编号为2,并且每个下一个职位的编号必须大于上一个职位的编号 我已经成功地创建了触发器,但是当我插入了一个新记录,该记录的员工编号不是连续的,我的触发器不会被触发 我不确定我哪里出错了,希望我能得到一些解释和更正我的代码Plsql PL/SQL无法运行,plsql,Plsql,我目前正在尝试实现一个行触发器,当插入到表中的新员工编号不连续时触发该触发器 在与员工编号的关系中,“连续”表示插入的第一条记录的员工编号为1,第二条记录的员工编号为2,并且每个下一个职位的编号必须大于上一个职位的编号 我已经成功地创建了触发器,但是当我插入了一个新记录,该记录的员工编号不是连续的,我的触发器不会被触发 我不确定我哪里出错了,希望我能得到一些解释和更正我的代码 CREATE OR REPLACE TRIGGER CONTENUM AFTER INSERT ON TRKEMPLO
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;
/
我不推荐这种解决方案,因为随着表的增长,它将开始变慢