为什么我不能在ADODB和Oracle中使用“with x as (...)”语句?

10

我尝试使用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个回答

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

哦,天啊,这将会为我节省很多工作!我在ADODB中编写了许多Oracle查询,并一直避免使用WITH语句。这将提供更清晰的视野。如果可以的话,我会给它点赞一百次。 - Tommy O'Dell
5
我不知道该说什么。这太蠢了,微软真的让人大跌眼镜。非常荒谬。 - RAY
谢谢您的回答,它真的帮助了我。 - tuj
那为我节省了一些时间!谢谢。 - Simon Sellick
感谢您的回答! - Maddy
哇塞,谢谢!我已经寻找了5天来解决这个问题! - Wildhorn

1
上述方法对我没有用。 在WITH关键字之前添加“;”解决了这个问题。 Dim sql As String sql = ";with w as (select 'foo' x from dual) select x from w" rs.Open sql, cn

按照广告所述正常工作。 - primo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接