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.
> 

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