| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: SQL multiples triggers for the same table
Erwin jasinski <hexalog_at_wanadoo.fr> wrote in message news:7lii4l$qmk$1_at_wanadoo.fr...
> I tried to have 2 triggers before insert. Only the second "for each row".
That is, you have a "statement level trigger", and a "row level trigger",
They are not the same type.
The statement level trigger is always fired before the row level trigger.
> In this table, the PK can be also a FK for the same table.
> Logically, the trigger "for each row" does'nt accept SQL witch call the
> table "in mutation".
Yes, in a row level trigger, you can't reference the other rows in the same table. (But, Oracle's reference constraints can!)
> I am writting a trigger witch call Strored Procedures. But the SQL shall be
> for all the rows.
If you want to reference all rows of the table in a trigger,
you must write it in a statement level trigger.
Here is some code I written.
The object of the triggers is to calculate accumulative amount of the amount column
for the same year, deptno.
Hope this helps.
create table test (
  year integer,
  period integer,
  deptno integer,
  amount number,
  cum_amount number);
create or replace package my_pkg
as
  type section is table of integer;
  list section;
end;
/
create or replace trigger test_b
before delete or insert or update of amount on test
begin
  my_pkg.list:=my_pkg.section();
end;
/
create or replace trigger test_ar
after delete or insert or update of amount on test
for each row
declare
  found boolean:=false;
begin
  if my_pkg.list.count>0 then
    for i in my_pkg.list.first..my_pkg.list.last loop
      if deleting then
        if my_pkg.list(i)=:old.year then
          found:=true;
        end if;
      else
        if my_pkg.list(i)=:new.year then
          found:=true;
        end if;
      end if;
      update test m
        set cum_amount=(select nvl(sum(amount), 0) from test
                          where year=m.year
                            and deptno=m.deptno
                            and period<=m.period)
        where year=my_pkg.list(i);
![]()  | 
![]()  |