我无法通过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子句。无论如何,这方面的帮助很大赞赏。
[好吧,看起来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
以上方法对我无效。
添加“;”在WITH关键字之前解决了该问题。
Dim sql作为字符串sql =“;用w作为(从双选'foo'x中选择)从w中选x”
rs.Open sql,cn