[前の記事]« FDの交換を促しながらCOPYをしたい
[次の記事]FORのループ内で個々のファイルの圧縮処理ごとにLHA32.DLLの戻り値を検査したい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「SQLとコマンド・プロンプト」索引へ

バッチで実行するSQLファイルにパラメタを与える方法


453) バッチで実行するSQLファイルにパラメタを与える方法 宇和野空 2003/07/22(火) 16:36


こんにちわ。

このようなことが可能なのか教えて頂きたくて載せてみました。
マシンはWinNT4.0とWin2000Proで動作させています。

現在、OracleのSql Plusにて実行するSQL文の記述されたファイル
(OraEX.SQL)があるとします。
OraEX.SQLの内容は以下の通りです。
*******************************************
spool D:\TextLog\A_SYOHIN.log
Set echo on
SELECT COUNT(*) FROM A_SYOHIN;
spool off;
exit;
*******************************************

実行するバッチファイル(ORA_SQL.BAT)は、
*******************************************
echo on
C:\Oracle\Ora81\bin\SQLPLUS Userid/Password@接続文字列 @D:\Sql\OraEX.SQL
*******************************************
となっています。

で、SQLに条件をつけて絞り込みを行おうとした場合、先程のSQL文の
*******************************************
SELECT COUNT(*) FROM A_SYOHIN
WHERE M_DATE BETWEEN yyyymmdd AND yyyymmdd;
*******************************************
WHERE以下を追加し、DOS画面から年月日(yyyymmdd)の2つの
パラメタを与えたいのですが、バッチファイルおよびSQLファイルを
どのように変更したら良いでしょうか?

誰かおわかりになる方がいらっしゃいましたら、是非お願いします。

ちなみにOracleバージョンはR8.1.6です。


454) Re:バッチで実行するSQLファイルにパラメタを与える方法 ふぇむ 2003/07/23(水) 10:56


>実行するバッチファイル(ORA_SQL.BAT)は、
>*******************************************
>echo on
>C:\Oracle\Ora81\bin\SQLPLUS Userid/Password@接続文字列 @D:\Sql\OraEX.SQL
>*******************************************
>となっています。

>で、SQLに条件をつけて絞り込みを行おうとした場合、先程のSQL文の
>WHERE以下を追加し、DOS画面から年月日(yyyymmdd)の2つの
>パラメタを与えたいのですが、バッチファイルおよびSQLファイルを
>どのように変更したら良いでしょうか?


古~い記憶しかないのですが...

sqlplus上で、パラメータではなくSQL文そのものの直接編集(文自体の変数渡し含めて)はうまくできない(結局内部or外部エディタに行って戻るしかない)のではなかったでしたっけ。
PL/SQLブロックにして2つのSQL文を分岐するようにして、パラメータによってどちらかを選ぶ、ならできたかも。

上のようなことを避けて、単純にやるなら、@コマンドで実行するSQL文を複数用意して、起動を切り替えるのが一番楽ではないでしょうか。

yyyymmddなどのパラメタの渡しかたとしては、階層を越えてDOS側の環境変数をsqlplus側で変数にセットすることはできたと思います。昔書 いたサンプルとなるようなコードが見つからなくて例示できなくて申し訳ない。@コマンドではなくて、標準入力から流し込んだかもしれません。

あまり役に立たなくてごめんなさい。


455) Re2:バッチで実行するSQLファイルにパラメタを与える方法 ふぇむ 2003/07/23(水) 11:00


sqlplus のコマンドヘルプですが、

C:\>sqlplus -h
使用方法: SQLPLUS [ [<option>] [<logon>] [<start>] ]
<option> ::= - | -? | [ [-M <o>] [-R <n>] [-S] ]
<logon> ::= <username>[/<password>][@<connect_string>] | / | /NOLOG
<start> ::= @<filename>[.<ext>] [<parameter> ...]
"-" 構文の使用方法を表示します。
"-?" SQL*Plusのバージョン・バナーを表示します。
"-M <o>" HTMLマークアップ・オプションを使用します。 <o>
"-R <n>" 限定モードを使用します。 <n>
"-S" サイレント・モードを使用します。

