カーソル変数(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