ストアドプロシージャを蹴る

 このあたりで実用的な例として、バッチ処理の中からストアドプロシージャを蹴る 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.

拡張レビュー分室 top
(first uploaded 2002/09/14 last updated (not ever), MISUMI URANO)