となっているので、起動時に引数としてパラメタは渡せそうですね。


456) Re3:バッチで実行するSQLファイルにパラメタを与える方法 宇和野空 2003/07/23(水) 16:11


ふぇむさん、レスありがとうございます。

>起動時に引数としてパラメタは渡せそうですね。

パラメタが渡せるということを教えて頂き、それをきっかけにいろいろ調査した結果、以下で動作できることを確認しました。

まず、実行するバッチファイル(ORA_SQL.BAT)は、
*******************************************
echo on
C:\Oracle\Ora81\bin\SQLPLUS Userid/Password@接続文字列 @D:\Sql\OraEX.SQL %1 %2
*******************************************
とします。

OraEX.SQLの内容は以下の通りに修正します。
*******************************************
spool D:\TextLog\A_SYOHIN.log
Set echo on
SELECT COUNT(*) FROM A_SYOHIN
WHERE M_DATE BETWEEN &1 AND &2;
spool off;     (↑引数部分を"%1"、"%2"では
exit;          なく、"&1"、"&2"とする)
*******************************************


コマンドプロンプトにて、
*******************************************
C:\>ORA_SQL yyyymmdd yyyymmdd    (←"yyyymmdd"は年月日)
*******************************************
を実行することによって、結果が出力しました。

あまり慣れていないので、ちょっと悩んでいましたが、
出来てとても嬉しいです。
本当にありがとうございました。


459) Re4:バッチで実行するSQLファイルにパラメタを与える方法 ふぇむ 2003/07/24(木) 18:49


>出来てとても嬉しいです。
>本当にありがとうございました。

多少でもお役に立てて何よりです。

ちょっとだけ気になったことがあり、追記します。
ご質問の内容と直接関係ありませんが、お書きになられたようなバッチスクリプトだと、例えば Oracle がダウンしているなどで Net*8 経由の接続ができなかったときに、「ユーザー名を入力してください:」という入力待ちでバッチコマンドが永久にストップしてしまいませんか?

そういうケースを想定しなくていいならよいのですが。

で、なんとなく思い出したので、ついでに書いておきます。
sqlplus は、経験的になのですが、接続エラーに対して3回リトライで入力待ちとなるようです。つまり対話的に3回リトライして失敗した後に、ようやくエラーで終了してくれます。

私は、このことを利用して、以前このようなバッチ(DOSコマンドラインのバッチで sqlplus 経由でSQL文を実行するバッチ)においては、3回改行を含んだテキストファイルを入力リダイレクトするとか、

(
echo.
echo.
echo.
) | sqlplus ........

とかで起動する、とか、やってたような覚えがあります。

こんななさけない逃げ方ではなくて、もうちょっときちんとした回避方法(どっかの設定で sqlplus がリトライしないようにするとか)があるのかもしれませんが...(^^; (ご存知の方いらっしゃればぜひ一言ご教授を...^^;)



559) SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) SAKU 2003/08/20(水) 09:32


ふぇむ様

教えて下さい。

以前ふぇむさんが書き込みされた
下記の内容に、私もハマリました。

書かれている通り行ってみたのですが
うまくいきません。
(ユーザ名を聞いてくる)

何か間違っているところがあれば教えて下さい。

===== sql-test.bat =====
set sqlfile=sqlfile.txt
set user=test
set pass=test
set sid=test

echo insert into testtable >> %sqlfile%
echo (username, password) >> %sqlfile%
echo values >> %sqlfile%
echo ('test1', 'test1'); >> %sqlfile%
echo quit >> %sqlfile%

