2017-06-28 29 views
0

私は17列のテーブルを持っています。このテーブルに基づいて、私はリモートデータベースからローカルのCSVファイルを生成する必要があります。いくつかのset文を定義して、列名を一度だけ表示し、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

SQL * Plusでは、 'select * 'を使用してCSV出力を取得したり、とにかく好ましい特定の列を選択したりすることはありません。 (ただし、SQLclとSQL Developerにはオプションがあります)。あなたは 'colsep'を変更することができますが、空白のロードを取得します。行の最大長は何ですか?すべての列の合計サイズ(暗黙的な数値/データ変換あり)?あなたは同じOS上でファイルを実行して開いていますか?開いたファイルによっては、改行の問題が発生している可能性があります。改行のある値がありますか?例を表示すると、もちろん役立ちます。 –

答えて

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]行に続く)3つの場所で独自のテーブル名を使用します。

その後、SQL * Plusの結果を取得し、実行すると期待どおりの結果が得られます。

希望します。