Tema: Re: oracle recursive trigger
Autorius: BigM
Data: 2010-08-13 12:22:18
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.

3Dastronomyagricultureaudioautosautos.audiautos.audioautos.binariesautos.bmwautos.clubautos.fordautos.hondacrxautos.japanautos.mercedesautos.opelautos.sportautos.volvoautos.vwaviaavia.binariesbankcardsbinariesbooksbuildingcinemacommercecomp.hardwarecomp.softwarecomp.lietuvinimascomp.networksculturedarbas.ieskaudarbas.siulaudesigneconomicselectronicsfaunafauna.aquafauna.binariesfishingflorafotofoto.binariesgamesgames.csgames.onlinegsmgurmanaihumourhumour.binariesinternetlawmicrosoftmotomusicmusic.binariesmusic.instrumentsmusic.LT.binariesnavigacijaphppoliticsprogrammingrpgsportstudyingsveikatatalktesttranslationtransportationtraveltravel.binariestvunixvideovideo.binarieswatersportswwwwww.flashpdaautos.supermama.ltmobiledarbasretro.3Dretro.agricultureretro.astronomyretro.audioretro.autosretro.autos.audiretro.autos.audioretro.autos.binariesretro.autos.bmwretro.autos.clubretro.autos.fordretro.autos.hondacrxretro.autos.japanretro.autos.mercedesretro.autos.opelretro.autos.sportretro.autos.supermamaretro.autos.supermama.ltretro.autos.volvoretro.autos.vwretro.aviaretro.avia.binariesretro.bankcardsretro.beosretro.binariesretro.booksretro.buildingretro.cinemaretro.commerceretro.compretro.comp.hardwareretro.comp.lietuvinimasretro.comp.networksretro.comp.softwareretro.cultureretro.darbasretro.darbas.ieskauretro.darbas.siulauretro.designretro.economicsretro.electronicsretro.e-vejasretro.faunaretro.fauna.aquaretro.fauna.binariesretro.fishingretro.floraretro.fotoretro.foto.binariesretro.gamesretro.games.csretro.games.onlineretro.games.rpgretro.genealogijaretro.gsmretro.gurmanairetro.humourretro.humour.binariesretro.internetretro.YZFretro.YZF.nebukretro.YZF.nebuk.netikintisretro.YZF.nebuk.netikintis.bukretro.YZF.nebuk.netikintis.buk.tikintisretro.lawretro.microsoftretro.mobileretro.motoretro.musicretro.music.binariesretro.music.instrumentsretro.music.LTretro.music.LT.binariesretro.navigacijaretro.newsretro.news.taisyklesretro.newuserretro.pdaretro.phpretro.politicsretro.programmingretro.rpgretro.sportretro.studyingretro.sveikataretro.talkretro.translationretro.transportationretro.travelretro.travel.binariesretro.tvretro.unixretro.videoretro.video.binariesretro.watersportsretro.wwwretro.www.flashdiylt.rkm.news.announcelt.rkm.news.newuser