为什么我不能用ADODB和Oracle做"with x as(...)"?

Ren*_*ger 8 oracle vba adodb

我无法通过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
Run Code Online (Sandbox Code Playgroud)

但是,以下操作无效 - 它会导致运行时错误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
Run Code Online (Sandbox Code Playgroud)

显然,这是一个真实问题的精简版演示,它包含一个更复杂的查询.

在我看来,ADODB在将查询传递给Oracle实例之前解析查询,并且不理解with子句.无论如何,对此的任何帮助都非常感谢.

Ren*_*ger 17

好吧,看起来好像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
Run Code Online (Sandbox Code Playgroud)

  • 我不知道该说些什么.这对MS来说太愚蠢了.一个严肃的WTF. (4认同)