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 :

Générer un fichier xml à partir d'une table clob


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Générer un fichier xml à partir d'une table clob
    Bonjour ,

    J'ai un niveau tres tres moyen sur ORACLE.Je dois générer un document xml à partir d'une base de données , et je dispose de très peu de temps.
    j'ai créée une table XML avec du contenu xml.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE DATA_XML (
                 document xmltype )
         xmltype document store as clob;


    Dans cette table DATA_XML,j'ai stocké une ligne xml.Comment copier la ligne xml de la table vers un document xml (Mon_Fichier.xml) en SQL (ou pl-sql), et comment récupérer le fichier généré.MERCI
    En me documentant , je suis tombé sur un package XMLDOM , et j'ai essayé le pl-sql suivant.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE directory Mon_Rep AS 'C:\temp';
    DECLARE                                                                                                                
        doc  DBMS_XMLDOM.DOMDocument;                                                                                        
        xdata  XMLTYPE;                                                                                                      
     
        CURSOR xmlcur IS                                                                                                     
        SELECT * from global_referentiel_xml                                                                                                                                                                                                               
      BEGIN                                                                                                                  
        OPEN xmlcur;                                                                                                         
        FETCH xmlcur INTO xdata;                                                                                             
        CLOSE xmlcur;                                                                                                        
        doc := DBMS_XMLDOM.NewDOMDocument(xdata);                                                                            
         DBMS_XMLDOM.WRITETOFILE(doc,'Mon_Rep/referentiel.xml');                                                                   
       END;


    Voici l'erreur générée ;
    "Erreur commençant à la ligne 2 de la commande :
    CREATE OR REPLACE directory Mon_Rep AS 'C:\temp'
    Erreur à la ligne de commande : 2, colonne : 0
    Rapport d'erreur :
    Erreur SQL : ORA-01031: privilèges insuffisants
    01031. 00000 - "insufficient privileges"
    *Cause: An attempt was made to change the current username or password
    without the appropriate privilege. This error also occurs if
    attempting to install a database without the necessary operating
    system privileges.
    When Trusted Oracle is configure in DBMS MAC, this error may occur
    if the user was granted the necessary privilege at a higher label
    than the current login.
    *Action: Ask the database administrator to perform the operation or grant
    the required privileges.
    For Trusted Oracle users getting this error although granted the
    the appropriate privilege at a higher label, ask the database
    administrator to regrant the privilege at the appropriate label.

    Erreur commençant à la ligne 3 de la commande :
    DECLARE
    doc DBMS_XMLDOM.DOMDocument;
    xdata XMLTYPE;

    CURSOR xmlcur IS
    SELECT * from global_referentiel_xml
    BEGIN
    OPEN xmlcur;
    FETCH xmlcur INTO xdata;
    CLOSE xmlcur;
    doc := DBMS_XMLDOM.NewDOMDocument(xdata);
    DBMS_XMLDOM.WRITETOFILE(doc,'Mon_Rep/referentiel.xml');
    END;

    Rapport d'erreur :
    ORA-06550: Ligne 8, colonne 5 :
    PL/SQL: ORA-00933: la commande SQL ne se termine pas correctement
    ORA-06550: Ligne 6, colonne 5 :
    PL/SQL: SQL Statement ignored
    ORA-06550: Ligne 9, colonne 5 :
    PLS-00103: Symbole "FETCH" rencontré à la place d'un des symboles suivants :

    begin function pragma procedure subtype type <identificateur>
    <identificateur entre guillemets> current cursor delete
    exists prior
    Symbole "begin" a été substitué à "FETCH" pour continuer.
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action: "

  2. #2
    Membre expert
    Bonsoir,


    "insufficient privileges"
    A mon avis, tu as créé un directory, mais tu n'as pas donnée les droits de lecture / écriture sur ce directory au schema dans lequel ta procédure / ton code va s'executer ...

    @+

    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre régulier
    Bonsoir,

    Effectivement, peut être que je devrais ajouter un grant directory apres l'avoir créée.
    Du coup question : quand on créer un répertoire dans par exemple 'C:\Temp' via sqlDevelopper , il le crée en local ou bien sur la machine distante ?
    par ailleurs ,petit oubli de ";" après la déclaration du curseur dans le code pl-sql. Mais même avec ça , le pl-sql ne fonctionne pas , et je ne vois pas le problème.

    Merci de votre aide , ça devient désespérant de créer un fichier xml en pl-sql n'étant pas spécialiste Oracle

  4. #4
    Membre expert
    Bonjour,

    Ma compréhension est la suivante: "create directory" ne créé pas de répertoire physique, uniquement une entité "logique" au niveau de la base de données, sur laquelle tu devras donner des droits pour que certains schémas puissent l'utiliser.
    Cela suppose que le répertoire visé existe bel et bien d'abord.
    D'ailleurs, je viens de tester un "create directory" sur un répertoire qui n'existe pas, et Oracle ne me dit rien si ce n'est "directory created". Mais je n'ai rien qui ait été créé physiquement sur le disque, et je doute qu'il apprécie si j'essaie d'utiliser pour de vrai ce directory.
    J'espère que je ne me plante pas sur ce que je comprends de ta question.

    Maintenant, pour écrire dans un fichier, je ne connais pas DBMS_XMLDOM, perso.
    Bien souvent j'utilise UTL_FILE.

    je pense que la première étape serait que tu t'assures que tu as un directory bien valide, avec un grant read / write pour le schema qui doit l'utiliser; vérifie au moins que tu peux lire un fichier tout bête dans ce répertoire via PL/SQL, histoire de ...

    @+

    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre régulier
    Droits obtenu et repertoire logique créée
    Merci bcp pour le retour .
    Hélas je ne connais pas UTL-FILE , et je ne sais pas s'il est installé . Je vais regarder.
    Si tu as un exemple simple de son utilisation je suis preneur.
    Quoi qu'il en soit merci de t'être penché sur le sujet.

  6. #6
    Membre expert
    Bonsoir,
    Désolé de mes réponses tardives...
    Bon, je ne connaissais pas DBMS_XMLDOM, donc j'ai voulu jeter un oeil.

    J'ai fait un test très simple:
    1) Je me fais une table comme la tienne:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE DATA_XML (
                 document xmltype )
         xmltype document store as clob;

    2) J'insère un enregistrement avec un XML dedans:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    INSERT INTO DATA_XML
       VALUES(XMLType('<?xml version="1.0"?>
                        <PO pono="1">
                           <PNAME>Po_1</PNAME>
                           <CUSTNAME>John</CUSTNAME>
                           <SHIPADDR>
                              <STREET>1033, Main Street</STREET>
                              <CITY>Sunnyvalue</CITY>
                              <STATE>CA</STATE>
                           </SHIPADDR>
                        </PO>'));

    3) Dans un répertoire, je me suis fait un fichier "my_xml.xml".
    Dans Oracle, j'ai un directory "MY_DIRECTORY" qui pointe sur ce répertoire et j'ai donné les droits "read", "write" sur "MY_DIRECTORY" au schema dans lequel je fais mon test.

    4) Je fais tourner:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARE
       the_xml      XMLTYPE;
       the_docdom   DBMS_XMLDOM.DOMDocument;
    BEGIN
       SELECT document INTO the_xml FROM data_xml;
     
       the_docdom := DBMS_XMLDOM.newDOMDocument (the_xml);
     
       DBMS_XMLDOM.WRITETOFILE(the_docdom,'MY_DIRECTORY/my_xml.xml');  
     
    END;


    -> le XML est écrit dans le fichier.

    @+

    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Expert éminent sénior
    En gros un simple spool via sqlplus devrait faire l'affaire.

  8. #8
    Membre expérimenté
    • L'utilisation du package UTL_FILE nécessite l'initialisation du paramètre UTL_FILE_DIR afin d'exploiter le répertoire logique d'Oracle.

    pour ce fait; on exécute ce que se suit:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ALTER SYSTEM SET utl_file_dir='c:\temp' SCOPE=SPFILE;

    Sauf que cette instruction nous oblige le redémarrage de la base de données, selon les version de Oracle.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Create or replace directory MY_DIRECTORY  as 'c:\temp';



    • Pour des répertoires distants , ça ne fonctionne jamais car Oracle ne reconnait que les répertoires locaux.



    • En deux lignes on peut concrétiser l'idée.


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    declare
       buf           CLOB;
     
    BEGIN
     SELECT (document).getclobval() INTO buf FROM data_xml;
     
      DBMS_XSLPROCESSOR.clob2file (buf,'MY_DIRECTORY' , 'my_xml.xml');
     
    END;
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  9. #9
    Membre régulier
    re
    Merci pour ton retour .
    Le problème est résolu .

  10. #10
    Expert éminent sénior
    Citation Envoyé par islamov2000 Voir le message

    L'utilisation du package UTL_FILE nécessite l'initialisation du paramètre UTL_FILE_DIR afin d'exploiter le répertoire logique d'Oracle.
    C'était vrai "once upon a time"

    In the past, accessible directories for the UTL_FILE functions were specified in the initialization file using the UTL_FILE_DIR parameter. However, UTL_FILE_DIR access is no longer recommended. Oracle recommends that you instead use the directory object feature, which replaces UTL_FILE_DIR. Directory objects offer more flexibility and granular control to the UTL_FILE application administrator, can be maintained dynamically (that is, without shutting down the database), and are consistent with other Oracle tools.

###raw>template_hook.ano_emploi###