• 締切済み

シェル上で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]で停止する想定です。

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

みんなの回答

  • entree
  • ベストアンサー率55% (405/735)
回答No.4

-- #!/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)
回答No.3

こんにちわ。 #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)
回答No.2

ストアドプロシージャで無限ループさせてしまうのはどうでしょうか?

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 試してないけど、こんな感じでしょうか? 毎回、SQL*Plus の起動, DB への接続が行われます。 # /bin/sh while ( true ) do sqlplus Userid/Passwd@sid << EOF exec dbms_mview.refresh('mview_name','c'); exit EOF done

shawn001
質問者

お礼

ご教授いただきありがとうございます。 確かに、私も最初に行き着いたのが、 正にこれなのですが、毎回ログイン→ログアウトが入るのを避けたく、 あくまで、リフレッシュコマンドのみをループさせたいと考えております。 ...これって、そう簡単にはできない感じだったりするのでしょうか・・・

関連するQ&A

  • ループを途中で抜けたいのですが。

    無限ループさせているwhileやfor文などで、 何かのキーを押すとループを抜けるように設定したいのですが可能でしょうか? (scanfやcinなどをループの中に組み込まずに。ctrl+Cも無しで。) (あと、フォーム上ではなくコンソール上で。) 多分説明不足なのでもうちょっと詳しく。 たとえば、 while ( i != 1 ){ j += 1; } の様な無限ループを設定したとして、 本来なら if (j > 100 ){ break; } とか、 while文の中に scanf ( "%d" , &i ); 等を入れて終了条件を満たさせるべきですが、 そうではなく、ひたすら無限ループを続けているところにEscキーを押すとループから脱出するようなプログラムを作ってみたいのです。 そういうプログラムは可能でしょうか? どうかご教授下さい。 使用コンパイラ:Visual C++ 2008 Express Edition

  • ループ処理の中におけるDB接続について(java)

    ループ処理の中におけるDB接続について、接続→切断を繰り返すと処理速度が落ちますよね。 これを回避するにはSQLでできる限り取得するのが良いと思われますが、その他にプログラムで 回避することはできますかね? whileの中でさらにSQLを使用する必要があります。 どなたかご教授願います。

  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • whileで最後のループを判別するには?

    環境:php5 Q. DBから取得した値をwhileでループさせたとき、最後のループを取得するにはどうしたらいいのでしょうか? 現状ではループさせる数を最初に取得して、whileさせているときに$i++でカウントさせながら、合計の数とイコールになったときに最後と判断させていますが、もっとスマートに記述する方法などはあるのでしょうか? smartyだとlastで取得できるみたいですけど。 ご教授いただけると幸いです。

    • 締切済み
    • PHP
  • ループが回らない

    #include<stdio.h> #include<string.h> #define HASH_SIZE 100 #define NAME_SIZE 20 char name[ HASH_SIZE ][ NAME_SIZE ]; i int hash_func( char str[] ) { } void main() { char s[ NAME_SIZE ],i; int index ; while(1){ printf("文字を入力!"); scanf("%s",s); if( s[0]='.') break; index = hash_func(s); strcpy( name[ index ],s) ; printf("*\n"); } } このプログラムの 無限ループのところがぜんぜん回らないんです。 自分なりに試行錯誤してみたのですが 限界に達しましたので助言をいただきたいです。 上の関数は今はなにも書いてないですが、 書いてあっても動かないです。 月曜日提出の課題なので なるべく早め回答いただけると幸いです。 アドバイスお待ちしております。

  • BGPのnetworkコマンドについて

    BGPのnetworkコマンドについてについて教えてください。 自身のループバックアドレスを直接接続されているルータにアドバタイズしたいと考えていますが、どのようなコマンドを入力すればいいのでしょうか。 ループバックアドレス:10.1.1.1/32 network 10.1.1.1 mask 255.255.255.255 上記コマンドでいいのでしょうか。お忙しい中お手数ですが、ご教授いただけましたら幸いです。

  • 【Bシェル】戻り値取得について

    はじめまして。 Bシェルでの開発が初めてで、色々と調べてはみたのですが どうしても解決できなかったため投稿させて頂きました。 お忙しい中大変恐縮ですが、ご教授頂けると幸いでございます。 【やりたい事】  →例えば、"mysqladmin -uUSER_NAME -pPASSWORD create DB_NAME"と    いうコマンドをBシェル内に書き、既にDBが登録されていた場合、    "mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'DB_NAME';     database exists'"    というエラーメッセージが出力されると思いますが、そのエラーメッセージ    を変数に入れたい。 以上、ご確認をお願い致します。

  • shellからsqlplusでコマンドを順次実行

    shellスクリプトから sqlplus @AAA.sqlを実行する。 以下:AAA.sql @home/~/aaa.sql @home/~/bbb.sql quit; 以下:aaa.sql exec dbms_refresh('XXX'); 以下:bbb.sql set serveroutput on set linesize 1000 set pagesize 0 set trimspool on set feedback off whenever oserror exit 9 whenever sqlerror exit 5 MERGE ~ 中略 commit; exit ---------------- 以上、がソース内容です。 aaa.sqlでexitしていないのにbbb.sqlへ処理が移行しません。 ログ見てみるとリフレッシュコマンド実行後に接続が切れてしまっているようです。 処理概要ですが、あるMVをリフレッシュ後にそのMVを使用してMERGE文を実行するという処理です。 上記説明で原因特定は可能でしょうか? よろしくお願いいたします。

  • とある特定のフォルダで無限ループに陥る

    Sub 全てのファイル名を振り直す() i = 1 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(フォルダ名) For Each MyFolder In .SubFolders NewFolder = MyFolder.Name Call フォルダ内のファイル名を変更する(NewFolder) Next End With End With Set myFSO = Nothing End Sub Sub フォルダ内のファイル名を変更する(NewFolder As String) Debug.Print NewFolder strPathName = フォルダ名 & NewFolder & "\" strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" Name strPathName & "\" & strFileName As strPathName & "\" & Format(i, "0000") & ".gif" i = i + 1 strFileName = Dir() Loop End Sub こんな感じでフォルダの中のファイル名をループし、変更しているのですが とあるフォルダの中をループすると、 無限ループに陥ります。 原因は、 strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" の時点でファイル名を変更するのでいつまでたっても終わりが来ないからなのですが フォルダ仮1は大丈夫なのに、フォルダ仮2をループし始めると無限ループに陥ります。 フォルダ名に問題があるのでしょうか? フォルダ名はネットには書けません。

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

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