Bonjour,

Dans un environnement 9i,je voudrais créer un trigger qui permet d'alimenter un champs BLOB par un contenu xml après son insertion dans un champ de type XMLType pour cette raison dans ma base.

Ma table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
create table SYNCRODV.t_xml ( 
 transid number not null, 
 data blob ,
 xml_data XMLTYPE);
La fonction qui permet de transférer un champ CLOB en BLOB:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE FUNCTION SYNCRODV.c2b( c IN CLOB ) RETURN BLOB
-- typecasts CLOB to BLOB (binary conversion)
IS
pos PLS_INTEGER := 1;
buffer RAW( 32767 );
res BLOB;
lob_len PLS_INTEGER := DBMS_LOB.getLength( c );
BEGIN
DBMS_LOB.createTemporary( res, TRUE );
DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite );
LOOP
buffer := UTL_RAW.cast_to_raw( DBMS_LOB.SUBSTR( c, 16000, pos ) );
IF UTL_RAW.LENGTH( buffer ) > 0 THEN
DBMS_LOB.writeAppend( res, UTL_RAW.LENGTH( buffer ), buffer );
END IF;
pos := pos + 16000;
EXIT WHEN pos > lob_len;
END LOOP;
RETURN res; -- res is OPEN here
END c2b;
/
Le trigger qui permet d'alimenter le blob dès que le champ xml est inséré dans la même ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
CREATE TRIGGER SYNCRODV.TRIG_XML_BLOB
    after insert on SYNCRODV.t_xml
    for each row
    declare
    begin
 
      UPDATE SYNCRODV.t_xml t SET data=syncrodv.c2B(:new.xml_data.getClobVal());
    end;
Mais lorsque je simule une insertion dans ma table exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INSERT INTO SYNCRODV.t_xml (transid,xml_data) VALUES
(1,
XMLTYPE.CREATEXML('<?xml version="1.0"
encoding="ISO-8859-1"?>
<compagnie>
<comp>AC</comp>
<pilotes>
<pilote brevet="PL-3">
<nom>G. Diffis</nom>
<salaire>5000</salaire>
</pilote>
<pilote brevet="PL-4">
<nom>S. Lacombe</nom>
</pilote>
</pilotes>
<nomComp>Castanet Lines</nomComp>
</compagnie>')
);
commit;
Il me donne toujours le message suivant :
Error at line 1
ORA-04091: table SYNCRODV.T_XML en mutation, déclencheur/fonction ne peut la voir
ORA-06512: à "SYNCRODV.TRIG_XML_BLOB", ligne 4
ORA-04088: erreur lors d'exécution du déclencheur 'SYNCRODV.TRIG_XML_BLOB'
Je suis bloqué merci de votre aide.