Oracle SQL Trigger部分无效

时间:2015-11-26 21:05:59

标签: sql database oracle triggers

我正在为作业编写数据库脚本。我有一个触发器,我想从Employees表的更新创建就业历史。它适用于更改工资,但在更改job_title时不适用于具有不同值的null

create or replace trigger employment_update
after update on employees for each row
begin 
if :old.salary <> :new.salary then
insert into employment_history values (empl_hist_seq.nextval,sysdate,'zmiana_wynagrodzenia',:new.employee_id);
end if;
if :new.job_title = null then
insert into employment_history values (empl_hist_seq.nextval,sysdate,'zwolnienie',:new.employee_id);
elsif :old.job_title <> :new.job_title then
insert into employment_history values (empl_hist_seq.nextval,sysdate,'zmiana_stanowiska',:new.employee_id);
end if;
end;
/

测试:

update employees set job_title = null where employee_id = 2;
update employees set job_title = 'test' where employee_id = 2;
update employees set salary = 1500 where employee_id = 4;
select * from EMPLOYMENT_HISTORY;
show errors;
................................................................................

1 row updated.
1 row updated.
1 row updated.

HISTORY_ID CHANGE_DATE CHANGE_TYPE                      EMPLOYEE_ID
---------- ----------- -------------------------------- -----------
     0 15/11/26    zatrudnienie                               0
     1 15/11/26    zatrudnienie                               1
     2 15/11/26    zatrudnienie                               2
     3 15/11/26    zatrudnienie                               3
     4 15/11/26    zatrudnienie                               4
     5 15/11/26    zatrudnienie                               5
     6 15/11/26    zatrudnienie                               6
     7 15/11/26    zatrudnienie                               7
     8 15/11/26    zatrudnienie                               8
     9 15/11/26    zatrudnienie                               9
    10 15/11/26    zmiana_wynagrodzenia                       4

11 rows selected 

No errors.

表格:

员工

create table employees
(
employee_id number(5) primary key,
first_name varchar2(16) not null,
last_name varchar2(32) not null,
job_title varchar2(32),
salary  number(8,2),
address_id number(5) references addresses(address_id) not null
);

就业_历史+序列

 create sequence empl_hist_seq
increment by 1
minvalue 0
maxvalue 99999
nocycle
nocache;

create table employment_history
(
history_id number(5) primary key,
change_date date not null,
change_type varchar2(32) not null,
employee_id number(3) references employees(employee_id) not null
);

1 个答案:

答案 0 :(得分:0)

有一个明显的错误:

if :new.job_title = null then

您不能使用= null使用is null

if :new.job_title is null then