为什么我不能对ADODB和Oracle进行x as(…)运算?

问题描述 投票:8回答:2

我无法通过ADODB和Oracle使用with子句执行SQL查询。

即,以下代码段有效:

Dim cn As ADODB.connection
Set cn = ....

Dim rs As ADODB.recordSet
Set rs = New ADODB.Recordset

rs.Open "select 'foo' x from dual", cn


Do While Not rs.eof
   ...
   rs.MoveNext
Loop

但是,以下内容不起作用-它会产生运行时错误3704:关闭对象时不允许进行操作。

Dim cn As ADODB.connection
Set cn = ....

Dim rs As ADODB.recordSet
Set rs = New ADODB.Recordset

rs.Open "with w as (select 'foo' x from dual) select x from w", cn

Do While Not rs.eof
   ...
   rs.MoveNext
Loop

显然,这是对实际问题的精简演示,其中包括更复杂的查询。

在我看来,ADODB在将查询传递给Oracle实例之前对查询进行了某种分析,并且不理解with子句。无论如何,这方面的帮助很大赞赏。

vba oracle common-table-expression adodb recordset
2个回答
18
投票

[好吧,看起来ADODB确实希望查询语句实际上以select开头。因此,解决该问题的方法可能是将该语句括在select * from ( .... )中,如下所示:

Dim sql As String
sql = "with w as (select 'foo' x from dual) select x from w"

' enclose the statement:
sql = "select * from (" & sql & ")"

rs.Open sql, cn

1
投票

以上方法对我无效。

添加“;”在WITH关键字之前解决了该问题。

Dim sql作为字符串sql =“;用w作为(从双选'foo'x中选择)从w中选x”

rs.Open sql,cn

© www.soinside.com 2019 - 2024. All rights reserved.