| |
このあたりで実用的な例として、バッチ処理の中からストアドプロシージャを蹴る
Tclスクリプトをご紹介します。
コマンドラインで同様のことをするには、
SQL*PlusスクリプトやPro*Cを使う方法なども試しましたが、
SQL*Plusスクリプトでは複雑な制御を記述しづらい、
Pro*Cではソースの管理が大変、という問題が出やすいと思います。
また、Oracleの標準パッケージ「DBMS_JOB」を使う方法もありますが、
これの場合、ファイル操作(ログの削除やデータファイルのFTP転送)
まではやりきれないなど、既存の方法はどれも一長一短です。
そこでコレ。
この例は
CREATE OR REPLEACE PROCEDURE KA_KK_DOWNLOAD(
total_rows_count OUT STRING,
error_rows_count OUT STRING,
return_status OUT NUMBER
) AS ...
このような引数のストアドプロシージャ「KA_KK_DOWNLOAD」を呼び出して、
その実行結果を表示して終了するスクリプトです。
これを応用すれば、スクリプトのargvによって実行するプロシージャを切り替えるとか、
一連の複雑な依存関係をもつストアドプロシージャを順番に実行する、
などの応用もできそうですね。
#! /bin/sh
# \
exec /usr/local/bin/tclsh8.4 "$0" "$@"
package require Oratcl
set env(NLS_LANG) "Japanese_Japan.UTF8"
fconfigure stdout -encoding shiftjis
# ローカルのOracleデータベースに接続
if {[catch {
set con [oralogon "urano/mayoneez"]
set cur [oraopen $con]
} err]} {
puts "*** FATAL SCRIPT ERROR 0011: Cannot connect to database: $err"
exit 11
}
# プロシージャの実行
if {[catch {
set sql "begin KA_KK_DOWNLOAD(:all, :err, :ora); end;"
oraplexec $cur $sql :all "" :err "" :ora ""
} err]} {
oraroll $con
puts "*** FATAL SCRIPT ERROR 0021: Oracle parse error $oramsg(rc) : $err"
exit 21
}
if {$oramsg(rc) != 0} {
oraroll $con
puts "*** FATAL SCRIPT ERROR 0031: Oracle call error $oramsg(rc) : $oramsg(errortxt)"
exit 31
}
# 問い合せ結果をフェッチしてOUT引数の値を取得します。
orafetch $cur {set all @1; set err @2; set ora @3}
puts "*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*"
puts "* Result:"
puts "* Total Rows Count = $all"
puts "* Error Rows Count = $err"
puts "* Returned Status = $ora"
if {$ora == 0} {
puts "* Process Terminated Successfully."
oracommit $con
} else {
puts "* Process Terminated With Error."
oraroll $con
}
puts "*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*"
oraclose $cur
oralogoff $con
# プロシージャがOKなら0で終了、エラーなら99で終了。
if {$ora == 0} {exit 0} {exit 99}
# end.
|
(first uploaded 2002/09/14 last updated (not ever), MISUMI URANO)
|