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 :
SELECT o.getClobval() from table(xmlsequence(cursor(SELECT * FROM X))) o;
au lieu de :
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 :
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...]
Partager