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

时间:2010-02-23 09:07:02

标签: 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

但是,以下操作不起作用 - 它会产生运行时错误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子句。无论如何,对此的任何帮助都很高 赞赏。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以上方法对我不起作用。

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

Dim sql As String sql =“;用w as(从双重中选择'foo'x)从w”

中选择x

rs.Open sql,cn