Oracle

如何將 sql-plus-spool-file 格式化為 *.csv,所有列在一行中,行內容與換行符作為一個欄位?

  • November 28, 2019

我不是專業人士,抱歉。但也許你無論如何都可以幫助我……

我有一個包含 27 列的表,並且在行數據中帶有換行符。當我嘗試使用 sql-plus spool 導出選定的行時,我遇到了幾個問題。我嘗試了這裡給出的建議:如何使 sqlplus 輸出出現在一行中?,但他們不幫助我。我會在下面解釋。

首先配置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. 標題不在一行中,“設置換行”沒有幫助,因為它會截斷數據。
  2. 某些欄位包含帶有換行符的文本,sql+ 將這些欄位的行放在 csv 中的單獨欄位中。我需要將它們放在一個帶有換行符的欄位中,例如儲存在數據庫中。
  3. 如何在 csv 中的每個欄位/單元格的開頭和結尾獲取引號?

如果有人可以幫助我,我會很高興!

1)如果您希望將標題放在一行中,則必須使用 UNION 和 select from dual。例子:

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。

如果你想有記錄的標題,你最好試試這個:

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;

結果將是:

頁眉1 | 頁眉2 | 頁眉3|
-------------------------------
一個 | 乙 | C

引用自:https://dba.stackexchange.com/questions/84303