To react action in each row, you need to use row-level triggers.

The following trigger implements a rule: A manager may not receive a commission that exceeds his or her salary.

This rule is about the data in each row, so it should be implemented as row-level trigger.

In row-level triggers is that you can use :OLD and :NEW prefixes on each column of the table to reference the original and modified values.


SQL> drop table emp;

Table dropped.--   w w  w  . j  ava  2 s  . c o m

Elapsed: 00:00:00.02
SQL> create table emp(
  2    empno    number(4,0),
  3    ename    varchar2(10),
  4    job      varchar2(9),
  5    mgr      number(4,0),
  6    hiredate date,
  7    sal      number(7,2),
  8    comm     number(7,2),
  9    deptno   number(2,0)
 10  );

Table created.
SQL> insert into emp values(7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981','dd-mm-yyyy'), 5000, null, 10);
SQL> insert into emp values(7698, 'BLAKE', 'MANAGER', 7839,to_date('1-5-1981','dd-mm-yyyy'), 2850, null, 30);
SQL> create or replace trigger emp_biu
  2    before insert or update
  3    on emp
  4    referencing new as new old as old
  5    for each row
  6  begin
  7        if  :new.job = 'MANAGER'
  8        and nvl(:new.sal,0)<nvl(:new.comm,0) then
  9             raise_application_error (-20999,'Managers should
 10                 not have commissions higher then salary!');
 11        end if;
 12  end;
 13  /

Related Topic