sqlplusのspoolで空白行出現

このQ&Aのポイント
  • Windows Server 2003の環境で、Oracle10gのsqlplusを使用してselect結果をcsvファイルにspoolする際に空白行が出力される現象が発生しています。
  • カラムに改行を含む行の後に空白行が出力される問題があり、sqlplusの仕様によるものかどうか、また空白行を削除する方法はあるのかについて質問しています。
  • 改行を含むカラムの改行を改行以外の文字に置換すると空白行は出力されないことを確認しています。
回答を見る
  • ベストアンサー

sqlplusのspoolで空白行出現

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" -----

  • Oracle
  • 回答数1
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.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行なので、空白行はでません。 面倒くさいですけどね。

tru_sat
質問者

お礼

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

関連するQ&A

  • SQLPLUSでセレクト結果の表示方法

    お世話になります。 SQLPLUSでselect * from AAA という風にセレクト結果を出力する場合 AAAテーブルのカラム数が多い場合改行されて出てきますが、 これを改行せずに1レコード1行で表示させられないでしょうか? 何かSQLPLUSのコマンド等をご存知の方いらっしゃったらご教授お願いいたします。

  • バッチからのSQLPLUS実行について

    はじめまして。 SQLPLUSでご質問ををさせてください。 環境 OS:Win2003server Oracle:10g バッチから、以下のようにSQLを実行したいと考えています。 バッチファイル sqlplus ID/PASS@インスタンス名 @SQLファイル.sql SQLファイル.sql set trimsool on set pagesize 0 set linsize 2000 set feedback off set colsep ',' spool on spool ABC.txt select * from xxx; spool off exit; ご質問  バッチファイルからSQLファイル.sqlが呼ばれているのですが、  接続時にENTERキーを押下しないと、後続の処理が実行されません。  ENTERキー押下後のメッセージ内容が  「バージョン情報の表示や、接続されました。」と出力されているため、  接続時の処理と思われます。    上記でENTERキーを押下せずに、処理を実行させるためにはどうすればよろしいでしょうか。  初歩的な質問で申し訳ありませんが、宜しくお願い致します。

  • sqlplusでヘッダーが付かない

    サーバー:windows 2003server oracle10g クライアント:windows xp oracle10g 以下のsqlファイルをbatで起動し、テキストファイルを出力しています。 しかしながら、setのところにヘーダーを出力するよう宣言しているのに もかかわらず、出力されません。 どなたかおわかりになる方、いらっしゃいませんでしょうか? set echo off set heading on set underline off set termout off set pause off set pagesize 0 set trimspool on set feedback off set termout off set linesize 1000 set lines 30000 spool hoge.txt select aaa||CHR(9)|| bbb||CHR(9)|| ccc||CHR(9)|| ddd from M_JITU; spool off EXIT

  • fpoenからの改行コードの扱いについて

    ただいまMacOSX(10以降)でプログラミングをしています。このOSでは改行コードはLFつまり、"\n"が当てはめられているはずです。(でいいんでしょ??) ///// abc.txt(改行や空白もそのまま)////// abc def ghi ///////////////////////////////////// このテキストをfopenで開き、fgetsで1文字ずつスキャンしていて"\n"にぶちあたるとある変数をインクリメントし、最後にその行数を出すというプログラムを書いてます。 この場合改行"\n"は3回あるので最終的に3+1、つまりこのテキストは4行あるということを表示できるはずなのですが、なぜか改行が1回としか認識されず結果2行のテキストとして出力されてしまいます。 いろいろ試した結果、どうやら"\n"を判断できている場所はその次が空白の行の場合だけなのです。つまり、コンピュータ的には ///// abc.txt(改行や空白もそのまま)////// abc\n ←ここは次にdefという文字列がきているので\nが認識されていない def\n ←ここしか認識されていない   \n ←同様に次の文字列がくるので認識されていない ghi ///////////////////////////////////// としか認識されていないようなのです。 なぜ\nの続きが文字列であると なぜこのようなことになるのでしょうか? \nの扱い方が間違っているのでしょうか?解決方法がおかる方がいればよろしくおねがいします。

  • グループ化の際の文字列について

    SQLSERVER初心者でSQLをどうすればよいか 悩んでいます。アドバイスを頂ければと思います。 環境SQLSERVER2005 EXPRESS EDITION 下記のようなレコードでIDに対してどこかの 1項目にだけ文字列がはいっている形となっております。 (他の項目はNULLとなります。) これをIDでグループ化して1レコードにしたいのですが、 どのようなSQLで可能かアドバイス頂ければと思います。 ID   COL1   COL2   COL3   1   ABC    <NULL>   <NULL> 1   <NULL>   DEF    <NULL> 1   <NULL>  <NULL>   GHI 上記を下記のようにしたいのですが、 ID   COL1   COL2   COL3 1   ABC    DEF     GHI 以上アドバイスを頂けますと大変助かります。 よろしくお願いします。

  • 項目内の改行がレコードの終わりと判定されてしまう

    SQL*PLUSでORACLEデータを単純にテキストファイルに書き出したいのですが、項目内に「改行」があるとレコードが複数行に分かれていまい、上手くいきません。 項目内の「改行」のみ(レコード終端の本来の「改行」は残す)を削除して前詰めする(または空白に置き換える)方法をご存じの方ご教示いただけないでしょうか。 例) SET COLSEP ',' SPOOL D:\出力ファイル.txt SELECT      項目1 || 項目2 || 項目3 FROM テストテーブル ; SPOOL OFF;

  • 外部ファイルを1行ずつ読み込んで特定カラムを引数として

    外部ファイルを1行ずつ読み込んで特定カラムを引数として 外部ファイルを1行ずつ読み込んで特定カラムを引数として 別び外部ファイルに対してgrepをかけたいと考えてます。 DBを作るほどのデータではないので、ファイルの行数を取得してawk/sedコマンド もしくはperlを駆使して実装できればと考えてます。スマートな方法があれば教授ねがいます。 やりたいこと)sample1.logから1/2カラム目を取得して、 sample2.logに対してsample1.logの2カラム目で紐付けて repot.logを出力したい #sample1.log 0001 AAAA 0002 BBBB 0003 AAAA 0004 CCCC  ・  ・ #sample2.log AAAA ABC BBBB DEF CCCC GHI  ・  ・  ・ #report.log 0001 AAAA ABC 0002 BBBB DEF 0003 AAAA ABC 0004 CCCC GHI  ・  ・  ・ 以上

    • ベストアンサー
    • Perl
  • 外部ファイルを1行ずつ読み込んで特定カラムを引数として

    外部ファイルを1行ずつ読み込んで特定カラムを引数として 別び外部ファイルに対してgrepをかけたいと考えてます。 DBを作るほどのデータではないので、ファイルの行数を取得してawk/sedコマンド もしくはperlを駆使して実装できればと考えてます。スマートな方法があれば教授ねがいます。 やりたいこと)sample1.logから1/2カラム目を取得して、 sample2.logに対してsample1.logの2カラム目で紐付けて repot.logを出力したい #sample1.log 0001 AAAA 0002 BBBB 0003 AAAA 0004 CCCC  ・  ・ #sample2.log AAAA ABC BBBB DEF CCCC GHI  ・  ・  ・ #report.log 0001 AAAA ABC 0002 BBBB DEF 0003 AAAA ABC 0004 CCCC GHI  ・  ・  ・ 以上

  • 特定の項目が同じ値のレコードを1件だけ出力するには

    教えて下さい。全くいいSQLが思い浮かびません^^; Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 No2, Row1, ABC1, 1, DEF1, 1 No2, Row2, ABC1, 1, DEF1, 2 ================================================ 以上のテーブル情報の時、 Col3とCol4をキーにしてレコードを抽出します。 但し、抽出するレコード内容にCol5とCol6が同一なレコードは1件もありません。 上記テーブルから取り出したいレコードは以下の通りです。 Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 ================================================ どういうSQLで上記のような抽出が可能になるでしょうか? 宜しくお願い致します。

  • [SQL Server] コマンドプロンプトからのCSV形式出力

    SQL ServerのテーブルデータをSELECTしてダブルコーテ区切りのCSVに出力したいと考えております。 ・batファイルからの起動を希望。 ・出力CSVファイル名はbatファイルより引数で指定したい。 ・出力後、DELETEも行いたい。 OracleだとSQL*Plus環境で下記のようにテキストレベルで簡単にできます。 SQL Serverでも同様のことができないでしょうか? 要は下記をSQL Server版でやりたいということです。 参考:Oracleだと・・・ 同一dirに、abc.batとabc.sqlを用意しabc.batを実行すると20070601.csvが生成される。 1.abc.bat rem ----abc.bat-ここから---- sqlplus usr/pwd@host @abc.sql 20070601.csv rem ----abc.bat-ここまで---- 2.abc.sql ----ファイル名=abc.sql-ここから--- set echo off set heading off SET VERIFY OFF set FEEDBACK OFF set TRIMSPOOL on set termout off set pagesize 0 set linesize 32767 spool &1 select '"'|| カラム1 ||'",'|| '"'|| カラム2 ||'",'|| '"'|| カラム3 ||'"' from テーブル1; spool off delete from テーブル1; exit ----ファイル名=abc.sql-ここまで--- 20070601.csv結果 -ファイル名=20070601.csv-ここから--- "20060726","scott","356160" "20060727","tiger","463391" "20060728","manager","1930" -ファイル名=20070601.csv-ここまで--- DBサーバ環境 OS:Win2003SvrR2 SQL Serverバージョン:わかりません。(2003にのってるので最近のだと思われます) Oracle経験者でSQLServer初心者です。マニュアルもなく、Web検索しても「SQL」「Server」ってなかなかうまくひっかからない!! ので質問あげさせていただきます。