如何纠正 Oracle 触发器创建错误
How to rectify Oracle Trigger Creation Error
我正在尝试通过以下任务在 table 'EMP' 上创建触发器:-
当插入或更新或删除记录时,旧记录应存储在 'Empbackup' table 中,并包含操作类型和日期。
table EMP 的字段是 (empno, emp_panno, ename, job, hire_date, salary, age, city, pincode, state)。
有了这个触发块,我得到了 'Warning: Trigger created with compilation errors.'
create or replace trigger emp_trigger
after insert or delete or update on emp
for each row
enable
begin
if inserting then
insert into emp_backup values (:new.empno, :new.emp_panno, :new.ename, new.job,
:new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, :insert, :sysdate)
elseif deleting then
insert into emp_backup values(:old.empno, :old.emp_panno, :old.ename, :old.job,
:old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
:delete, :sysdate);
elseif updating then
insert into emp_backup values (:old.empno, :old.emp_panno, :old.ename, :old.job,
:old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
:update, :sysdate);
end if
end;
注意:-成功创建触发器后的更新部分
EMP table 描述:-
EMPNO 编号(8)
EMP_PANNO 数字 (10)
命名 VARCHAR2(20)
作业 VARCHAR2(15)
HIRE_DATE 日期
工资数(10)
年龄(8)
城市 VARCHAR2(25)
个人密码 (8)
状态 VARCHAR2(15)
成功创建触发器后插入语句:-
insert into emp values (027, 7896, 'sudhir', 'dev',
to_date('19/08/1999', 'dd/mm/yyyy'), 5600, 34, 'senaica',
223021, 'uttar pradesh');
错误:-
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at "SYSTEM.EMP_TRIGGER", line 3
ORA-04088: error during execution of trigger 'SYSTEM.EMP_TRIGGER'
不少错误。
- 你不能使用例如
:insert, :sysdate
;应该是 'insert', sysdate
- 语句必须以分号结束
- 是
elsif
,不是elseif
new.job
少了一个冒号
如何找出问题所在?像这样:
Warning: Trigger created with compilation errors.
SQL> show err
Errors for TRIGGER EMP_TRIGGER:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/5 PL/SQL: SQL Statement ignored
3/81 PL/SQL: ORA-00984: column not allowed here
SQL>
或者,查询USER_ERRORS
.
示例 tables(不要介意虚拟数据类型)(temp
而不是 emp
;temp_backup
而不是 emp_backup
,因为我不我不想放弃我自己的 emp
table):
SQL> CREATE TABLE temp
2 (
3 empno NUMBER,
4 emp_panno NUMBER,
5 ename NUMBER,
6 job NUMBER,
7 hire_date NUMBER,
8 salary NUMBER,
9 age NUMBER,
10 city NUMBER,
11 pincode NUMBER,
12 state NUMBER
13 );
Table created.
SQL> CREATE TABLE temp_backup
2 AS
3 SELECT * FROM temp;
Table created.
SQL>
SQL> ALTER TABLE temp_backup
2 ADD (what NUMBER, when DATE);
Table altered.
SQL>
触发器,修复错误后:
SQL> create or replace trigger emp_trigger
2 after insert or delete or update on temp
3 for each row
4 enable
5 begin
6 if inserting then
7 insert into temp_backup values (:new.empno, :new.emp_panno, :new.ename, :new.job,
8 :new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, 'insert', sysdate);
9 elsif deleting then
10 insert into temp_backup values(:old.empno, :old.emp_panno, :old.ename, :old.job,
11 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
12 'delete', sysdate);
13 elsif updating then
14 insert into temp_backup values (:old.empno, :old.emp_panno, :old.ename, :old.job,
15 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
16 'update', sysdate);
17 end if;
18 end;
19 /
Trigger created.
SQL>
虽然这不是错误,但我建议您总是 命名您使用的所有列。不只是
insert into temp_backup values ...
指定所有列:
insert into temp_values (empno, emp_panno, ename, ...) values ...
打字有点多,但从长远来看是有回报的。
[编辑] 在你发布 EMP table 描述之后:正如我所说,如果你命名所有涉及的列并注意数据类型,它 作品.
示例 tables:
SQL> CREATE TABLE temp
2 (
3 EMPNO NUMBER (8),
4 EMP_PANNO NUMBER (10),
5 ENAME VARCHAR2 (20),
6 JOB VARCHAR2 (15),
7 HIRE_DATE DATE,
8 SALARY NUMBER (10),
9 AGE NUMBER (8),
10 CITY VARCHAR2 (25),
11 PINCODE NUMBER (8),
12 STATE VARCHAR2 (15)
13 );
Table created.
SQL> CREATE TABLE temp_backup
2 AS
3 SELECT *
4 FROM temp
5 WHERE 1 = 2;
Table created.
SQL> ALTER TABLE temp_backup
2 ADD (what varchar2(10), when DATE);
Table altered.
触发器:
SQL> create or replace trigger emp_trigger
2 after insert or delete or update on temp
3 for each row
4 enable
5 begin
6 if inserting then
7 insert into temp_backup (empno, emp_panno, ename, job,
8 hire_date, salary, age, city, pincode, state, what, when) values (:new.empno, :new.emp_panno, :new.ename, :new.job,
9 :new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, 'insert', sysdate);
10 elsif deleting then
11 insert into temp_backup (empno, emp_panno, ename, job,
12 hire_date, salary, age, city, pincode, state, what, when)values(:old.empno, :old.emp_panno, :old.ename, :old.job,
13 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
14 'delete', sysdate);
15 elsif updating then
16 insert into temp_backup (empno, emp_panno, ename, job,
17 hire_date, salary, age, city, pincode, state, what, when)values (:old.empno, :old.emp_panno, :old.ename, :old.job,
18 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
19 'update', sysdate);
20 end if;
21 end;
22 /
Trigger created.
测试:
SQL> INSERT INTO temp (empno,
2 emp_panno,
3 ename,
4 job,
5 hire_date,
6 salary,
7 age,
8 city,
9 pincode,
10 state)
11 VALUES (027,
12 7896,
13 'sudhir',
14 'dev',
15 TO_DATE ('19/08/1999', 'dd/mm/yyyy'),
16 5600,
17 34,
18 'senaica',
19 223021,
20 'uttar pradesh');
1 row created.
结果:
SQL> select * from temp;
EMPNO EMP_PANNO ENAME JOB HIRE_DATE SALARY
---------- ---------- -------------------- --------------- ---------- ----------
AGE CITY PINCODE STATE
---------- ------------------------- ---------- ---------------
27 7896 sudhir dev 19/08/1999 5600
34 senaica 223021 uttar pradesh
SQL> select * from temp_backup;
EMPNO EMP_PANNO ENAME JOB HIRE_DATE SALARY
---------- ---------- -------------------- --------------- ---------- ----------
AGE CITY PINCODE STATE WHAT
---------- ------------------------- ---------- --------------- ----------
WHEN
----------
27 7896 sudhir dev 19/08/1999 5600
34 senaica 223021 uttar pradesh insert
25/06/2021
SQL>
我正在尝试通过以下任务在 table 'EMP' 上创建触发器:- 当插入或更新或删除记录时,旧记录应存储在 'Empbackup' table 中,并包含操作类型和日期。
table EMP 的字段是 (empno, emp_panno, ename, job, hire_date, salary, age, city, pincode, state)。
有了这个触发块,我得到了 'Warning: Trigger created with compilation errors.'
create or replace trigger emp_trigger
after insert or delete or update on emp
for each row
enable
begin
if inserting then
insert into emp_backup values (:new.empno, :new.emp_panno, :new.ename, new.job,
:new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, :insert, :sysdate)
elseif deleting then
insert into emp_backup values(:old.empno, :old.emp_panno, :old.ename, :old.job,
:old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
:delete, :sysdate);
elseif updating then
insert into emp_backup values (:old.empno, :old.emp_panno, :old.ename, :old.job,
:old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
:update, :sysdate);
end if
end;
注意:-成功创建触发器后的更新部分
EMP table 描述:- EMPNO 编号(8) EMP_PANNO 数字 (10) 命名 VARCHAR2(20) 作业 VARCHAR2(15) HIRE_DATE 日期 工资数(10) 年龄(8) 城市 VARCHAR2(25) 个人密码 (8) 状态 VARCHAR2(15)
成功创建触发器后插入语句:-
insert into emp values (027, 7896, 'sudhir', 'dev',
to_date('19/08/1999', 'dd/mm/yyyy'), 5600, 34, 'senaica',
223021, 'uttar pradesh');
错误:-
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at "SYSTEM.EMP_TRIGGER", line 3
ORA-04088: error during execution of trigger 'SYSTEM.EMP_TRIGGER'
不少错误。
- 你不能使用例如
:insert, :sysdate
;应该是'insert', sysdate
- 语句必须以分号结束
- 是
elsif
,不是elseif
new.job
少了一个冒号
如何找出问题所在?像这样:
Warning: Trigger created with compilation errors.
SQL> show err
Errors for TRIGGER EMP_TRIGGER:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/5 PL/SQL: SQL Statement ignored
3/81 PL/SQL: ORA-00984: column not allowed here
SQL>
或者,查询USER_ERRORS
.
示例 tables(不要介意虚拟数据类型)(temp
而不是 emp
;temp_backup
而不是 emp_backup
,因为我不我不想放弃我自己的 emp
table):
SQL> CREATE TABLE temp
2 (
3 empno NUMBER,
4 emp_panno NUMBER,
5 ename NUMBER,
6 job NUMBER,
7 hire_date NUMBER,
8 salary NUMBER,
9 age NUMBER,
10 city NUMBER,
11 pincode NUMBER,
12 state NUMBER
13 );
Table created.
SQL> CREATE TABLE temp_backup
2 AS
3 SELECT * FROM temp;
Table created.
SQL>
SQL> ALTER TABLE temp_backup
2 ADD (what NUMBER, when DATE);
Table altered.
SQL>
触发器,修复错误后:
SQL> create or replace trigger emp_trigger
2 after insert or delete or update on temp
3 for each row
4 enable
5 begin
6 if inserting then
7 insert into temp_backup values (:new.empno, :new.emp_panno, :new.ename, :new.job,
8 :new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, 'insert', sysdate);
9 elsif deleting then
10 insert into temp_backup values(:old.empno, :old.emp_panno, :old.ename, :old.job,
11 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
12 'delete', sysdate);
13 elsif updating then
14 insert into temp_backup values (:old.empno, :old.emp_panno, :old.ename, :old.job,
15 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
16 'update', sysdate);
17 end if;
18 end;
19 /
Trigger created.
SQL>
虽然这不是错误,但我建议您总是 命名您使用的所有列。不只是
insert into temp_backup values ...
指定所有列:
insert into temp_values (empno, emp_panno, ename, ...) values ...
打字有点多,但从长远来看是有回报的。
[编辑] 在你发布 EMP table 描述之后:正如我所说,如果你命名所有涉及的列并注意数据类型,它 作品.
示例 tables:
SQL> CREATE TABLE temp
2 (
3 EMPNO NUMBER (8),
4 EMP_PANNO NUMBER (10),
5 ENAME VARCHAR2 (20),
6 JOB VARCHAR2 (15),
7 HIRE_DATE DATE,
8 SALARY NUMBER (10),
9 AGE NUMBER (8),
10 CITY VARCHAR2 (25),
11 PINCODE NUMBER (8),
12 STATE VARCHAR2 (15)
13 );
Table created.
SQL> CREATE TABLE temp_backup
2 AS
3 SELECT *
4 FROM temp
5 WHERE 1 = 2;
Table created.
SQL> ALTER TABLE temp_backup
2 ADD (what varchar2(10), when DATE);
Table altered.
触发器:
SQL> create or replace trigger emp_trigger
2 after insert or delete or update on temp
3 for each row
4 enable
5 begin
6 if inserting then
7 insert into temp_backup (empno, emp_panno, ename, job,
8 hire_date, salary, age, city, pincode, state, what, when) values (:new.empno, :new.emp_panno, :new.ename, :new.job,
9 :new.hire_date, :new.salary, :new.age, :new.city, :new.pincode, :new.state, 'insert', sysdate);
10 elsif deleting then
11 insert into temp_backup (empno, emp_panno, ename, job,
12 hire_date, salary, age, city, pincode, state, what, when)values(:old.empno, :old.emp_panno, :old.ename, :old.job,
13 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
14 'delete', sysdate);
15 elsif updating then
16 insert into temp_backup (empno, emp_panno, ename, job,
17 hire_date, salary, age, city, pincode, state, what, when)values (:old.empno, :old.emp_panno, :old.ename, :old.job,
18 :old.hire_date, :old.salary, :old.age, :old.city, :old.pincode, :old.state,
19 'update', sysdate);
20 end if;
21 end;
22 /
Trigger created.
测试:
SQL> INSERT INTO temp (empno,
2 emp_panno,
3 ename,
4 job,
5 hire_date,
6 salary,
7 age,
8 city,
9 pincode,
10 state)
11 VALUES (027,
12 7896,
13 'sudhir',
14 'dev',
15 TO_DATE ('19/08/1999', 'dd/mm/yyyy'),
16 5600,
17 34,
18 'senaica',
19 223021,
20 'uttar pradesh');
1 row created.
结果:
SQL> select * from temp;
EMPNO EMP_PANNO ENAME JOB HIRE_DATE SALARY
---------- ---------- -------------------- --------------- ---------- ----------
AGE CITY PINCODE STATE
---------- ------------------------- ---------- ---------------
27 7896 sudhir dev 19/08/1999 5600
34 senaica 223021 uttar pradesh
SQL> select * from temp_backup;
EMPNO EMP_PANNO ENAME JOB HIRE_DATE SALARY
---------- ---------- -------------------- --------------- ---------- ----------
AGE CITY PINCODE STATE WHAT
---------- ------------------------- ---------- --------------- ----------
WHEN
----------
27 7896 sudhir dev 19/08/1999 5600
34 senaica 223021 uttar pradesh insert
25/06/2021
SQL>