[C/PLSQL] Appeler 1 procédure compilée en C dans un trigger
Est-il possible d'appeler des procédures compilées en C dans les triggers, en particulier sur l'événement AFTER INSERT.
Tout en sachant que dans ces procédures écrites en C, je voudrais lire et modifier la base de données dans le cadre de la session en cours (en cours dans le trigger), c'est-à-dire avant la fin de la transaction.
Car j'ai un traitement assez complexe à réaliser dans mon trigger (déjà écrit en PL/SQL) mais je souhaite qu'il soit très performant.
exemple complet de traitement (mais très simplifié) :
/* cet exemple simule une relation de cle etrangere entre table1 et table2 avec creation automatique dans table2 suite à modification dans table1 et message d'erreur si suppression interdite */
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
create table table1 ( id integer );
create table table2 ( id integer, table1_id integer );
create table table_log ( id integer, action varchar2(30), table_name varchar2(30) );
-- trigger principal --
create or replace trigger tg1 before insert or update or delete
on table1
for each row
declare
begin
if inserting then
insert into table_log ( table_name, action, id ) values ( 'table1', 'insert', :new.id ) ;
elsif updating then
insert into table_log ( table_name, action, id ) values ( 'table1', 'update', :new.id ) ; else
insert into table_log ( table_name, action, id ) values ( 'table1', 'delete', :old.id ) ;
end if ;
end ;
/
-- trigger realisant la mise a jour dans la table etrangere (insert ou delete selon les cas)
create or replace trigger tg2 after insert or update or delete
on table1
declare
err integer ;
text varchar2 ( 100 ) ;
cursor c1 is
select a.*, a.rowid
from table_log a
where a.table_name = 'table1'
order by a.rowid ;
function tester_table2(id integer) return integer
as
cursor c1 is
select table1_id
from table2
where table1_id = id ;
rec1 c1%rowtype ;
begin
open c1 ;
fetch c1 into rec1 ;
if c1%found then
return 1 ;
else
return 0 ;
end if ;
end ;
begin
/* partie a ecrire en C */
for rec1 in c1 loop
if rec1.action='delete' then
if rec1.id = 7 then
err := -20021 ;
else
delete table2 where table1_id=rec1.id ;
end if ;
elsif tester_table2(rec1.id)=0 then
insert into table2 (table1_id) values ( rec1.id ) ;
end if ;
delete table_log where rowid=rec1.rowid ;
end loop ;
/* fin de la partie a ecrire en C */
if err < 0 then
if err = -20021 then
text := 'suppression impossible dans ce cas ...' ;
end if ;
raise_application_error ( err, text ) ;
end if ;
end ; |
/* fin de l'exemple. */
Merci de votre aide