ここから質問投稿すると、最大10000ポイント当たる!!!! >>

以下のようにspoolコマンドにてselectの結果をCSVに出力したいのですが、カンマ区切りしたいため連結していますがエラーが発生します。

spool aaa.csv
select
AAA || ',' ||
BBB || ',' ||
  CCC - DDD || ',' ||
EEE
from
table_A
・・・

そうすると、引き算が引っかかっているらしく、
「ORA-01722:数値が無効です」エラーが発生します。
連結をやめて、「|| ',' ||」→「,」にすれば正常に終了します。
連結の場合に演算子を使うにはどのようにすればよいのでしょうか?

また、例えば「AAA<0」の場合には、BBBに100を掛けるとかのような
他カラムでの条件により、別カラムの計算結果を変えるといったことは
可能なのでしょうか?

よろしくお願い致します。

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

A 回答 (4件)

CCC列とDDD列のデータ型は何ですか?


もしかしてcharやvarchar2等の文字列では?
desc table_Aの結果を教えてください。

この情報からだと暗黙の型変換で変換できない値が
入っていてエラーになっているように見えます。
※計算で「ORA-01722」が出るとはこのパターンが多い。

例)

create table test_table
( ccc number(10),
ddd varchar2(10));

insert into test_table values(10,'1');
insert into test_table values(11,'A');

・numberに変換可能
select ccc - ddd from test_table where ddd='1';
CCC-DDD
----------
9

・numberに変換不能
select ccc - ddd from test_table where ddd='A';
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。

この回答への補足

ありがとうございます。
ただ型はNumber型でした。
すいませんが宜しくお願い致します。

補足日時:2008/07/23 10:36
    • good
    • 0

SQL*Plusをお使いとのことですので、データ型を揃えるのが面倒でしたら


SET COLSEP ','を試してみて下さい。SQL文では策を弄することなく

SELECT AAA, BBB, CCC - DDD, EEE FROM table_A...

で希望される出力が得られるように思います。
    • good
    • 0

Oracle内で条件分岐をしたい時には、「CASE述語」や「DECODE関数」といった一般関数がありますね。



ORACLE MASTER Bronze SQL基礎I 講座(4)
SQLの関数を使いこなす
■理解しておきたいこと
3.一般関数
http://jibun.atmarkit.co.jp/lskill01/rensai/bron …
    • good
    • 0

カッコで括って、演算順序を明確にしてあげてください。



SELECT
AAA || ',' ||
(CASE WHEN AAA<0 THEN BBB*100 ELSE BBB END) || ',' ||
  (CCC - DDD) || ',' ||
EEE
FROM
table_A

この回答への補足

ご回答ありがとうございます。
ただ、括弧でくくるのは試してみましたが、結果は同じでした。
なお、実際は複数のテーブルを結合してますが関係ありますでしょうか?

select
A.AAA || ',' ||
B.BBB || ',' ||
(C.CCC - D.DDD)
from
table_A A
innner join
table_B B
on
・・・

どうぞよろしくお願い致します。

補足日時:2008/07/23 06:53
    • 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

で確認ができる。

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 テーブル名
みたいにカラムを連結させてしまう方法もありますよ。

QバッチからのSQLPlusの実行について

こんばんは。
現在、バッチジョブからSQLPlusを起動してSQLファイルの
SQL文を実行して以下の処理をしたいと考えておりますが
技術敵には可能でしょうか?

1.3つのパラメータをユーザが入力
2.1つの値についてマスタを検索して存在しない場合はエラー。
3.2でマスタに存在した場合、パラメータで他のテーブルを更新。

現時点では入力されたパラメータで更新処理はできたのですが
マスタをチェックして存在の有無の戻り値を取得して
処理を分岐するといったことができるのかよくわかりませんので
どなたかご教授ください。

Aベストアンサー

PL/SQLを使ってはいかがですか?

accept para1 prompt パラメータ1入力して下さい
accept para2 prompt パラメータ2入力して下さい
accept para3 prompt パラメータ3入力して下さい

