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 :

Conversion d'un résultat de SELECT au format XML


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Conversion d'un résultat de SELECT au format XML
    Bonjour,

    Je dois mettre au format XML le contenu de toutes les tables d'un utilisateur Oracle.
    est-ce quelque chose de réalisable et fiable??

    J'ai trouvé 2 méthodes : avec PL/SQL en utilisant la fonction getXml du package dms_xmlgen mais dans ce cas j'ai des problèmes de taille de lignes et de curseur, l'autre méthode en utilisant XML-SQL Utility pour JAVA.
    Cette dernière solution me parait plus fiable, mais dès que je passe la commande sur une table conséquente (80M) j'ai un problème de java.lang.OutOfMemoryError

    Merci d'avance pour toute suggestion...

    java -Xmx1024M OracleXML getXML -user "ga_adm/adm91" conn "jdbc:oracle:thin:@FESW2K01:1530:GADID" "select * from paie"
    Exception in thread "main" java.lang.OutOfMemoryError
    <<no stack trace available>>

    Autre problème si le nom de la table contient un '#' :
    java -Xmx512M OracleXML getXML -user "atms/atms" -conn "jdbc:oracle:thin:@FSW2K02:1530:ATMS" "select * from BOXFROMDESCT#1B"
    <?xml version = '1.0'?>
    <ERROR>oracle.xml.sql.OracleXMLSQLException: Le caractÞre '#' est interdit dans
    un nom de balise XML.</ERROR>

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Et pourquoi pas avec un spool :
    http://www.developpez.net/forums/m2048070-4/
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci, pour la suggestion du spool cela fonctionne.

    Seule contrainte , il faut que je vois comment on peut balayer l'ensemble des tables d'une même base..

    A suivre.

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Cherche sur le forum, cette question a déjà été posée
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tiens voici un exemple dont tu peux t'inspirer :
    http://www.developpez.net/forums/m1661851-5/
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci c'est tout à fait à cela que je pensais, il va falloir que je teste un mixage des 2 scripts.
    Il ne restera plus que le problème des caractères spéciaux à analyser.

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Une petite remarque...

    Cette méthode appliqué à toute les tables d'un user risque de mettre beaucoup de temps... et de ne pas être viable au final.

    J'ai fait des tests avec le script mentionné (utilisant xmlsequence).

    Le temps de traitement et les ressource serveur sont très exponentiels avec le nombre de lignes de la table.

    J'ai fait mes tests sur 2 tables : T1 de 11.000 lignes et T2 de 80.000 lignes. C'est tables ont la même structure : 12 champs (11 NUMBER et 1 DATE).

    Donc, des petites tables bien peu remplies...

    J'ai aussi testé le script avec une version modifiée de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  o.getClobval() from table(xmlsequence(cursor(SELECT * FROM X))) o;
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE(xmlsequence(cursor(SELECT * FROM X)));
    J'ai par ailleurs codé en 10 minutes 2 applis C (avec OCILIB) :

    - l'une N°1 (50 lignes de code) exécute la version de la requête retournant le CLOB (au lieu du XMLTYPE) dans un buffer qui est ensuite redirigé vers un fichier

    - l'autre N°2 (80 lignes de codes) fait un simple select * sur la table. Puis loop sur le résultat et grâce aux metas infos des colonnes formate les valeurs dans des balises XML en gérant même les 5 caractères d'échappement XML. Bref, l'ouput est le même qu'avec la solution xmlsequence.

    Résultats :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    METHODE                 T1 (11000 rows)          T2 (80.000 rows)        
    ----------------------------------------------------------------------------------------------
    -
    SCRIPT INITIAL          36.5 sec.                  ctl+c au bout de 5 minutes
    SCRIPT MODIFIE          25.5 sec.                  ctl+c au bout de 5 minutes
    APPLI C/OCILIB N°1      10.5 sec                   process killé au bout de 5 minutes
    APPLI C/OCILIB N°2      00.6 sec                   4.6 sec
    -
    -
    Pour le traitement sur T2, j'ai du arrêter sql*plus(ctrl+c) et l'appli C qui étaient basé sur xmlreference au bout de 5 à 6 minutes car le processus server d'Oracle avait déja bouffé 800 Mo de mémoire pour traiter la requête ( c'est un serveur Window mais bon c'est une raison !!). J'ai donc arrêté les frais.

    Y a pas photos sur les perfs... de 0.6s à 36.5s.... sans commentaire !

    Ces petits tests montrent que sur un base de prod, le script proposé est inutilisable....

    Il vaut mieux faire une appli C ou java du type "select * from X" et générer le xml soit même.. (80 lignes de code en C....)..

    Ou alors même se faire une fonction PL/SQL avec UTL_FILE...mais bon cela pose les problèmes d'accès au FS...


    [EDIT : générer le xml à la main est simple. A tout hasard, je te mets le source C de mon appli de test n°2. Tu peux refaire la même chose en PL/SQL...]


    Fichiers attachés Fichiers attachés
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Merci pour la remarque...

    Lors de mes tests j'avais vu qu'effectivement la consommation mémoire était importante si je renais une tables ayant beaucoup d'enregistrements et contenant du varchar.

    Je me demande si cette façon de procèder est viable pour archiver annuellement des bases de données de gestion ...

    Je vais poursuivre malgrés tout les tests...
    Non, ce n'est viable à moins que tu n'aies que des tables minuscules et un très gros serveur .

    J'ai modifié le programme C cité dans mon précédent post pour dumper l'ensemble des tables d'un user dans un répertoire en créant un fichier xml par table.

    Résultat sur une de mes bases (6 Go utilisés, 830 tables allant de quelques lignes à 10 millions de lignes) :

    - 830 fichiers générés en 8 minutes 30 secondes
    - le plus gros fichier fait 400 Mo
    - l'ensemble des fichiers représente 1,6 Go sur disque

    Je pense qu'avec le script sqlplus, cela prendrait plusieurs jours, voir semaines (si le serveur avait une mémoire illimitée)....

    Le source du prog est en pièce jointe...

    Encore une fois, passe plutôt par une procédure PL/SQL+UTL_FILE (ou DBMS_OUTPUT) ou par un outils tiers ou autre mais le script sqlplus n'est pas adapté à ce que tu veut en faire....

    Maintenant si c'est seulement pour faire de l'archivage, tu peux archiver et stocker de manière autre que xml....
    Fichiers attachés Fichiers attachés
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2008, 14h18
  2. Conversion d'un dword en std::string (format 2 chiffres)
    Par Rodrigue dans le forum SL & STL
    Réponses: 3
    Dernier message: 09/08/2006, 10h35
  3. [MySQL] afficher résultat requete "Select From ..."
    Par winnie82 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/03/2006, 11h14
  4. Utiliser le résultat de SELECT Sum dans If
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 33
    Dernier message: 15/11/2005, 08h38
  5. résultat de " select count "
    Par marie253 dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2004, 12h07

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