今だけ人気マンガ100円レンタル特集♪

DBからCSVにしてデータを取り出そうと、ネットで検索して
みようみまねでやってみました。(下記の場合カンマ区切りですが)
タブ区切りで整列したデータを抽出したいのですが、特に、
(4)のように隣合う項目の間がかなり離れていて見えにくい状態で
CSVファイルが作成されてしまいます。
(1)のように整列した形で、タブ区切りのCSVデータを抽出するには、
どのようにしたら宜しいのでしょうか?

(2)、(3)は、試してみた実行ファイルです。
環境は、oracle10g windowsXPです。

(1)目的の結果の表示-------------------------------
653-5689 ZM05 田中太郎 YOKOHAMAS 4 4  9 097005・・・・・


以下試してみたbatファイルとsqlで抽出

(2)batファイル----------------------------------
sqlplus ABCD/ABCD@oracle.host1.ser @abc.sql

(3)sqlファイル-----------------------------------
set echo off
set heading off
set termout off
set pause off
set pagesize 0
set trimspool on
set feedback off
set colsep ","
set term off
spool hoge.txt
select
*
from T_JUTYU;
spool off
exit

(4)結果---------------------------------
653-5689 ,ZM05
田中太郎
,YOKOHAMASI
4, 4, , ,9 ,097005
,

1 ,18 , , ,
, ,
0 ,asahi
asahi ,08-12-23,08-12-23,
------------------------------------------------まで結果

このQ&Aに関連する最新のQ&A

A 回答 (2件)

CSV(TSVでも同様)をSQL*Plusでspoolするのに必須と言えるSET文が足らないですね。



set linesize 1000

ライン長を指定しないと、デフォルトでは適当なところで折り返されてしまいます。
1000は1000バイトです。
普通、とりあえず5000くらいにしておきますが、業務要件に則して想定される最大のバイト数を指定してください。

それと、正直、colsep をカンマにしてCSVを作るのはお薦めできません。
(多分、仕事で使っている人は殆どやらないと思います)

面倒くさいけど、カラムを連結する方法が確実です。

SELECT
COL1 || CHR(9) || COL2 || CHR(9) || COL3 || CHR(9)...
FROM T_JUTYU;

CHR(9) はタブです。

また、上記は、カラムがすべて文字列の場合の例です。
数値や日付がある時は明示的にTO_CHARでキャストしてください。

TO_CHAR(数値型カラム)
TO_CHAR(日付型カラム, 'YYYY-MM-DD HH24:MI:SS')
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせて頂き、途中で何度かスペースが引っかかってエラーになりましたが、何とか目的を果たすことができました。

お礼日時:2011/02/11 09:53

set lines 30000


を追加してください。
TAB区切りの場合には複数行の縦位置はそろいませんけど。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qbatファイルからsql文実行

クライアントOS:WIN2000
Oracle:9i(サーバ(UNIX)上にあります)

現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。
(SQL文は単純にTBLをカウントしているだけです)

・batの中身
sqlplus %UID%/%PASS%@%SID% @test.sql > output

結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか?

・余分な情報
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
に接続されました。

Aベストアンサー

sqlplus に -S オプションを追加してみればどうでしょうか。

参考URL:http://biz.rivus.jp/sqlplus_overview.html

Qselectした結果の余計な余白を取るにはどうしたらよいのでしょうか

質問が二つあります。

質問1)会社の先輩に、sql/plusでORACLEのDBに接続し、以下の命令を実行するとselectした結果をcsv形式でファイル出力できると教えてもらいました。

set num 18
set linesize 1000
set pagesize 0
set trimspool on
set colsep ','

上記の「set num 18」の意味を「sqlリファレンス」で調べても載ってなく分かりませんでした。ご存知の方は教えて下さい。また、どのようなマニュアルに載っているのかも教えて下さい。

質問2)上記命令を実行後に、名前=「NAME_KANJI」、属性=VARCHAR2(60)のカラムをselectすると次の様に出力されました。「~,XXXX…(この後空白が続く),~」次に、trim(NAME_KANJI)、substr(NAME_KANJI,1)、substr(NAME_KANJI,length(NAME_KANJI))などで出力すると「XXXX]の後の空白が更に長く出力されまました。substr(NAME_KANJI,1,4)なら「XXXX]の後の空白がなくなるのですが、登録されている文字数は不定のため、文字数に応じて空白を除いて出力する方法はあるのでしょうか、あればその方法を教えて下さい。よろしくお願いします。

質問が二つあります。

質問1)会社の先輩に、sql/plusでORACLEのDBに接続し、以下の命令を実行するとselectした結果をcsv形式でファイル出力できると教えてもらいました。

set num 18
set linesize 1000
set pagesize 0
set trimspool on
set colsep ','

上記の「set num 18」の意味を「sqlリファレンス」で調べても載ってなく分かりませんでした。ご存知の方は教えて下さい。また、どのようなマニュアルに載っているのかも教えて下さい。

質問2)上記命令を実行後に、名前=「NAME_KANJI」、属性...続きを読む

Aベストアンサー

こんにちは。

回答1.
SQL*Plusユーザーズ・ガイドおよびリファレンス

回答2.
SELECT COL1||','||COL2||','||COL3
FROM テーブル名
みたいにカラムを連結させてしまう方法もありますよ。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QSQL Plusで項目名が最後まで表示されない?

下記のコマンドを入力後、実行結果を見ると項目の部分が切れています。これを正しく表示するにはどうすればいいでしょうか?
回答のほどよろしくお願い致します。

SELECT TO_CHAR(HIREDATE,'RR') AS 入社年, JOB AS 職種 , TO_CHAR(AVG(ROUND(SAL,1)),'$9,999') AS 平均給与 FROM EMP GROUP BY TO_CHAR(HIREDATE,'RR') ,JOB

入 職種 平均給
-- --------- -------
80 CLERK $800
81 CLERK $950
81 ANALYST $3,000
81 MANAGER $2,758
81 SALESMAN $1,400
81 PRESIDENT $5,000
82 CLERK $1,300
82 ANALYST $3,000
83 CLERK $1,100

Aベストアンサー

