IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[9i] Trigger insertion d'un XML dans BLOB


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [9i] Trigger insertion d'un XML dans BLOB
    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.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Changez votre trigger en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create or replace trigger TRIG_XML_BLOB
    before insert on t_xml
    for each row
    begin
      :new.data := c2B(:new.xml_data.getClobVal());
    end;

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    En plus de la réponse de mnitu, je me questionne sur l'intérêt de stocker un XML dans un BLOB plutôt qu'un CLOB.

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    merci mille fois mnitu le trigger marche bien ,
    pour la remarque Waldar c'est une exigence applicatif,
    on travaille sur l’interfaçage entre deux applications,la deuxième application a besoin de donnée sous forme de BLOB

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    une autre demande svp,
    la deuxième étape est que je dois transférer ces données vers une autre table dans une autre BD2 11g via le même trigger,
    donc j'ai créé un DB_link dans la première BD1 qui pointe vers BD2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE DATABASE LINK "DB2_link"
     CONNECT TO USER
     IDENTIFIED BY ****
     USING 'DB2';
    et j'ai modifié mon trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER TRIG_XML_BLOB
    before INSERT ON t_xml
    FOR each row
    begin
      :new.DATA := c2B(:new.xml_data.getClobVal());
      insert into USER.T_TESYS_IN@DB2_link (transid,data) values (:new.transid ,:new.DATA);
    end;

    lorsque je fais un insert il me donne l'erreur suivante:

    Error at line 1
    ORA-22927: le pointeur de LOB indiqué n'est pas valide
    ORA-02063: précédant line de DB2_LINK
    ORA-06512: à "SYNCRODV.TRIG_XML_BLOB", ligne 4
    ORA-04088: erreur lors d'exécution du déclencheur 'SYNCRODV.TRIG_XML_BLOB'
    merci d'avance pour votre réponse

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Lisez ce lien.

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Dans cette exemple il utilise bfile ,est ce que je suis obligé de les utilisés,
    pourtant j'ai deja mon blob charger dans le champ de la table t_xml(DB1)
    je voudrais juste le transferer dans la base DB2, pourtant si je fais l’opération manuellement sans passé par le trigger ça marche,

    sinon j'ai testé un autre truc trigger:

    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
    22
    23
    CREATE OR REPLACE TRIGGER TRIG_XML_BLOB
    before INSERT ON t_xml
    FOR each row
        declare
       Lob_loc    BLOB;
       Buffer     RAW(32767);
       Amount     Binary_integer := 32767;
     
    begin
     
         :new.DATA := SYNCRODV.c2B(:new.xml_data.getClobVal());
     
        -- On insére la ligne avec un blob vide dont on récupère le pointeur
    INSERT INTO USER.T_TESYS_IN@DB2_link (transid,DATA) VALUES (:new.transid ,empty_blob()) RETURNING data INTO Lob_loc;
     
            DBMS_LOB.OPEN (Lob_loc, DBMS_LOB.LOB_READWRITE);
       /* Append the data from the buffer to the end of the LOB: */
       DBMS_LOB.WRITEAPPEND(Lob_loc, Amount, :new.DATA);
       /* Closing the LOB is mandatory if you have opened it: */
       DBMS_LOB.CLOSE(Lob_loc);
     
        end;
    /
    mais erreur:

    ORA-22992: impossible d'utiliser les indicateurs d'emplacement LOB sélectionnés dans des tables distantes
    ORA-06512: à "SYNCRODV.TRIG_XML_BLOB", ligne 10
    ORA-04088: erreur lors d'exécution du déclencheur 'SYNCRODV.TRIG_XML_BLOB'

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    C'était pour la phrase:
    You cannot accomplish this via a trigger in real time, the data is not there.

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    pour remédier nous avons opté de stocker le ficher xml dans une colonne de type LONG (et aussi pour des contrainte d'output ERP ) , mais est ce que on peut utiliser une variable LONG dans un trigger,
    car j'ai toujours l'erreur :ORA-04093

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Oubliez le type LONG! Faite comme si il n’existe pas!

  11. #11
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    j'ai retrouvé un lien:
    https://forums.oracle.com/forums/thr...hreadID=856638
    je l'ai testé mais ça ne marche pas , il n'arrive pas à retrouver le db_link:
    pourtant je l'ai créé:
    message d'erreur:
    ORA-12546: TNS : autorisation refusée
    ORA-06512: à "T_TRG", ligne 18
    ORA-04088: erreur lors d'exécution du déclencheur 'T_TRG'
    la création du db_link:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE DATABASE LINK LOOPBACK
     USING '(description=(address=(protocol=beq)(program=/u01/app/oracle/product/9.2.0.1.0)))';
    ======
    mon $ORACLE_HOME=/u01/app/oracle/product/9.2.0.1.0

Discussions similaires

  1. [MySQL] Insertion de données xml dans bdd mysql
    Par mathcanto dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/01/2010, 10h56
  2. Réponses: 17
    Dernier message: 15/05/2006, 12h28
  3. Réponses: 4
    Dernier message: 22/12/2005, 15h30
  4. Insertion d'XML dans de l'HTML
    Par SDuh dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 02/09/2005, 21h04
  5. Insertion d'XML dans de l'HTML (autre cas)
    Par a028762 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/08/2005, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo