カーソル変数(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
オブジェクトのカスタムプロパティPLSQLRSet
にTrue
をセットする必要があります。使用終了後はFalse
をセットします- 複数の REF CURSOR 型パラメータを使用した場合は、Recordset オブジェクトの
NextRecordset
で次のパラメータに対応する Recordset を取得できます。
No comments:
Post a Comment