2010-08-04 20 views
0

j'ai une requête qui concatène (manuellement par ||) une poignée de colonnes, dont l'une est un champ d'XMLTYPE (getClobVal appelant() sur lui). Si je Spool la sortie de requête en utilisant sqlplus avec les options suivantes set:de bobinage d'une requête contenant une colonne d'XMLTYPE utilisant sqlplus

set long 30000; 
set pagesize 0; 
set feedback off; 

Je reçois tout le contenu comme souhaité, mais avec cr/lf de après 80 caractères, le premier contenu de la ligne d'arrêt après 60 caractères de 20 caractères de l'espace, et le contenu des lignes restantes s'arrêtant après 40 caractères avec 40 caractères d'espace.

Si j'ajouter:

set linesize 120; 

-je obtenir les mêmes résultats avec des espaces supplémentaires après le contenu réel (60 caractères blancs sur la ligne 1, 80 caractères blancs sur les lignes restantes par ligne)

Est-il possible d'utiliser sqlplus et spooling pour créer un fichier de sortie csv pour les résultats d'une requête contenant de grandes quantités de texte?

Je reconnais que faire cela par spooling n'est pas la méthode idéale, mais je dois pouvoir créer ce fichier csv d'une manière qui peut être exécutée sur la ligne de commande ou via un fichier batch.

Des suggestions?

Répondre

0

Un collègue de travail qui a eu plus d'expérience avec sqlplus est venu avec le bloc mis en suivant ce qui m'a donné le résultat que je recherchais:

set pagesize 0 echo off; 
SET LINESIZE 30000 LONG 30000 LONGCHUNKSIZE 30000 Trimspool on; 
+0

Vous devriez accepter votre réponse, car elle résout votre problème – APC

+0

StackOverflow ne me permet pas d'accepter ma propre réponse avant qu'un jour ne se soit écoulé. – copaX

1

Nous pouvons mettre linesize à un grand nombre. La taille dépend du système d'exploitation, même si je pense que la plupart des systèmes d'exploitation supporteront jusqu'à 32K. Ceci est à partir de Windows ....

SQL> set linesize 10000 
SQL> set linesize 32767 
SQL> set linesize 999999 
SP2-0267: linesize option 999999 out of range (1 through 32767) 
SQL> 

Si vous avez un texte XML plus que cela, bien vous êtes hors de la chance.

Vous ne dites pas pourquoi vous utilisez SQL * Plus. Est-ce parce que vous voulez la sortie sur un client plutôt que sur le serveur de base de données ou parce que vous ne connaissez pas d'autre moyen d'écrire un fichier?

Si vous pouvez écrire sur le serveur il existe des alternatives. UTL_FILE a toujours une limite de lignes de 32767 caractères mais au moins nous avons fait un peu de magie programmatique pour nous assurer que la ligne ne soit pas coupée en mid-tag.

Cependant probablement la meilleure solution est d'utiliser DBMS_XSLPROCESSOR.CLOB2FILE() qui fait partie de la fonctionnalité XMLDB.


Pour être complet le SQL * connexe et les paramètres recommandés par le collègue de COPAX sont:

PAGE - indiquer zéro supprime les en-têtes et empêche la page lance dans la sortie
ECHO - contrôle si l'instruction SQL est affiché lorsque le script est exécuté

les deux PAGE' and ECHO` sont mis à éviter que le texte étranger dans la sortie.Pour la même raison, le paramètre suivant est souvent mis

FEEDBACK - contrôle si le nombre de lignes est diplayed à la fin de la requête

LONG - contrôle la quantité de texte LONG affiché
LONGCHUNKSIZE - contrôle la quantité de LONG texte affiché avant la colonne enveloppe
TRIMSPOOL - supprime les espaces dont les droits à la ligne Tapis de LINESIZE valeur

LONG et LONGCHUNKSIZE shoudl être réglé à la même valeur pour afficher toute la colonne sur une seule ligne de sortie.

Tous ces paramètres et bien d'autres sont expliqués au the documentation.

+0

Désolé, oui c'est parce que la sortie doit être sur un client plutôt que le serveur de base de données lui-même. – copaX

+0

@copaX - auquel cas vous êtes limité au 32K que permet LINESIZE. – APC