使用Oracle OraOLEDB.Oracle Provider在Excel 2010 VBA代码中运行查询时遇到问题。
某些查询可以正常工作并返回结果,而其他查询则不会返回任何结果......
我这样连接:
Set DBConnection = New ADODB.Connection
DBConnection.Provider = "OraOLEDB.Oracle"
DBConnection.CursorLocation = adUseClient
DBConnection.ConnectionString = "Data Source=" & TNSName & ";User Id=" & OraUserName & ";Password=" & OraPassWord & ";"
DBConnection.Open
然后我尝试查询:
command2.ActiveConnection = DBConnection
command2.CommandText = "SELECT COL1,COL2,COL3 FROM table(MySchema.MyPackage.MyFunction('Param1'))"
command2.CommandType = adCmdText
Set QueryRecordSet = New ADODB.Recordset
QueryRecordSet.LockType = adLockReadOnly
QueryRecordSet.CursorType = adOpenDynamic
QueryRecordSet.Open command2
command2.Execute
我一无所获......任何想法?
如果我运行像
这样的简单查询select * From my_table
它工作正常......似乎连接或其他更复杂的查询无法编译?
此外,从视图中选择不起作用。
select * from my_view
什么都不返回
答案 0 :(得分:2)
我将此作为答案只是因为评论格式化不允许我添加代码。
如果通过命令对象单独运行存储过程,该存储过程是否有效?
command2.CommandText = "MySchema.MyPackage.MyFunction"
command2.CommandType = adCmdStoredProc
command2.Parameters.Refresh
command2.Parameters.Item(1).Value = "Param1"
command2.Execute
Debug.Print command2.Parameters.Item(0).Value
答案 1 :(得分:1)
我不确定这是你在找什么。我正在寻找另一个答案,我知道这对我有用。
Set cmdSum = New adodb.Command
With cmdSum
Set .ActiveConnection = oCon
.Properties("PLSQLRSet") = True
.CommandText = "{CALL StoredProc(?,?)}"
.CommandType = adCmdText
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sTerm), "mm/dd/yyyy"))
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sEff), "mm/dd/yyyy"))
End With
Set Rs = cmdSum.Execute()
For c = 0 To Rs.Fields.Count - 1
Wk.Cells(3, c + 1) = Rs.Fields(c).Name
Next c
答案 2 :(得分:0)
我在Oracle ADO查询后无法正常运行。
虽然它在问题中说明了'您可以使用ODBC来解决这个问题,我花了一些时间来弄清楚如何使ODBC连接字符串正常工作。
这是我工作的Oracle的Oracle连接。
dbConn = "ODBC;Provider=OraOLEDB.Oracle;" & _
"Data Source=odbc_connection_name;" & _
"User Id=user_id;" & _
"Password=user_pwd;" & _
"DBQ=tns_name;"
tns_name
是您在tnsnames.ora
文件中命名连接的内容。
odbc_connection_name
就是你命名的odbc连接。
然后您可以使用它来使用ADO连接到Oracle,就像正常一样:
cn.Open dbConn
cn.CommandTimeout = 1000
rs.Open sql, cn
注意我还必须增加CommandTimeout
属性,因为ODBC的默认超时相对较短。