declare
cnt int;
begin
select count(*) into cnt from master1 where para1 = &para1;
if cnt = 0 then
DBMS_OUTPUT.PUT_LINE('para1はありません');
QUIT;
end if;
'para2,para3もチェック・・・ただし省略
update TBL_A set para1 = &para1,set para2 = &para2 ・・・;
end;

環境が無いので動作確認していません。

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k22.htm

PL/SQLを使ってはいかがですか?

accept para1 prompt パラメータ1入力して下さい
accept para2 prompt パラメータ2入力して下さい
accept para3 prompt パラメータ3入力して下さい

declare
cnt int;
begin
select count(*) into cnt from master1 where para1 = &para1;
if cnt = 0 then
DBMS_OUTPUT.PUT_LINE('para1はありません');
QUIT;
end if;
'para2,para3もチェック・・・ただし省略
update TBL_A set para1 = &para1,set para2 = &para2 ・・・;
end;

...続きを読む

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

QPL/SQLでSPOOLさせたいのですが、可能でしょうか?

PL/SQLにてSPOOLにてSELECTの結果を
ファイル出力させたいのですが、
(下記のような感じです。)
エラーとなってしまいます。

そもそも、PL/SQLにてSPOOLは使用可能なのでしょうか?

例)
declare
 begin
  spool c:\test_spool.dat
   select * from dual;
  spool off
end;

この例では
「PLS-00103: 記号"C"が見つかりました。」という
エラーメッセージがかえってきます。。。

出力ファイルの指定のしかたが悪いのでしょうか?

ご教授いただければ幸いです。

DBはOracle9iです。

Aベストアンサー

DBMS_UTLパッケージを使用して、外部ファイルに出力することが出来ます。

SPOOLは、GUIユーティリティのコマンドであって、SQL文内では使用できないと思いますよ。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QPL/SQLをWindowsのBATファイルで実行するには

いつも参考にさせていただいております。
表題のとおり、WindowsServer2003上でBATファイルを起動したいのですが、うまくいきません。

BATファイルの中身
sqlplus USER_A/USER_A @DB_A @SQLPAT
sqlplus USER_B/USER_B @DB_B @SQLPAT

SQLPATファイルは、大体以下の感じで、2つのスキーマーで同じPL/SQLを実行します。

Declare

カーソルループ
更新


END;

タスクにBATファイルを登録し実行すると
最初のPL/SQLは実行されますが、次のUSER_Bが実行されません。

どなたか詳しい方ご教授をお願いできませんでしょうか?
オラクルのVerは9iです。よろしくお願い致します。

Aベストアンサー

pl_sqlは予めDBに登録しておく。
CREATE OR REPLACE PROCEDURE pl_hoge()
IS
・・・
BEGIN
・・・
END;
/

■hoge.bat
sqlplus user/pass@dbname @hoge.sql

■hoge.sql
SET serveroutput ON;
BEGIN
pl_hoge();
END;
/
exit;

1さんはhoge.sql最後のexit;を指摘してます。
私もそれと疑いますが。

Qバッチファイルを使用したsql@plusの実行及びログ出力について

バッチファイルを使用したsql@plusの実行及びログ出力について

Windows Server 2003上で動作しているOracle10gのDBに対して
Windows XP上に配置したバッチファイルをタスクで起動させ、
sql@plusを使用してデータを削除する処理を行いたいと考えています。

---data_delete.bat---
@echo %date% %time% データ削除開始 >> log.txt
sqlplus -S USER/PASS@TNSNAME @data_delete.sql >> log.txt
@echo %date% %time% データ削除終了 >> log.txt

---data_delete.sql---
DELETE FROM TABLE WHERE FLG = 1;
EXIT;

data_delete.batを実行するとlog.txtが出力されます。
---log.txt---
yyyy/mm/dd hh:nn:ss.xx データ削除開始

XXX行が削除されました。

yyyy/mm/dd hh:nn:ss.xx データ削除終了

この時、log.txtの内容を下記のように変更したいのですが、
その方法が分りません。

---log.txt---
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/dd hh:nn:ss.xx データ削除終了 XXX行が削除されました。

できれば[削除件数 XXX 件]と表示させたかったのですが、
自分の調べた限りではできそうにないので、
フィードバックされる文字列をそのまま使う方向で進めています。

