Why can't I do a “with x as (…)” with ADODB and Oracle?

会有一股神秘感。 提交于 2020-01-20 04:06:27

问题


I fail to execute an SQL query with a with clause via ADODB and Oracle.

That is, the following snippet works:

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

However, the following doesn't work - it genererats a Run-Time error 3704: Operation is not allowed when the object is closed.

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

Obviously, this is a trimmed-down demonstration of the real problem which consists of a more sophisticated query.

It seems to me that ADODB sort of parses the query before it passes it to the Oracle instance and does not understand the with clause. Anyway, any help on this is highly appreciated.


回答1:


Ok, it really seems as though ADODB expects a query statement to actually start with select. Therefore, a work around for the problem might be to enclose the statement in a select * from ( .... ) like so:

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



回答2:


Above method did not work for me.

Adding ";" prior to WITH keyword resolved the issue.

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

rs.Open sql, cn



来源:https://stackoverflow.com/questions/2316886/why-cant-i-do-a-with-x-as-with-adodb-and-oracle

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!