• 締切済み

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文を実行するという処理です。 上記説明で原因特定は可能でしょうか? よろしくお願いいたします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

ここはLinuxのカテゴリなので、Oracleのカテゴリで聞いた方が、知っている人が見てくれるかと。

関連するQ&A

  • バッチからのSQLPLUS実行について

    はじめまして。 SQLPLUSでご質問ををさせてください。 環境 OS:Win2003server Oracle:10g バッチから、以下のようにSQLを実行したいと考えています。 バッチファイル sqlplus ID/PASS@インスタンス名 @SQLファイル.sql SQLファイル.sql set trimsool on set pagesize 0 set linsize 2000 set feedback off set colsep ',' spool on spool ABC.txt select * from xxx; spool off exit; ご質問  バッチファイルからSQLファイル.sqlが呼ばれているのですが、  接続時にENTERキーを押下しないと、後続の処理が実行されません。  ENTERキー押下後のメッセージ内容が  「バージョン情報の表示や、接続されました。」と出力されているため、  接続時の処理と思われます。    上記でENTERキーを押下せずに、処理を実行させるためにはどうすればよろしいでしょうか。  初歩的な質問で申し訳ありませんが、宜しくお願い致します。

  • sqlのエラーハンドリングについて質問です。

    シェルからsqlplusを実行し、そのsqlplusで発生したエラーをハンドリングするために、 出力内容をORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) で検索して判定しています。 また、SQLで何らかのエラーが発生した際に処理を終了させるために、 SQL実行前に whenever sqlerror exit; whenever oserror exit; を定義しています。 何らかのエラーが発生した際は、ORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) が出力されるため、エラーハンドリングは可能と考えているのですが、 sqlplusのstartコマンドでsqlファイルを実行した場合のみ、エラーコードが出 力されないため、ハンドリングできません。 ■実行例 SQL> start 存在しないsqlファイル O/Sメッセージ:No such file or directory 切断しました。 試しにwhenever oserror exit;の記述を削除したところ SP2-0130が出力されエラーハンドリングできました。 whenever oserror exit; の記述があるとエラーコードが出力されないのはなぜでしょうか??

  • sqlplusでヘッダーが付かない

    サーバー:windows 2003server oracle10g クライアント:windows xp oracle10g 以下のsqlファイルをbatで起動し、テキストファイルを出力しています。 しかしながら、setのところにヘーダーを出力するよう宣言しているのに もかかわらず、出力されません。 どなたかおわかりになる方、いらっしゃいませんでしょうか? set echo off set heading on set underline off set termout off set pause off set pagesize 0 set trimspool on set feedback off set termout off set linesize 1000 set lines 30000 spool hoge.txt select aaa||CHR(9)|| bbb||CHR(9)|| ccc||CHR(9)|| ddd from M_JITU; spool off EXIT

  • 【初心者です】SQLPLUSでのバッチ実行時の引数(パラメータ)指定について

    SQLPLUSは詳しくなく、躓いてしまいました。 ストアドプロシジャを「aaa.sql」として作成して、 C直下に配置しました。 それをSQLPLUSから実行したいのですが、 パラメータの指定がうまくいきません。 SQL> @C:\aaa('BBB','CCC'); 上記のようにしても「ファイルがオープンできません」 と表示されてしまいます。 「(~)」を取り外して実行すると、動くみたいですので パラメータの指定が間違っているみたいです。 よろしくお願いします。

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

    こんばんは。 現在、バッチジョブからSQLPlusを起動してSQLファイルの SQL文を実行して以下の処理をしたいと考えておりますが 技術敵には可能でしょうか? 1.3つのパラメータをユーザが入力 2.1つの値についてマスタを検索して存在しない場合はエラー。 3.2でマスタに存在した場合、パラメータで他のテーブルを更新。 現時点では入力されたパラメータで更新処理はできたのですが マスタをチェックして存在の有無の戻り値を取得して 処理を分岐するといったことができるのかよくわかりませんので どなたかご教授ください。

  • sqlplusの操作をシェル上で

    RedhatLinuxのシェルスクリプト上で Oracleのsqlplus操作を行うことは可能でしょうか? その場合、どのように記述すればよいでしょう? やりたい内容の例としては以下になります。 #!/bin/sh su -<oracleユーザー> sqlplus ※※※※ SQL> update ※※※ set ※※※ SQL> exit 上のような内容をcronに登録して自動処理をかけたいと考えています。

  • 以降のスクリプトを実行せずに終わるシェルスクリプトの書き方

    Linux上で動かす以下のようなシェルスクリプトを作っています。 ▼------------------------------- if [ -d /home/aaa ]; then   処理1 else   処理2 fi 処理3 ▲------------------------------- この場合、/home/aaaが存在するかどうかに関わらず、 「処理3」は実行されてしまいます。 これを、 「/home/aaaが存在しない場合は処理2を行ってからスクリプトを終了する」 といった内容にしたいです。 現状はそれの書き方が見つからないので、処理1の次の行に処理3を書き込んで同じ結果にしています。 (そのためどんどんif文の階層が深くなり、全ての記述がif文の中に入っていく・・・) エクセルのVBAで言うところの、Exit Sub に該当する記述が理想的です。 そのような書き方がありましたら教えてください。

  • プロシージャの戻り値を取得する方法

    perlからSQLPLUS->プロシージャを実行してその戻り値を取得。 戻り値が0なら次の処理へ、0以外ならエラー処理へというようなことをやりたいと思っています。 perlの実行コマンドは以下。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; $sql_ret = system("$sqlcmd") >>8; この$sql_retにプロシージャの戻り値が入るようにしたいのです。 プロシージャを実行する$SQLFILEは以下のようなSQLです。 --------------------------------------------------- set serveroutput on WHENEVER SQLERROR EXIT 1 spool &1; DECLARE RetVal NUMBER; BEGIN RetVal := 実行ストアドファンクション; END; / spool off; EXIT SQL.SQLCODE; ---------------------------------------------- エラーが起きたときにファンクションは1を返すようにしているのですが、 それがSQLPLUSの実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。

  • コマンドプロンプトの繰り返し処理について

    コマンドプロンプト初心者です。 今回、同じファイルをWebサーバー上の複数のフォルダにアップロードするバッチを組みたいのですが、「for」による繰り返し処理がうまくできません。 さらに具体的にいいますと「public_html/10」「public_html/11」「public_html/12」「public_html/13」それぞれに「AAA」というフォルダを作り、その中に「BBB.txt」というファイルをアップロードしたいのです。 なお、「public_html/10」に「AAA」というフォルダを作り、その中に「BBB.txt」というファイルをアップロードをおこなう、という一度だけの処理はできています。ですが、forを使い、繰り返し作業をおこなおうと試みるも、うまくいきません。 以下が作成したFTPコマンドです。 ------------------------------ open XXX.XX.XX.XX name password For /L %%a in(10,1,13) do ( cd /public_html/%%a mkdir AAA cd /public_html/%%a/AAA put C:\BBB.txt BBB.txt) EXIT       ------------------------------ お手数ですが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • タスク実行でコピーできない

    手動で以下の内容のバッチを起動すると問題なく指定の場所にコピーできますが タスクに登録して実行するとファイルは、作成されていますが指定の場所にコピー出来ません。 ◆バッチ echo on C:\oracle\product\10.2.0\client_1\BIN\sqlplus ****/*****@*** @C:\temp\Daily\TBL_USR.sql %1 %2 set CHECKLOG_DIR=\\******IPアドレス\test copy TBL_USR.csv %CHECKLOG_DIR%\TBL_USR.csv ◆SQL文 set UNDERLINE OFF SET COLSEP ',' set linesize 1000 set pagesize 25000 SET FEEDBACK OFF spool C:\temp\Daily\TBL_USR.csv SELECT a, b, c, d FROM TBL_USR WHERE DELKB <>1; spool off; exit; exit; ◆タスク結果 (0x1) ◆環境 windows Sever 2008 R2 Enterprise