(echo.
echo.
echo. | sqlplus %user%/%pass%@%sid% @%sqlfile%
==========

==========
OS : Windows NT
==========





>>出来てとても嬉しいです。
>>本当にありがとうございました。

>多少でもお役に立てて何よりです。

>ちょっとだけ気になったことがあり、追記します。
>ご質問の内容と直接関係ありませんが、お書きになられたようなバッチスクリプトだと、例えば Oracle がダウンしているなどで Net*8 経由の接続ができなかったときに、「ユーザー名を入力してください:」という入力待ちでバッチコマンドが永久にストップしてしまいませんか?

>そういうケースを想定しなくていいならよいのですが。

>で、なんとなく思い出したので、ついでに書いておきます。
>sqlplus は、経験的になのですが、接続エラーに対して3回リトライで入力待ちとなるようです。つまり対話的に3回リトライして失敗した後に、ようやくエラーで終了してくれます。

>私は、このことを利用して、以前このようなバッチ(DOSコマンドラインのバッチで sqlplus 経由でSQL文を実行するバッチ)においては、3回改行を含んだテキストファイルを入力リダイレクトするとか、

>(
>echo.
>echo.
>echo.
>) | sqlplus ........

>とかで起動する、とか、やってたような覚えがあります。

>こんななさけない逃げ方ではなくて、もうちょっときちんとした回避方法(どっかの設定で sqlplus がリトライしないようにするとか)があるのかもしれませんが...(^^; (ご存知の方いらっしゃればぜひ一言ご教授を...^^;)





560) Re6:SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) ふぇむ 2003/08/20(水) 10:45


>何か間違っているところがあれば教えて下さい。

>(echo.
>echo.
>echo. | sqlplus %user%/%pass%@%sid% @%sqlfile%

この部分の最初の echo の前の ( に対して対になる ) がないです。
echo. を3つくくって1つの出力とするための ( ) なので、以下のように

(
echo.
echo.
echo.
) | sqlplus %user%/%pass%@%sid% @%sqlfile%

としてみてはどうでしょうか。



561) Re7:SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) SAKU 2003/08/20(水) 11:33


ふぇむさん

ありがとうございます。

)をつけてみたのですが、
やはりダメでした。


宜しくお願いします。

562) Re8:SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) ふぇむ 2003/08/20(水) 12:22


>)をつけてみたのですが、やはりダメでした。

私も今手元に環境を持ってないので試せないのですが、もともと現象を見て対処療法的に行なった工夫だったので、実際どのような動作になっているか、どのような動作であればうまくいくか、試してみることです。

なので、バッチコマンドを echo on で行なって、どのような動作になっているのか、またバッチではなく手入力でリターンを打っていく等でどう振舞うのか、など、現象確認に立ち返ってみて、それから回避策を工夫すれば、うまくいくのではないでしょうか。



563) Re9:SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) ふぇむ 2003/08/20(水) 12:35


うーん、sleep みたいなことが必要だったかな?
昔のコードが見つかればわかるのですが....すみません、今ちょっと発見できません。


564) Re10:SQLPlus の接続エラー(Re5:バッチで実行するSQLファイルにパラメタを与える方法) SAKU 2003/08/25(月) 10:20


ふぇむさん

ありがとうございます。

他にも方法がないか検討してみます。

626) DOSで&を文字列として認識させる方法(Re3:バッチで実行するSQLファイルにパラメタを与える方法) あや子 2003/09/18(木) 15:01


このレスを拝見して、お聞きしたい事があります。
使用しているマシンはWinXPです。

私も宇和野空さんのようにバッチでSQLを実行させたいのですが、
逆に、&をパラメタではなく、文字列として認識させたいのです。

>OraEX.SQLの内容は以下の通りに修正します。
>*******************************************
>spool D:\TextLog\A_SYOHIN.log
>Set echo on
>SELECT COUNT(*) FROM A_SYOHIN
>WHERE M_DATE BETWEEN &1 AND &2;
>spool off;     (↑引数部分を"%1"、"%2"では
>exit;          なく、"&1"、"&2"とする)
>*******************************************


INSERT文でOracleBDにデータを登録したいのですが、
&が含まれている文字データを上記のように
パラメタとして読み込むため、登録ができません。
ECHOを用いても登録できませんでした。
”を用いても、パラメタとして認識されてしまいます。

どなたか分かる方がいらっしゃいましたら、よろしくお願いします。

Oracleは9iです。
 
 


カテゴリー「SQLとコマンド・プロンプト」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2003年07月22日 11:05に投稿されたエントリーのページです。

ひとつ前の投稿は「FDの交換を促しながらCOPYをしたい」です。

次の投稿は「FORのループ内で個々のファイルの圧縮処理ごとにLHA32.DLLの戻り値を検査したい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート