- 締切済み
シェル上でDBコマンドをループさせる方法
こんにちわ。 取り急ぎ有識者の方にご教授いただきたい点があります。 シェル上にて、以下のようなことをやりたいのですが、上手くできません。 --ココから # /bin/sh sqlplus Userid/Passwd@sid while true <--無限ループ do exec dbms_mview.refresh('mview_name','c'); <--マテビュー(mview_name)を完全リフレッシュ done exit 0; --ココまで 上記のように、sqlplusにてDBにログインした後、 リフレッシュコマンドをlinuxコマンドのwhile文で挟んでしまうと、 「oracleに"while・・"のようなコマンドはありません。」 のようなエラーメッセージが出て怒られてしまいます。 こういった場合の回避策・正しい書き方をご教授ください。 よろしくお願いします。 P.S 因みに、上記のようなことをやりたい理由として、 DBへの負荷試験(※)を実施するのが目的となります。 ※断続的にリフレッシュを実行し続ける 無限ループでブン回し続けて、試験終了後、 Ctrl+[c]で停止する想定です。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- entree
- ベストアンサー率55% (405/735)
-- #!/bin/sh while :; echo "exec dbms_mview.refresh('mview_name','c') -- マテビュー(mview_name)を完全リフレッシュ" sleep 60 done | sqlplus Userid/Passwd@sid exit 0; -- これで60秒ごとにコマンドがSQL*Plusに送られリフレッシュが実行されるはずです。
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 #1 のmuyoshid です。 > あくまで、リフレッシュコマンドのみをループさせたいと考えております。 > ...これって、そう簡単にはできない感じだったりするのでしょうか・・・ スクリプトを分割すれば可能です。 動作確認はしていませんが、こんな感じになります。 [mview_refresh.sql] ----------------------------------------------------------------- exec dbms_mview.refresh('mview_name','c'); ----------------------------------------------------------------- [mview_refresh.sh] ----------------------------------------------------------------- #!/bin/sh sh ./mview_refresh2.sh | sqlplus Userid/Passwd@sid exit ----------------------------------------------------------------- [mview_refresh2.sh] ----------------------------------------------------------------- #!/bin/sh SLEEP_SEC=10 echo "whenever sqlerror exit failure" while ( true ) do echo "@mview_refresh.sql" sleep ${SLEEP_SEC} done ----------------------------------------------------------------- コマンドラインから実行するのは、mview_refresh.sh です。 SLEEP_SEC を調整すれば、一定間隔待機させて実行させられます。
- pa_cotta
- ベストアンサー率43% (25/58)
ストアドプロシージャで無限ループさせてしまうのはどうでしょうか?
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 試してないけど、こんな感じでしょうか? 毎回、SQL*Plus の起動, DB への接続が行われます。 # /bin/sh while ( true ) do sqlplus Userid/Passwd@sid << EOF exec dbms_mview.refresh('mview_name','c'); exit EOF done
お礼
ご教授いただきありがとうございます。 確かに、私も最初に行き着いたのが、 正にこれなのですが、毎回ログイン→ログアウトが入るのを避けたく、 あくまで、リフレッシュコマンドのみをループさせたいと考えております。 ...これって、そう簡単にはできない感じだったりするのでしょうか・・・