ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

sqlplusから実行したSQLの結果をシェルで判定するにはどうすれば良いですか?
SQLコードかなんらかのステータスコードを拾いたいのですが。。


#!/bin/sh
# sample1.sh top

sqlplus user/pass@db @sqlfile.sql

# ここにステータス判定を入れたい

# sample1.sh bottom



----- sqlfile.sql -----
create table tb1 (it1 varchar(1) );
quit;
----- sqlfile.sql -----

A 回答 (1件)

WHENEVER SQLERROR EXIT 1;


create table tb1 (it1 varchar(1) );
quit;

これで、エラーが発生するとステータス 1 が返るようになります。
    • good
    • 1

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

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

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

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

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

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を使うのがよろしいかと
思います。

Qsqlplusの操作をシェル上で

RedhatLinuxのシェルスクリプト上で
Oracleのsqlplus操作を行うことは可能でしょうか?
その場合、どのように記述すればよいでしょう?

やりたい内容の例としては以下になります。

#!/bin/sh
su -<oracleユーザー>
sqlplus ※※※※
SQL> update ※※※ set ※※※
SQL> exit

上のような内容をcronに登録して自動処理をかけたいと考えています。

Aベストアンサー

シェルスクリプトファイル以外のファイルを作成したくない場合はyjousさんのようにヒアドキュメントを使用するのがいいと思います。
もし、sqlを記述したファイルを置いてもかまわないのであれば
sqlplus ユーザ/パスワード @sqlファイル名
をシェルスクリプト内で書けばいいと思います。
(ファイル名はフルパスで。ファイルの最後にexitを忘れずに。)

シェルスクリプト内でsuでoracleユーザにしていますが、それならcronの登録で

0 * * * * su - oracle -c "シェルスクリプトファイル"
のようにoracleユーザにして実行してみたらどうでしょうか?(oracleはoracleユーザーとしてみてください)

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

で確認ができる。

Qシェル(Unix/Linux)を使用してDBアクセス

上題どおりなのですが

シェルスクリプトを使用してORACLEなどDBへのアクセス・データ操作は
可能なのでしょうか?。

仮にできないとなると、業務系開発ではORACLEとシェルはどのように
組みあわせて使うのでしょうか?。。想像としては

・Oracleのコマンドでデータをテキストに出力しシェルで読みこみ

などが考えられますが・・。他にもDB関連で「こんな時にも使う」など
ノウハウがあれば是非教えて頂ければと思います。

よろしくお願いします。

Aベストアンサー

>シェルスクリプトを使用してORACLEなど
>DBへのアクセス・データ操作は
>可能なのでしょうか?。

は可能です。ぐだぐだ説明するより例を示した方が
分かり易いと思うので...

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF
select table_name from user_tables;
EOF #必ず行頭に!!

要するにEOFとEOFの間にSQL*Plus上で実行したい
コマンドを入力するだけです。
ここで気をつけないといけないのは2つ目の終わり
を示すEOFは必ず行頭に記述しなくてはいけない
という点です。
if文やwhile文の中で使うときについついインデント
をつけてしまいますが閉じる意味のEOFは必ず
行頭です。

ただ、業務系開発となるとあまりシェルスクリプト
でプログラムを開発することは少ないかと思います。
理由は2つあって

1.性能が悪い
2.セキュリティ的に好ましくない

1はシェルスクリプトでDBにアクセスする場合、
SQL*Plusで接続することが多くなりますが、SQL*Plus
は管理用モジュールの意味合いが強く、あまり
アクセスの最適化は計られていません。
よって同じ命令を投げてもPro*CやOCIと比較して
性能は良くないです。
また、シェルは実行毎にコンパイルが行われるので
それもあまりよろしくありません。

2はサーバ側にviなどで簡単に開けるtext形式ファイル
として配置するためサーバにさえログインすれば
どういった処理が行われているのかが簡単に把握でき、
やろうと思えば書き換えだってできてしまいます。
Pro*Cプリコンパイル、Cコンパイルなどを行えば
ロードモジュール化されるので実行はできても
内容の閲覧や修正は不可能です。
またご存知かもしれませんがOracleには
ストアドプロシージャという昨日もあり、
事前にコンパイル済みの状態でOracleのメモリ領域に
プログラムを常駐させておくことも可能です。

シェルスクリプトによるSQL*Plus経由のOracleアクセス
は主に非定期、非定型で行われるDB管理などに
用いると思ったほうがよいかと思います。

>Oracleのコマンドでデータをテキストに出力しシェルで読みこみ
はちょっと意味がよく分からないのですが、
Oracleの出力結果をログファイルに
吐き出したいのであればSQL*Plusであれば一番最初に
spool log.txt
と入力しておけばそれ以降の出力はlog.txtに出力
されます。
先述したEOFを使う場合は

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF > log.txt
select table_name from user_tables;
EOF #必ず行頭に!!

としても同様にlog.txtにその結果が出力されます。

>シェルスクリプトを使用してORACLEなど
>DBへのアクセス・データ操作は
>可能なのでしょうか?。

