web-dev-qa-db-ja.com

sql-plus-spool-fileを* .csvにフォーマットし、すべての列を1行に、行コンテンツを改行を1つのフィールドとしてフォーマットする方法は?

私はプロではありません。しかし、おそらくあなたはとにかく私を助けることができます...

27列のテーブルがあり、行内に改行のあるデータがあります。選択した行をsql-plusスプールでエクスポートしようとすると、いくつかの問題があります。私はここに与えられたアドバイスを試しました: sqlplusの出力を1行で表示する方法は? ですが、それらは私を助けません。以下に説明します。

まず、SQLとクエリの構成:

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;    
/    

私の問題:

  1. 見出しは1行ではなく、「set wrap off」はデータを切り捨てるため、役に立ちません。
  2. 一部のフィールドには改行付きのテキストが含まれ、sql +はこれらのフィールドの行をcsvの個別のフィールドに配置します。データベースに保存されているような改行のある1つのフィールドでそれらを必要とします。
  3. Csvの各フィールド/セルの最初と最後に引用符を取得するにはどうすればよいですか?

助けてくれたら嬉しいです!

3

1)見出しを1行にしたい場合は、UNIONをデュアルから選択して使用する必要があります。例:

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

2)これはトリッキーです。これは、改行が実際に何のASCII文字であるかを知るのに役立ちます。それらがどのように記述されたかに応じて、一般に(常にではない)chr(10)またはchr(10)chr(13)の組み合わせになります。クエリで [〜#〜] replace [〜#〜] 関数を使用して、それらを ''で置き換えることができます。

3)引用符が必要な場合は、上記の例1を参照してください。

HTH。

2
captjackvane

レコードの見出しが欲しい場合は、これを試してみてください。

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;

結果は次のようになります。

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