上記ログの出力方法ができるようでしたら、
その方法を教えて頂けると嬉しいです。

宜しくお願いします。

バッチファイルを使用したsql@plusの実行及びログ出力について

Windows Server 2003上で動作しているOracle10gのDBに対して
Windows XP上に配置したバッチファイルをタスクで起動させ、
sql@plusを使用してデータを削除する処理を行いたいと考えています。

---data_delete.bat---
@echo %date% %time% データ削除開始 >> log.txt
sqlplus -S USER/PASS@TNSNAME @data_delete.sql >> log.txt
@echo %date% %time% データ削除終了 >> log.txt

---data_delete.sql---
DELETE FROM TABLE WHERE FLG = 1;
EXIT;

dat...続きを読む

Aベストアンサー

batのリダイレクト>>を使わず、SQL*Plus(@ではなく*です)のspoolを使ってはいかがでしょう?

set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
sqlplus -S USER/PASS@TNSNAME @data_delete.sql

data_delete.sqlの中身
--------------------------
whenever sqlerror exit failer
set echo off
spool log.txt
select sysdate||' データ削除開始'
delete from table where flg = 1;
select sysdate||' データ削除終了'
--------------------------

ご希望のように
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/dd hh:nn:ss.xx データ削除終了 XXX行が削除されました。
とするためにはちょっとSQLだけではできないのでPL/SQLを使う必要があります。

batのリダイレクト>>を使わず、SQL*Plus(@ではなく*です)のspoolを使ってはいかがでしょう?

set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
sqlplus -S USER/PASS@TNSNAME @data_delete.sql

data_delete.sqlの中身
--------------------------
whenever sqlerror exit failer
set echo off
spool log.txt
select sysdate||' データ削除開始'
delete from table where flg = 1;
select sysdate||' データ削除終了'
--------------------------

ご希望のように
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/...続きを読む

Qシェルスクリプトでオラクルのエラーメッセージを取得するには

シェルスクリプト上でsqlplusを起動し、さらにSQLの実行結果(エラーメッセージ)を取得するにはどのようにシェルをどのように記述すればよいでしょうか?
----------------------------------------
sqlplus scott/tiger@hoge
SQL>select * from dep;
*
1行でエラーが発生しました。
ORA-00942: 表またはビューが存在しません。
----------------------------------------
上記のようなコマンド実行とエラーメッセージの取得を行いたいのですが、シェルについては超初心者のためよく分かりません。
実行環境は以下の通りですが、ご存知の方教えて頂けないでしょうか。よろしくお願いします。
OS:Red Hat Linux 8.0
DB:Oracle8.1.7

Aベストアンサー

記載ミスをしました。最後に(`)が必要です。

受けとる変数=`sqlplus $USER_ID << ++EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
select * from dep;
++EOF
`

>以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。
>これについてもお気づきの点がありましたらご指摘願えますでしょうか。

上記の例で、wheneverを書いていますが、これにより自前でEXITしなくとも、
SQLエラー時に自動的に脱出されます。
SQLエラーではないけれど、脱出したい時に、EXITを使うのがよろしいかと
思います。

Qテーブルの存在チェックについて

oracle初心者です。
テーブルの存在をチェックする命令はあるのでしょうか?
オンラインマニュアルやSQLポケットリファレンスなどを参考に探したのですが見つかりませんでした。
SELECT count(*) FROM テーブルA・・・などでステータスを判断(ZERO以外は未存在)し存在有無を確認するような方法しかないのでしょうか?
よろしくお願いします。

Aベストアンサー

データディクショナリの USER_TABLES を利用すると良いでしょう。これは表と同様に扱えます。

例えばこのような感じです

select * from user_tables
where table_name = 'TABLE_A';

TABLE_A が(自分のテーブルとして)あれば1件引っかかりますし、なければ結果0件になります。

データディクショナリには他にもいろいろありますので詳しくは参考 URL をご参照ください。

参考URL:http://cyberam.dip.jp/database/oracle/oracle/dd/dd_main.html


人気Q&Aランキング