プロが教えるわが家の防犯対策術!

OS:Windows Server 2003
DB:Oracle10g(10.2.0)

sqlplusでselect結果をcsvファイルにspoolする際に空白行が出力されて困っています。
以下のsqlを実行した場合、
-----
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET PAGESIZE 0
SET LINESIZE 2000
SET TERMOUT OFF
SET TRIMSPOOL ON
spool test.csv
select '"'||col1||'","'||col2||'","'||col3||'"'
from table;
spool off
-----
改行を含むカラムを含む行の後に空白行が出力されます。
(2レコード目のcol3は"g"と"h"の間に改行コードがあるデータが格納されているが、何故か2レコード目と3レコード目の間に空白行が出力される)
-----
"abc","def","ghi"
"abc","def","g
hi"

"abc","def","ghi"
-----
これはsqlplusの仕様でしょうか。
2行目と3行目の間の空白行を削除してspoolする方法はありますでしょうか。

なお、改行を含むカラムの改行を改行以外の文字に置換して出力した場合は、以下のように空白行が出現しません。
-----
"abc","def","ghi"
"abc","def","gカイギョウhi"
"abc","def","ghi"
-----

A 回答 (1件)

sqlplusの仕様だと思います。


どこまでが1行かわからなくなるから、とかそういう理由ですね。
sqlplusのオプションで回避する手は私も知りません。

なので、どうしてもspoolしたいとすれば、SET SERVEROUT ONも切って、無名ブロックを実行するとかになります。
DECLARE
lines CLOB;
CURSOR cu IS SELECT L
FROM (SELECT '"' || col1 || '","' || col2 || '","' || col3 || '"' AS L FROM table);
BEGIN
FOR cu_row IN cu LOOP
IF lines IS NULL THEN
lines:=cu_row.L;
ELSE
lines:=lines || CHR(13) || CHR(10) || cu_row.L;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(lines);
END;
これであれば、全部つないで1行なので、空白行はでません。
面倒くさいですけどね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはり仕様ですか。。。
ご回答頂いた方法か、spoolを使わない方法で検討したいと思います。

お礼日時:2008/10/27 09:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A