- PR -

バッチからのsqlplus実行に関して

投稿者投稿内容
もじゃもじゃ
会議室デビュー日: 2007/06/14
投稿数: 8
投稿日時: 2007-06-14 15:18
オラクル初心者です。
初歩的な質問で申し訳ありませんが、どなたか教えていただけないでしょうか。

今バッチからsqlplusコマンドから特定のsqlファイル「abc.sql」を実行しようとしています。
「sqlplus xx/xx@orcl @abc.sql」

この時、特定のファイル「abc.sql」ではなく、あるフォルダ内のすべてのsqlファイルを実行する。ということは出来ないでしょうか?

もう少し具体的に言うと、実行すべきsqlファイル名がyyyyMMddとなるため、ファイルを特定できないので、そのフォルダ内のsqlファイル・・・と考えています。

OSはwindows XP
oracleは10gです。

駄文で申し訳ありませんが、よろしくお願いします。
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2007-06-14 15:53
できますよ。

試しにやってみたら、正常に実行できましたので
お試しあれ。

<実行バッチファイルの内容>
SET W_CONNECT=USERID/USERPW@TNS
for %%a in ( C:\\TEMP\\*.sql ) do SQLPLUS %W_CONNECT% @%%a
pause

このforコマンドを使用すると、指定したフォルダにあるファイルの数だけ処理を繰り返すことができます。
inの後に指定するファイルを「*」とすれば、拡張子がsqlのファイルが
全て実行されます。
コマンドプロンプトで for /? と入力してEnterキーを押すと
細かい説明が表示されますので、見てみてください。


もじゃもじゃ
会議室デビュー日: 2007/06/14
投稿数: 8
投稿日時: 2007-06-14 16:07
なりこ様

本当にありがとうございます!感謝感謝です。
まだ試せてないですが、結果次第、再度ご連絡します。

forコマンドですか。考えもしませんでした。
dir /Bコマンドで*.sqlのファイルを別ファイルに抽出して・・・・とさっぱり行き詰っていました。

ありがとうございます。
もじゃもじゃ
会議室デビュー日: 2007/06/14
投稿数: 8
投稿日時: 2007-06-15 10:46
なりこ様 皆様

さっそく試してみました。処理も無事出来上がりました。
ありがとうございます。

一点気になることがあったので質問させてください。
sqlファイルはファイル名がyyyyMMddで自動生成されます。

この時このsqlファイルの最後に「exit;」があればforコマンドで次のsqlに移行するのですが、exitがない場合
SQL>
の状態で止まってしまいます。

これはやはり自動生成されるSQLに「exit;」がないと解決できない問題でしょうか?
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2007-06-15 11:18
もじゃもじゃさん

上手く実行できて良かったですね。
「exit;」は必要です・・・

ようするに接続したDBから抜けるという意味なので。



もじゃもじゃ
会議室デビュー日: 2007/06/14
投稿数: 8
投稿日時: 2007-06-15 11:58
>なりこ様

やはりそうですか。そりゃそうですよね。
コミットだってどこでするんだって話になりますものね。

恥の上塗りでもう一つお聞きしたいのですが、
コマンドラインからforコマンドのループ毎に一緒に
"exit;"を実行するなんてことはさすがに無理ですか??

すいません、質問ばかりで・・。
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2007-06-15 12:18
もじゃもじゃさん

SQLPLUSでのexit;は「SQLPLUSの終了」という意味なので
コマンドプロンプトからSQLPLUSへ接続し、制御が渡されている限り
SQLPLUS側でexitする必要があるんです。

sqlファイルが生成される際に、exit;も記述するように対応しないと
ダメだと思います。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2007-06-15 13:24
もし、sqlファイルを生成する際に、「exit;」を記述するが難しいのであれば
以下のように、一旦中間ファイルに出力して実行してみてはどうでしょうか

コード:

@echo off

@SET W_CONNECT=USERID/USERPW@TNS

@for %%a in (C:\TEMP\*.sql) do (
type %%a > tmp.sql
echo exit; >> tmp.sql
SQLPLUS %W_CONNECT% @tmp.sql
)
@del tmp.sql





[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2007-06-15 13:42 ]

スキルアップ/キャリアアップ(JOB@IT)