Tema: Re: oracle recursive trigger
Autorius: ledasl
Data: 2010-08-13 14:28:52
didelis dekui

"BigM" <mindaugask_NOSPAM@centras.lt> wrote in message 
news:i432s9$nts$1@trimpas.omnitel.net...
> va tau pilnas veikiantis sprendinys. Tobulinti galima atliekant papildomus 
> tikrinimus ir pan., bet juk reikia ir tau darbo palikti, ar ne? :)
>
> drop table sarysiai
> /
>
> create table sarysiai (id number, reverse number)
> /
>
> create or replace package sarysiai_statement is
>
> type t_tbl_sarysiai is table of sarysiai%rowtype index by binary_integer;
> tmp_sarysiai t_tbl_sarysiai;
> isvengti_rekursijos boolean := false;
> procedure chck_ins_relation(p_i in number);
>
> end sarysiai_statement;
> /
>
> create or replace package body sarysiai_statement is
>
> procedure chck_ins_relation(p_i in number) is
> v_tmp number;
> begin
> -- esam rekursijos pradzioje, tad uzdedam pozymi, kad neuzsiciklintu
> isvengti_rekursijos := true;
> begin
> select 1
> into v_tmp
> from sarysiai
> where id = tmp_sarysiai(p_i).reverse;
> raise too_many_rows;
> exception
> when no_data_found then
> null;
> when too_many_rows then
> raise_application_error(-20001, 'Jau egzistuoja atgalinis rysys!');
> end;
> if v_tmp is null then
> insert into sarysiai
> (id, reverse)
> values
> (tmp_sarysiai(p_i).reverse, tmp_sarysiai(p_i).id);
> end if;
> exception
> when others then
> raise_application_error(-20002, 'Kita klaida: ' || sqlerrm);
> end;
> end sarysiai_statement;
> /
>
> create or replace trigger sarysiai_trg_stm1
> before insert
> on sarysiai
> begin
> if not sarysiai_statement.isvengti_rekursijos then
> sarysiai_statement.tmp_sarysiai.delete;
> end if;
> end;
> /
>
> create or replace trigger sarysiai_trg_stm2
> after insert
> on sarysiai
> referencing new as new old as old
> for each row
> declare
> v_next number;
> begin
> if not sarysiai_statement.isvengti_rekursijos then
> v_next := nvl(sarysiai_statement.tmp_sarysiai.last, 0) + 1;
> sarysiai_statement.tmp_sarysiai(v_next).id := :new.id;
> sarysiai_statement.tmp_sarysiai(v_next).reverse := :new.reverse;
> end if;
> end;
> /
>
> create or replace trigger sarysiai_trg_stm3
> after insert
> on sarysiai
> begin
> if not sarysiai_statement.isvengti_rekursijos then
> for i in nvl(sarysiai_statement.tmp_sarysiai.first, 0) .. 
> nvl(sarysiai_statement.tmp_sarysiai.last,
> -1) loop
> sarysiai_statement.chck_ins_relation(i);
> end loop;
> sarysiai_statement.tmp_sarysiai.delete;
> end if;
> end;
> /
>
> insert into sarysiai values (1,2);
>
> commit;
>
> select * from sarysiai;
>
>
>
> Sekmes.
>
> "ledasl" <asai@pastas.lt> wrote in message 
> news:i42spp$fae$1@trimpas.omnitel.net...
>> jei nesunku, tai tikrai reiketu, nes kol kas toj vietoj is vietos nera 
>> kur judeti.
>