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