PLSQL 中的触发器
Trigger in PLSQL
为什么会出现此错误?
问题)写一个触发器来限制插入佣金超过工资
prog,
SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER EMP2_TR
BEFORE INSERT ON EMP2
FOR EACH ROW WHEN (NEW.COMM > NEW.SAL)
BEGIN
Raise_Application_Error (-20100, 'COMMISION MUST NOT BE GREATER THEN SALARY');
END;
/
错误,
SQL> INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000);
INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000)
*
ERROR at line 1:
ORA-20100: COMMISION MUST NOT BE GREATER THEN SALARY
ORA-06512: at "AYUSH.EMP2_TR", line 2
ORA-04088: error during execution of trigger 'AYUSH.EMP2_TR'
table,
SQL> DESC EMP2
Name Null? Type
----------------------------------------- -------- -------------------------
EMP_NO NUMBER(3)
NAME VARCHAR2(10)
SAL NUMBER(10,3)
COMM NUMBER(10,2)
问题是:你为什么要用触发器来做这个?
你应该在约束下这样做:
alter table emp2 add constraint chk_emp2_comm_sal check (comm <= sal);
您的插入未指定值的顺序,因此使用 table 中列的顺序。 sal
列很可能是在 comm
列之前定义的。
您需要列出插入语句中的列:
insert into emp2
(empid, name, comm, sal)
values
(101,'RAMAN',100,1000);
让Oracle知道哪个值属于哪个列。
无论如何,这是很好的编码习惯
为什么会出现此错误?
问题)写一个触发器来限制插入佣金超过工资
prog,
SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER EMP2_TR
BEFORE INSERT ON EMP2
FOR EACH ROW WHEN (NEW.COMM > NEW.SAL)
BEGIN
Raise_Application_Error (-20100, 'COMMISION MUST NOT BE GREATER THEN SALARY');
END;
/
错误,
SQL> INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000);
INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000)
*
ERROR at line 1:
ORA-20100: COMMISION MUST NOT BE GREATER THEN SALARY
ORA-06512: at "AYUSH.EMP2_TR", line 2
ORA-04088: error during execution of trigger 'AYUSH.EMP2_TR'
table,
SQL> DESC EMP2
Name Null? Type
----------------------------------------- -------- -------------------------
EMP_NO NUMBER(3)
NAME VARCHAR2(10)
SAL NUMBER(10,3)
COMM NUMBER(10,2)
问题是:你为什么要用触发器来做这个?
你应该在约束下这样做:
alter table emp2 add constraint chk_emp2_comm_sal check (comm <= sal);
您的插入未指定值的顺序,因此使用 table 中列的顺序。 sal
列很可能是在 comm
列之前定义的。
您需要列出插入语句中的列:
insert into emp2
(empid, name, comm, sal)
values
(101,'RAMAN',100,1000);
让Oracle知道哪个值属于哪个列。
无论如何,这是很好的编码习惯