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 テクニック編資料