9

我无法通过 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 子句。无论如何,对此的任何帮助都将受到高度赞赏。

4

2 回答 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
于 2010-02-23T13:46:15.110 回答
1

以上方法对我不起作用。

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

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

rs.打开sql,cn

于 2013-01-23T16:27:57.327 回答