Почему я не могу сделать "с x как (...)" с ADODB и Oracle? - PullRequest
8 голосов
/ 23 февраля 2010

Я не могу выполнить SQL-запрос с с предложением через ADODB и Oracle.

То есть работает следующий фрагмент:

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, и не понимает с предложением . Во всяком случае, любая помощь по этому вопросу очень оценили.

Ответы [ 2 ]

17 голосов
/ 23 февраля 2010

Хорошо, на самом деле кажется, что 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 голос
/ 23 января 2013

Выше метод не работал для меня.

Добавление ";" До ключевого слова WITH была решена проблема.

Dim sql As String sql = "; с w as (выберите 'foo' x из dual) выберите x из w"

rs.Open sql, cn

...