SQL*PLUSの表示幅は、自動的に決定され、カラムヘッダは、
勝手に捨てられます。(デフォルト動作)
しかも、バージョンによって微妙に違う。(^^;

対策ですが、デフォルトに頼らず、自前で設定するとこができます。

先のSQLの「入社年」ですが、

col 入社年 format a6

というコマンドを投入すると、「入社年」というカラムは、内容に
関わらず、6桁幅で表示されます。
(面倒な方法ですが、カラム表示に拘るならこれしかありません)

QSQL実行結果の出力を見やすくしたい

Oracle 10gを使用して勉強をしています。
SQL実行結果の出力が見にくくて困っています。
以下、(1)は自分が実行したSQL文ですが、(2)のように見やすく出力したいです。

どのようにすればよいのでしょうか?
また参考となるWEB URLがある場合、頂けたら嬉です。

(1)自分が実行したSQL文
SQL> select
2 sid,serial#,username,osuser,program,machine,terminal
3 from v$session
4 where type = 'USER';

SID SERIAL# USERNAME
---------- ---------- ------------------------------
OSUSER PROGRAM
------------------------------ ------------------------------------------------
MACHINE
----------------------------------------------------------------
TERMINAL
------------------------------
543 39 SYS
oracleuser sqlplus@HOGE-net (TNS V1-V3)
HOGE-net
pts/1


SID SERIAL# USERNAME
---------- ---------- ------------------------------
OSUSER PROGRAM
------------------------------ ------------------------------------------------
MACHINE
----------------------------------------------------------------
TERMINAL
------------------------------
544 5 SYS
oracleuser sqlplus@HOGE-net (TNS V1-V3)
HOGE-net
pts/0


(2)こんな感じで出力させたいです。
select
sid,serial#,username,osuser,program,machine,terminal
from v$session
where type = 'USER';

SID SERIAL# USERNAME OSUSER PROGRAM  MACHINE   TERMINAL
---- ------- --------- ------ ---------- ---------  --------
139     2      TEST Owner sqlplus.exe   HOGE_XP HOGE_XP
144     20    SYSTEM      ORACLE.EXE HOGE_XP  HOGE_XP

Oracle 10gを使用して勉強をしています。
SQL実行結果の出力が見にくくて困っています。
以下、(1)は自分が実行したSQL文ですが、(2)のように見やすく出力したいです。

どのようにすればよいのでしょうか?
また参考となるWEB URLがある場合、頂けたら嬉です。

(1)自分が実行したSQL文
SQL> select
2 sid,serial#,username,osuser,program,machine,terminal
3 from v$session
4 where type = 'USER';

SID SERIAL# USERNAME
---------- ---------- ---------------------------...続きを読む

Aベストアンサー

set pages 10000 lines 10000 trims on
col username for a30
col osuser for a30
col program for a30
col machine for a30
col terminal for a30

select
sid,serial#,username,osuser,program,machine,terminal
from v$session
where type = 'USER';

こんな感じでどうですか?
ちなみに、a30は30文字分の幅という意味です。
number 型のデータの場合には指定方法がかわりますが、
number 型はそのままでも表示が乱れることはあまりないので、
それほど気にしなくてもよいでしょう。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QOracleでの文字列連結サイズの上限

Oracle9iでテーブル内容をスプール出力していますが、カラム単位で余白を削除したい
(トリムをかけたい)ので以下のようにカラムを連結させてスプールしています。
set colsep ','
spool test.csv
select
a ||','||
b ||','||
c
from test_table
spool off

実際の項目数は100以上あり、レコードの最大長も数千バイトになりますが、
各項目にMAXの値を入力して上記スプールを実行したところ、以下のエラーメッセージが
出力されました。
「ORA-01489: 文字列を連結した結果、長さが最大長を超えました」

データを連結した結果の長さが上限を超えたということなのでしょうが、
この最大長はどこで設定されているものなのでしょうか?
また、そもそもスプール出力でトリムが効かないためにこのようなやり方で
出力していますが、他によい方法をご存知の方いましたら教えて下さい。
よろしくお願いします。

Aベストアンサー

>>Code Tipsの内容も実際に試してみたのですが、結局のところ項目を連結させる
>>やり方では4000バイトまでが限度ということだと判断したのですが

4000バイトまでが限度 とは、どのような理由からでしょうか?
以下のSQLで4000バイトオーバーは可能です。(32KBの壁はあります)

既に完成度の高いスクリプトがデバッグ済みで存在するのに
同じものを 1からコーディングするのは、(自分の勉強にはなるとは思いますが) 意味のない行為だと思いますので、
Code Tipsをお勧めしました。

SPOOL HOGE.TXT
SET PAGESIZE 0
SET LINESIZE 32767
SET LONG 40000
SET LONGC 40000
SET TRIMSPOOL ON
SET FEEDBACK OFF
SET VERIFY OFF

SELECT
TO_CLOB('')
|| LPAD('1', 4000,'1')
|| LPAD('2', 4000,'2')
|| LPAD('3', 4000,'3')
|| LPAD('4', 4000,'4')
|| LPAD('5', 4000,'5')
|| LPAD('6', 4000,'6')
|| LPAD('7', 4000,'7')
|| LPAD('8', 4000,'8')
|| LPAD('9', 4000,'9')
|| LPAD('0', 4000,'0')
FROM DUAL
/
SPOOL OFF

>>Code Tipsの内容も実際に試してみたのですが、結局のところ項目を連結させる
>>やり方では4000バイトまでが限度ということだと判断したのですが

4000バイトまでが限度 とは、どのような理由からでしょうか?
以下のSQLで4000バイトオーバーは可能です。(32KBの壁はあります)

既に完成度の高いスクリプトがデバッグ済みで存在するのに
同じものを 1からコーディングするのは、(自分の勉強にはなるとは思いますが) 意味のない行為だと思いますので、
Code Tipsをお勧めしました。

SPOOL HOGE.TXT
SET...続きを読む

QPL/SQLで@ファイル名が反応しません

はじめまして、PC超初心者なのにOracleを勉強し始めました。
PL/SQLの本を買って見よう見真似でやっているのですが、SQL*PLUSから@<ファイル名>を実行しても何の反応もありません。

SQL>@sample1

としても

SQL>@sample1
SQL>

と何事もなかったようになります。

本によればエディタに保存したSQL内容が実行されるとあるのですが。。。
ちなみにサンプルエディタをダウンロードして、実行しようとしても全くの無反応です。

どこか根本的な設定がおかしいのでしょうか。。。
どなたかご回答いただけると助かります。

Aベストアンサー

sample1というファイルはどこのフォルダにありますか?
ファイル名にフォルダ名をつけたフルパスで実行してみてください。
たとえばc:\hogeというフォルダにsample1.sqlファイルがあるのであれば
SQL>@c:\hoge\sample.sql
で実行されます。

コマンドプロンプト版のsqlplusだとsqlplusを実行したフォルダにファイルがあるとフォルダ名を省略したファイル名で実行できます。
画面のsqlplusは・・・どこだったか忘れた(^^;

#なんか過去にもこんな質問があったような・・・


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

人気Q&Aランキング