使用ODBC驱动执行含WITH子句的SQL查询时无法返回数据的问题
问题描述
- 使用Microsoft ODBC for Oracle 版本10.000.19041.01驱动,通过VBA宏将Oracle SQL查询结果导入Excel
- 含WITH子句的示例查询:
with temp_tab as (select * from table1) select * from temp_tab where x = y
- 该查询在SQL Developer中可正常执行,但在Excel VBA中执行时会报错:
"Operation is not allowed when the object is closed."
- 移除WITH子句后,VBA宏可正常运行
- 配套的VBA宏代码如下(报错行已标记):
'SQL query: Dim strQuery As String strQuery = "" ' Variables related to connection with SQL Dim adoCM As ADODB.Command Dim adoCN As ADODB.Connection Dim adoRS As ADODB.Recordset Set adoCN = New ADODB.Connection adoCN.CursorLocation = adUseClient adoCN.Properties("Prompt") = adPromptComplete Application.ScreenUpdating = True Application.ScreenUpdating = False adoCN.Open "Data Source=xxx", "yyy", Password Set adoCM = New ADODB.Command Set adoCM.ActiveConnection = adoCN Set adoRS = New ADODB.Recordset adoCM.CommandType = adCmdText dblStartTime = Now strQuery = ThisWorkbook.Worksheets("Sheet1").Range("G3").Value adoCM.CommandText = strQuery Application.ScreenUpdating = True Application.ScreenUpdating = False adoCM.CommandTimeout = 3600 Set adoRS = adoCM.Execute ' 报错行 ThisWorkbook.Worksheets("Sheet1").Range("G5").CopyFromRecordset adoRS dblEndTime = Now - dblStartTime Application.ScreenUpdating = True Application.ScreenUpdating = False adoCN.Close
问题原因
核心原因是你使用的Microsoft ODBC for Oracle 10.x版本驱动对Oracle公共表表达式(CTE,即WITH子句语法)支持不完善:
- Oracle在9i版本引入了WITH子句,但早期的Microsoft ODBC for Oracle驱动未针对该语法做适配,无法正确解析和执行带WITH子句的查询,导致执行后未返回有效的可读取记录集,
adoRS处于关闭状态,调用CopyFromRecordset时触发"对象关闭时不允许操作"的错误。 - SQL Developer使用Oracle官方原生驱动(如JDBC驱动),对Oracle新语法支持更完整,因此能正常执行该查询;移除WITH子句后,查询变为普通SELECT语句,旧ODBC驱动可正常处理,宏即可运行。
另外你提到的SQL Server版本10.00.19041.3086与当前问题无关,属于数据库类型混淆。
内容的提问来源于stack exchange,提问作者Dominik Niewiadomski
相关产品推荐
相关产品推荐

