web-dev-qa-db-fra.com

Comment formater le fichier sql-plus-spool en * .csv avec toutes les colonnes sur une seule ligne et le contenu des lignes avec des sauts de ligne dans un seul champ?

Je ne suis pas un professionnel, désolé. Mais peut-être pouvez-vous m'aider quand même ...

J'ai un tableau avec 27 colonnes et dans les lignes de données avec des sauts de ligne. Lorsque j'essaie d'exporter des lignes sélectionnées avec le spoule sql-plus, j'ai plusieurs problèmes. J'ai essayé les conseils donnés ici: Comment faire apparaître la sortie sqlplus sur une seule ligne? , mais ils ne m'aident pas. J'expliquerai ci-dessous.

Tout d'abord la configuration de la requête SQL plus:

set term off    
set echo off    
set underline off    
set colsep ';'    
set linesize 32767    
set pages 10000    
set trimspool on    
set trimout on    
set feedback off    
set heading on    
set newpage 0    
set headsep off    
;set wrap off    
set termout off    
set long 20000    

spool D:\tmp_Datenaustausch\Export-141204.csv    

SELECT MEDIENNR, ISBN, ISBN2, ISBNSUCH, KATKARTE1, BUCHKARTE1, SIGNATUR1, KATKARTE2,
   BUCHKARTE2, SIGNATUR2, KATKARTE3, BUCHKARTE3, SIGNATUR3, MAB2, FEHLERCODE, FARBE, 
   ANZSYKKARTEN, KKSTATUS, BKSTATUS, MABSTATUS, SESTATUS, FARBSTATUS, ASSTATUS, 
   REZENSION, REZENSENT, STICHWORTE, UPDDATE FROM Bekartungsdaten WHERE upddate like 
   TO_DATE('2014-12-01', 'yyyy-mm-dd');    

spool off;    
exit;    
/    

Mes problèmes:

  1. Les en-têtes ne sont pas sur une seule ligne, "set wrap off" n'aide pas car il tronque les données.
  2. Certains champs contiennent du texte avec des sauts de ligne, sql + place les lignes de ces champs dans des champs séparés dans le csv. J'ai besoin d'eux dans un domaine avec des sauts de ligne comme stockés dans la base de données.
  3. Comment obtenir des guillemets au début et à la fin de chaque champ/cellule du csv?

Je serais très heureux, si certains pouvaient m'aider!

3

1) Si vous voulez que les en-têtes soient sur une seule ligne, vous devez utiliser un UNION avec un choix parmi dual. Exemple:

select '"'||'col1'||'","'||'"col2"'||'","'||'"col3"'
  from dual
union
select '"'||col1||'","'||col2||'","'||col3||'"'
  from table;

2) Celui-ci est délicat. Il est utile de connaître le caractère ascii de vos sauts de ligne. Selon la façon dont ils ont été écrits, ils seront généralement (mais pas toujours) chr (10) ou une combinaison de chr (10) chr (13). Vous pouvez utiliser la fonction REPLACE dans votre requête pour remplacer celles par '', ce qui devrait les éliminer.

3) Si vous voulez des guillemets, voyez mon exemple # 1 ci-dessus.

HTH.

2
captjackvane

Si vous voulez avoir le titre de l'enregistrement, vous feriez mieux d'essayer ceci:

set linesize 220;
set pagesize 0;
SET NEWPAGE 0;
SET SPACE 0;
SET ECHO OFF;
SET FEEDBACK OFF;
SET VERIFY OFF;
SET HEADING OFF;
SET MARKUP HTML OFF SPOOL OFF;

spool D:\tmp_Datenaustausch\Export-141204.csv   

select 'header1'         ||','||
       'header2'         ||','||
       'header3'                  
result from dual
union all
select a    ||','||
       b    ||','||
       c      
from tableName
where coditional ;
spool off;
exit;

le résultat sera:

 header1 | header2 | header3 | 
 ------------------------------- 
 a | b | c 
0
Mark Cam