You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:20:54