我无法通过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子句。无论如何,对此的任何帮助都很高 赞赏。
答案 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”
中选择xrs.Open sql,cn