2017-06-28 35 views
0

我有17列的表。基於這個表我需要從遠程數據庫生成一個本地的CSV文件。我定義了一些設置語句來顯示列名只有一次,沒有sql橫幅,行數和其他一些。SQL線和頭斷裂問題

"my sql connection"<<EOF>> test_file.csv 
SET TAB OFF ECHO OFF FEEDBACK OFF LINESIZE 5000 SQLPROMPT '' TRIMSPOOL OFF HEADING OFF UNDERLINE OFF PAGESIZE 0 
select * from my_table where ROWNUM <= 50; 
exit 
EOF 

很簡單吧?

我現在面臨的問題涉及到錄製線和頭休息。即使LINESIZE 5000當我打開我的csv文件他們都打破,我的頭也

+0

你不會得到CSV輸出與'選擇*',甚至選擇特定列這是最好無論如何,在SQL \ * Plus中。 (SQLcl和SQL Developer有選項可以做到這一點)。你可以改變'colsep',但是你會得到一個空白的負載。線的最大長度是多少? - 所有列的總大小(隱式數/數據轉換)?你是否在同一個操作系統上運行並打開文件 - 也許你會看到換行符問題,具體取決於你打開它的內容嗎?你有價值與換行符?當然,舉例說明會有所幫助。 –

回答

0

我建議以下辦法(使用17列節省一些時間)。我想你會想'作爲分隔符。

所以首先您可以生成命令本身(我使用的查詢USER_TABLES但你可以很容易地修改查詢,以滿足您的需求)

set pagesize 0 
set linesize 5000 
set trimspool on 
(select q'!"my sql connection"<<EOF>> test_file.csv 
SET TAB OFF ECHO OFF FEEDBACK OFF LINESIZE 5000 SQLPROMPT '' TRIMSPOOL OFF HEADING OFF UNDERLINE OFF PAGESIZE 0!' from dual) 
union all 
(select 
    q'!select '!' || 
    listagg(column_name, ',') within group (order by table_name) 
    || q'!' from dual union all!' 
    header 
from all_tab_cols where table_name = 
-- MODIFY TO YOUR TABLE NAME HERE [1]: 
'USER_TABLES' 
) 
union all 
(select 
    'select ' || 
    listagg(column_name, q'! || ',' || !') within group (order by table_name) 
-- REPLACE USER_TABLES TO YOUR TABLE NAME HERE [2]: 
|| ' from user_tables where rownum <= 50;' 
    cmd 
from all_tab_cols where table_name = 
-- MODIFY USER_TABLES TO YOUR TABLE HERE [3]: 
'USER_TABLES' 
) 
union all 
(select 'exit 
EOF' from dual); 

您可以測試該查詢,然後將其替換USER_TABLES你在三個地方擁有自己的表名(在[1],[2],[3]行之後)。

之後採取的SQL * Plus導致,當你運行是你應該得到預期的結果。

希望它有幫助。