Comment faire en sorte que la sortie de sqlplus apparaisse sur une seule ligne?

47

J'ai une table avec 100 colonnes. Lorsque vous sélectionnez des données dans SQL Plusles enveloppes de sortie, cela rend la lecture difficile.

Ce que je préfère, c’est que la barre de défilement horizontale apparaisse ou que je transmette le résultat à less

Je lance les instructions suivantes dans SQLPlus -

SET LINESIZE 32000;
SET PAGESIZE 40000;
SET LONG 50000;
SPOOL output.txt
SELECT * FROM big_table;

Puis bashje cours -

moins output.txt

La sortie semble toujours encapsulée et illisible.

Kshitiz Sharma
la source
1
J'aimerais également que les colonnes se développent automatiquement au lieu de devoir définir individuellement la taille de la colonne.
Kshitiz Sharma

Réponses:

58

Il ne suffit pas de forcer sqlplus à ne pas envelopper de lignes. Il est également nécessaire d'indiquer à la visionneuse que vous utilisez pour afficher le fichier de spool afin de ne pas envelopper les lignes. Si votre lecteur est lessalors -Sl'option que vous devez utiliser conformément à https://superuser.com/questions/272818/how-to-turn-off-word-wrap-in-less . Sous Unix / Linux, vous pouvez utiliser head -1 output.txtpour obtenir la première ligne d’un fichier et vérifier si le résultat est od -c output.txt|head conforme aux attentes. Vous pouvez également savoir où sont placés les sauts de ligne dans votre fichier de sortie.

Si vous affichez les colonnes LONG et que leurs valeurs contiennent des sauts de ligne, plusieurs lignes seront imprimées pour ces valeurs de colonne et vous ne pourrez pas remplacer cela par des paramètres sqlplus.


Les commandes sqlplus suivantes peuvent être utiles:

  • SET LINESIZE linesizela longueur de la ligne. Dans la plupart des cas, la valeur maximale pour linesizeest 32767. Vous pouvez connaître votre valeur maximale si vous définissez LINESIZE sur une valeur non valide et vérifier le message d'erreur pour SET LINESIZE 0pouvoir donner SP2-0267: linesize option 0 out of range (1 through 32767) (1)
  • SET TRIMSPOOL ON sinon, chaque ligne du fichier spool est remplie avec des blancs jusqu'à ce que la taille de la ligne soit atteinte.
  • SET TRIMOUT ON sinon, chaque ligne de la sortie est remplie avec des blancs jusqu'à ce que la taille de la ligne soit atteinte.
  • SET WRAP OFFTronque la ligne si elle est plus longue que LINESIZE. Cela ne devrait pas arriver si lineize est suffisamment grand.
  • SET TERMOUT OFFsupprime l'impression des résultats à la sortie. Les lignes sont toujours écrites dans le fichier spool. Cela peut accélérer beaucoup le temps d'exécution d'une déclaration.
  • SET PAGESIZE 0 définir une taille de page infinie et éviter les en-têtes, les titres, etc.
  • Il existe d'autres SETparamètres concernant la sortie (NUMWIDTH, NUMFORMAT, LONG, COLSEP) et les performances (ARRAYSIZE, LONGCHUNKSIZE).

Vous devez utiliser la COLUMNcommande pour formater des colonnes individuelles.

Par exemple column name format a30, formatera la colonne namedans la sortie avec une longueur maximale de 30 caractères.

Si vous voulez que la taille d'affichage ne soit pas fixe mais qu'elle soit égale à la taille de la valeur réelle des colonnes d'une rangée, le seul moyen que je connaisse est de modifier la clause select de votre instruction pour obtenir le résultat souhaité et l'utiliser. l'opérateur de concaténation de chaîne ||, p.ex.

select emp_id||' '||first_name||' '||last_name
from emp;

Vous trouverez une description complète de toutes les variables dans le Guide de l'utilisateur et de référence de SQL * Plus .

Si vous souhaitez réutiliser certains paramètres (ou définitions COLUMN), vous pouvez les stocker dans un fichier et exécuter ce fichier lorsque vous en avez de nouveau besoin. Vous pouvez même exécuter ce fichier automatiquement si vous démarrez sqlplus.

(1) "Comment trouver la valeur maximale LINESIZE (dépend du système) (ID de document 1547262.1)"

miracle173
la source
LONGCHUNKSIZEest pas seulement sur la performance, il semble nécessaire pour éviter les files d'emballage indésirables en plus de LINESIZE, juste expérimenté avec cette sortie inutilisable deDBMS_METADATA.get_ddl()
Daniel Vérité
2
Bonne
2
Ce que @ YperSillyCubeᵀᴹ a dit :)
Tom V
Vous devriez utiliser SET PAGESIZE 1000au lieu de 0sinon les en-têtes de colonnes ne seront pas imprimés lors de l’émission des commandes "SELECT". Référence .
Pierre C
@PierreC c'est pourquoi j'ai écrit "SET PAGESIZE 0 pour définir une taille de page infinie et éviter les en-têtes, les titres, etc.".
miracle173
5

Vous devez définir les paramètres ci-dessous:

SET WRAP OFF
Balazs Papp
la source
3
set linesize 30000 SET WRAP OFFa fait le tour pour moi
ren
2

vous pouvez définir comme ça

SET WRAP OFF

SET PAGESIZE 0
DevYudh
la source