2017-11-27

oo4oからADOへの変換 (6) カーソル変数(REF CURSOR)

カーソル変数(REF CURSOR)は、PL/SQL との連携において非常に有用ですが、ADOでは少し扱いづらいものとなります。
サンプルコードはOracle® Objects for OLE開発者ガイドの PL/SQLカーソル変数を戻す方法 の例を書き換えたものです。

ADO

Sub Get_Data()
'  Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
  Set cnn = CreateObject("ADODB.Connection")

'  Set empDb = OO4OSession.OpenDatabase("ExampleDb", "scott/tiger", 0)
  cnn.Open "Provider=OraOLEDB.Oracle;Data Source=ExampleDb;User ID=scott;Password=tiger"

  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = cnn
  cmd.CommandType = adCmdText

'  empDb.Parameters.Add "EMPCUR", 0, ORAPARM_OUTPUT
'  empDb.Parameters("EMPCUR").serverType = ORATYPE_CURSOR
'  empDb.Parameters.Add "DEPTCUR", 0, ORAPARM_OUTPUT
'  empDb.Parameters("DEPTCUR").serverType = ORATYPE_CURSOR
  cmd.Properties("PLSQLRSet") = True

'  Set PlSqlStmt = empDb.CreateSql("Begin EmpAndDept.GetEmpAndDeptData (:EMPCUR, :DEPTCUR); end;", 0)
  cmd.CommandText = "{CALL EmpAndDept.GetEmpAndDeptData()}"

'  Set EmpDynaset = empDb.Parameters("EmpCur").Value
  Set EmpRst = cmd.Execute
  cmd.Properties("PLSQLRSet") = False

'  Set DeptDynaset = empDb.Parameters("DeptCur").Value
  Set DeptRst = EmpRst.NextRecordset

'  MsgBox EmpDynaset.Fields("ENAME").Value
'  MsgBox DeptDynaset.Fields("DNAME").Value
  MsgBox EmpRst.Fields("ENAME").Value
  MsgBox DeptRst.Fields("DNAME").Value
End Sub
  • REF CURSOR型を使う場合、Oracle 固有の "BEGIN END;" 構文が使えません。ODBCプロシージャ・コールの構文{CALL} を使用します。(パラメータのプレースホルダには ? を使います。)
  • ADO では、REF CURSOR 型のパラメータを設定する必要がありません。(REF CURSOR 型以外のパラメータのみ設定します。)

    上の例では、Oracleの構文"Begin EmpAndDept.GetEmpAndDeptData (:EMPCUR, :DEPTCUR); end;" が ODBCの構文では {CALL EmpAndDept.GetEmpAndDeptData(?, ?)} となるところが、 パラメータが二つとも REF CURSOR型のため {CALL EmpAndDept.GetEmpAndDeptData()} となります。

  • Command オブジェクトのカスタムプロパティ PLSQLRSetTrue をセットする必要があります。使用終了後は False をセットします

  • 複数の REF CURSOR 型パラメータを使用した場合は、Recordset オブジェクトの NextRecordset で次のパラメータに対応する Recordset を取得できます。

No comments:

Post a Comment