SAK 図書館
VB oo4o + SQL 応用編8 oo4o ストアドファンクション - PL/SQL ブロック
oo4o は、Oracle RDBMS でみ使用可能です。
■ストアドファンクション / ストアドプロシジャ
・ExecuteSql での実行
Dim pret
'** パラメタ追加
OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
set pret = OraDatabase.Parameters("ret")
pret.ServerType = ORATYPE_VARCHAR2
'** ストアドファンクション実行
OraDatabase.ExecuteSql "begin :ret := sak.GetTmp(); end;"
'** 戻り値取得
msgbox pret.value
'** パラメタ解消
OraDatabase.Parameters.Remove "ret"
・CreateSql での実行
Dim OraSqlStmt
Dim pret
'** SQL 作成
Set OraSqlStmt = OraDatabase.CreateSql("begin :ret := sak.GetTmp(); end;" _
, ORASQL_DEFAULT)
'** パラメタ追加
OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
set pret = OraDatabase.Parameters("ret")
pret.ServerType = ORATYPE_VARCHAR2
'** ストアドファンクション実行
OraSqlStmt.Refresh
'** 戻り値取得
msgbox pret.value
'** パラメタ解消
OraDatabase.Parameters.Remove "ret"
'** パラメタクエリ解消
Set OraSqlStmt = Nothing
■補足
・戻り値以外の入力、出力、入出力パラメタも通常のバインド変数でアクセス
すれば良い。"begin :ret := sak.GetTmp(:para1, :para2); end;"
・戻り値がない場合は、"begin sak.GetTmp(:para1, :para2); end;" となる。
・ストアドの実行に限らず、begin ... end; の PL/SQL ブロックを処理する
ことができる。begin ... end; でまとめられるものは、一度に発行した方
がレスポンスは良い。
■現実的なコード例
Option Explicit
'** oo4o 変数宣言
dim OraSession
dim OraDatabase
dim OraSqlStmt
Dim pret
'=======================================================================
' 準備
'=======================================================================
Private Sub Form_Load()
dim dbname as string
dim cnuser as string
'** エラートラップ開始
on local error resume next
'** アイキャッチ表示
'Load FormLogo
'FormLogo.Show
'DoEvents
'// 接続に 10 秒ほどかかるので、「データベース接続中...」などの
'// モードレスダイアログを表示すると良い。
'** サービス、ユーザ設定
dbname = ""
cnuser = "SAK/SAK"
'// Oracle サービス名(別名)、ユーザ・パスワード指定
'** oo4o 接続
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
if err <> 0 then
MsgBox "データベースに接続出来ません。" & chr(10) _
& "CreateObject - Oracle oo4o エラー"
end
end if
Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
if err <> 0 then
MsgBox "データベースに接続出来ません。" & chr(10) _
& err & ": " & error
end
end if
'** SQL 作成
Set OraSqlStmt = OraDatabase.CreateSql("begin :ret := sak.GetTmp(); end;" _
, ORASQL_DEFAULT)
if OraDatabase.LastServerErr = 1008 then OraDatabase.LastServerErrReset
if err <> 0 or OraDatabase.LastServerErr <> 0 then
MsgBox "SQL 作成に失敗しました。" & chr(10) _
& err & ": " & error & chr(10) _
& "oo4o: " & OraDatabase.LastServerErrText
end
end if
'** パラメタ追加
OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
set pret = OraDatabase.Parameters("ret")
pret.ServerType = ORATYPE_VARCHAR2
if err <> 0 or OraDatabase.LastServerErr <> 0 then
MsgBox "パラメタ追加に失敗しました。" & chr(10) _
& err & ": " & error & chr(10) _
& "oo4o: " & OraDatabase.LastServerErrText
end
end if
'** アイキャッチ終了
'Unload FormLogo
'// 接続が完了すれば、「データベース接続中...」をクローズする。
'** エラートラップ終了
on local error goto 0
End Sub
'=======================================================================
' 後始末
'=======================================================================
Private Sub Form_Unload(Cancel As Integer)
'** パラメタ解消
OraDatabase.Parameters.Remove "ret"
'** パラメタクエリ解消
Set OraSqlStmt = Nothing
'** oo4o 接続解除
Set OraDatabase = Nothing
Set OraSession = Nothing
End Sub
'=======================================================================
' メイン
'=======================================================================
Private Sub Command1_Click()
'---- ExecuteSql での実行 ----
print "-- ExecuteSql での実行 --"
'** ストアドファンクション実行
OraDatabase.ExecuteSql "begin :ret := sak.GetTmp(); end;"
'** 戻り値取得
print pret.value
'---- CreateSql での実行 ----
print "-- CreateSql での実行 --"
'** ストアドファンクション実行
OraSqlStmt.Refresh
'** 戻り値取得
print pret.value
print "-- 終了 --"
End Sub
■VB oo4o + SQL 応用編資料
■VB ADO + SQL 応用編資料
■VB RDO + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料