Триггер для ORACLE
От: FedorK  
Дата: 23.12.02 09:03
Оценка:
Подскажите как в триггере обратиться к мутируемой таблице если это таки необходимо?

Нужен только SELECT.

Спасибо
Re: Триггер для ORACLE
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 23.12.02 09:55
Оценка: 2 (1)
Здравствуйте, FedorK, Вы писали:

FK>Подскажите как в триггере обратиться к мутируемой таблице если это таки необходимо?


FK>Нужен только SELECT.


На строчном собираешь идентификаторы.(в PL/SQL коллекцию.)
на операторном по ним обращаешься к таблице. и чистишь PL/SQL

Вот шаблон пакета:

CREATE OR REPLACE PACKAGE PkgSuccessor%_T_% AS
   procedure Bind;
   procedure Add(v_id in integer);
   procedure Clear;
   procedure Cure;
END PkgSuccessor%_T_%;
/
CREATE OR REPLACE PACKAGE BODY PkgSuccessor%_T_% AS
----------------------------------------------------------------------------
TYPE t_Ids IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
v_id_collection t_Ids;
v_is_execute boolean;
----------------------------------------------------------------------------
procedure Add(v_id in integer) is
begin
   if v_is_execute = false and v_id is not null then
      v_id_collection(v_id_collection.count) := v_id;
   end if;
end;
----------------------------------------------------------------------------
procedure ClearCollections is
begin
   v_id_collection.delete;
end;
----------------------------------------------------------------------------
procedure Clear is
begin
   if v_is_execute = false then
      ClearCollections;
   end if;
end;
----------------------------------------------------------------------------
procedure Bind
is
   v_com_row ppa.com%rowtype;
   v_i integer;
begin
   if v_is_execute = false then
      v_is_execute := true;
      v_i := v_id_collection.first;
      while v_i is not null loop
         select * into v_com_row from com where id = v_id_collection(v_i);
         v_i := v_id_collection.Next(v_i);
      end loop;
      ClearCollections;
      v_is_execute := false;
   end if;
exception
   when others then
      ClearCollections;
      v_is_execute := false;
      raise;
end;
----------------------------------------------------------------------------
begin
   v_is_execute := false;
END PkgSuccessor%_T_%;
/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.