SAK 図書館
VB oo4o + SQL 応用編4 oo4o 更新 - バインド変数、Parameters
oo4o は、Oracle RDBMS でみ使用可能です。 ■バインド変数 ・バインド変数を使用した更新を行う事ができる。 Oracle サーバ上のキャッシュ SQL が利用できるので高速になる。 ■パラメタ作成 ・Parameters.Add は、パラメタを追加する。 ServerType でタイプも指定する。(OraParameter) OraDatabase.Parameters.Add "バインド変数名", 0, ORAPARM_INPUT 初期値 _| | 入力 ORAPARM_INPUT _| 出力 ORAPARM_OUTPUT I/O ORAPARM_BOTH OraDatabase.Parameters("バインド変数名").ServerType = ORATYPE_CHAR ORATYPE_VARCHAR2 _| ORATYPE_NUMBER ORATYPE_SINT ORATYPE_FLOAT ORATYPE_STRING ORATYPE_VARCHAR ORATYPE_DATE ORATYPE_UINT ORATYPE_CHAR ORATYPE_CHARZ ORATYPE_CURSOR ・Value でパラメタに値をセットする。 OraDatabase.Parameters("バインド変数名").Value = "a001" ・Parameters.Remove は、パラメタの追加を解消する。 OraDatabase.Parameters.Remove "バインド変数名" ■パラメタ定数 '** パラメタ入出力 Public Const ORAPARM_INPUT = 1 Public Const ORAPARM_OUTPUT = 2 Public Const ORAPARM_BOTH = 3 '** パラメタタイプ Public Const ORATYPE_VARCHAR2 = 1 Public Const ORATYPE_NUMBER = 2 Public Const ORATYPE_SINT = 3 Public Const ORATYPE_FLOAT = 4 Public Const ORATYPE_STRING = 5 Public Const ORATYPE_VARCHAR = 9 Public Const ORATYPE_DATE = 12 Public Const ORATYPE_UINT = 68 Public Const ORATYPE_CHAR = 96 Public Const ORATYPE_CHARZ = 97 Public Const ORATYPE_CURSOR = 102 ■現実的なコード例 Option Explicit '** oo4o 変数宣言 dim OraSession dim OraDatabase '======================================================================= ' 準備 '======================================================================= 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 '** パラメタ追加 OraDatabase.Parameters.Add "キー", 0, ORAPARM_INPUT OraDatabase.Parameters("キー").ServerType = ORATYPE_CHAR OraDatabase.Parameters.Add "データ1", 0, ORAPARM_INPUT OraDatabase.Parameters("データ1").ServerType = ORATYPE_NUMBER OraDatabase.Parameters.Add "データ2", 0, ORAPARM_INPUT OraDatabase.Parameters("データ2").ServerType = ORATYPE_NUMBER OraDatabase.Parameters.Add "データ3", 0, ORAPARM_INPUT OraDatabase.Parameters("データ3").ServerType = ORATYPE_NUMBER 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 "キー" OraDatabase.Parameters.Remove "データ1" OraDatabase.Parameters.Remove "データ2" OraDatabase.Parameters.Remove "データ3" '** oo4o 接続解除 Set OraDatabase = Nothing Set OraSession = Nothing End Sub '======================================================================= ' メイン '======================================================================= Private Sub Command1_Click() '** RDB 処理 if RdbShori(OraDatabase) then msgbox "RDB 更新正常終了。" end if End Sub '======================================================================= ' RDB 処理 '======================================================================= private function RdbShori(OraDatabase) as boolean '** エラーセット RdbShori = FALSE '** エラートラップ開始 on local error resume next '** oo4o エラーリセット OraDatabase.LastServerErrReset '** トランザクション開始 OraSession.BeginTrans '** RDB 処理1 OraDatabase.Parameters("キー").Value = "a001" OraDatabase.Parameters("データ1").Value = 10 OraDatabase.Parameters("データ2").Value = 20 OraDatabase.Parameters("データ3").Value = 30 OraDatabase.ExecuteSQL "insert into sak.テストm " _ & "(キー, データ1, データ2, データ3) values " _ & "(:キー, :データ1, :データ2, :データ3)" if err <> 0 or OraDatabase.LastServerErr <> 0 then OraSession.Rollback MsgBox "RDB 更新1 に失敗しました。" & chr(10) _ & err & ": " & error & chr(10) _ & "oo4o: " & OraDatabase.LastServerErrText exit function end if '** RDB 処理2 OraDatabase.Parameters("キー").Value = "b002" OraDatabase.Parameters("データ1").Value = 100 OraDatabase.Parameters("データ2").Value = 200 OraDatabase.Parameters("データ3").Value = 300 OraDatabase.ExecuteSQL "insert into sak.テストm " _ & "(キー, データ1, データ2, データ3) values " _ & "(:キー, :データ1, :データ2, :データ3)" if err <> 0 or OraDatabase.LastServerErr <> 0 then OraSession.Rollback MsgBox "RDB 更新2 に失敗しました。" & chr(10) _ & err & ": " & error & chr(10) _ & "oo4o: " & OraDatabase.LastServerErrText exit function end if '** トランザクション終了 OraSession.CommitTrans '** エラートラップ終了 on local error goto 0 '** 正常セット RdbShori = TRUE end function ■説明 ・バラメタの作成と解消は、Form_Load と Form_Unload で実施している。 同じ更新 SQL が大量に発生するパターンに効果があると考える。 コードは少し複雑になる。 ■VB oo4o + SQL 応用編資料
■VB ADO + SQL 応用編資料
■VB RDO + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料