は可能です。ぐだぐだ説明するより例を示した方が
分かり易いと思うので...

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF
select table_name from user_tables;
EOF #必ず行頭に!!

要するにEOFとEOFの間にSQL*Plus上で実行したい
コマンドを入力するだけです。
ここで気をつけないといけないのは2つ目の終わり
を示すEOFは必ず行頭に記述しなくてはいけな...続きを読む

Qバッチからsqlplusの接続エラーの検知について

バッチからsqlplusの接続エラーの検知について

環境:Xp、Oracle11g

バッチからsqlpulusを起動してPL/SQLを動かしてるのですが
DB接続に失敗した時に%ERRORLEVEL%では接続エラー時には
0が戻ってきてしまいエラーを検知できませんでした。

DB接続に失敗した場合、検知する方法を模索しております。

識者の方、助言を頂ければ幸いです。

Aベストアンサー

今、環境が無くて確認できないんですが、
sqlplus -L /nolog
WHENEVER OSERROR exit 9
WHENEVER SQLERROR exit 9
connect ユーザ名/パスワード
ではどうでしょうか?特にsqlplusの-Lオプションは使えそうな感じですが。

QSQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書

SQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書いています。

イメージ
sqlplus scott/tiger << EOF
  declare
    aaa number;
  begin
    -- *1
    select col1 into aaa from test1;
  end;
  /

  -- *2
  define a=1
  define b=1
  @test.sql
EOF


ここで*1にて例えば複数行が返ってくるなどのエラーが
発生した場合、*2以降のSQLを実行せずにSQL*Plusから抜けたいのですが
どのようにすればよいかわかりますでしょうか。

whenever sqlerror exit 255

などはPL/SQL内の論理エラーはハンドリングしてくれないようです。

よろしくお願いします。

それかdefineや@マーク指定によるsqlファイルの取り込みを
PL/SQLの中で実行できる方法を教えていただく方法でも
当方が実施したいことはできるのでそれでもかまいません。

Aベストアンサー

SQLPLUSで投入したPL/SQL無名ブロック内でのエラーでも、「whenever sqlerror ~」で、
キャッチできますよ。少なくともWindows版SQLPUSは、そういう動作です。
発生源が、SQL文であっても、PL/SQL無名ブロックでも、ORA-nnnnnのエラーを拾わないと
「whenever sqlerror ~」の意味が無いですからね。

QPL/SQLで…SQLの実行結果を変数を格納する方法

毎度お世話になります。

SQL文の実行結果を変数に格納する方法がわからず困っております。
ご存知の方が居られましたらご教示いただきたい所存です。

常に1つの値しか返さないようなSQL文なので
変数V number := 'select count(B列) from B表';

みたいな書き方はで
入るか見てみようと思ったのですが

コンパイルはできるものの、
実行すると「文字から数値への変換エラー。が発生しました」と
なって上手くいきませんでした。

'select count(B列) from B表'が単なる文字列として解釈されて
エラーになっているのだとは思うものの
正しい書き方がわからないのでよろしくお願いいたします。

Aベストアンサー

変数V number;
select count(B列) into 変数V from B表;

こういうこと?

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

QOracleで流したSQLのログを取得できますか?

ASP+Oracle9iで作られたシステムがあります。
Oracleの設定などは前任者がしており、まともな引継ぎを受けないまま私が維持運用員となりました。
現在DBからあるレコードが消えてしまい(最初から作られてない可能性もあり)、顧客からクレームがついています。
状況から考えて怪しいプログラムを調査したのですが、原因不明でした。
そこで、Oracleの方で今まで流れたSQLをログとして保存していれば手がかりがつかめるのではないかと思い、情報を探しているのですが見つからないので教えて頂きたいのです。
私はOracleの知識(管理面について)が殆どなく、Oracleを使うことはできるが、Oracleの設定がどういう状況になっているか調べることもできず、資料もありません。

1.そもそもOracleにSQLをログとして保存する機能があるのか?
2.あるとすれば、保存機能が有効になっているか、保存したファイルがどこにあるかをどこで確認できるか?

以上の点についてご存知の方、どうぞ回答よろしくお願いします。

Aベストアンサー

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができます。
  アーカイブログモードになっているかどうかは、下記で確認できます。
   SQL> select log_mode from v$database;

  また、どのアーカイブログファイルを調査するかは下記を参照すれば良いと思います。
   SQL> select name,to_char(completion_time, 'yyyy/mm/dd hh24:mi') adate from v$archived_log;

2.フラッシュバック問い合わせ
  これは初期化パラメータUNDO_MANAGEMENTがAUTOに設定されており、かつUNDO_RETENTIONが保存期間として適切に設定されている場合のみ使用できます。
  やっていることは、UNDO表領域(旧RBS用表領域)の中に残っている実行履歴を参照しています。したがって、データベース設計時にフラッシュバック問い合わせを前提としていない限り、使える可能性は低いです。

3.その他
  監査を実行していれば、実行SQLを取得できる可能性があります。
  ただし、監査レベルなどを理解しておかないと、すべてのSQLが取得されていない可能性がありますので、難しいかもしれません。

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができま...続きを読む


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

人気Q&Aランキング