SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 テクニック編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK