如何纠正 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 而不是 emptemp_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>