2010-02-23 11 views
8

No puedo ejecutar una consulta SQL con un con la cláusula a través de ADODB y Oracle.¿Por qué no puedo hacer un "con x como (...)" con ADODB y Oracle?

Es decir, el siguiente fragmento de las obras:

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 

Sin embargo, el siguiente no funciona - es un error de genererats en tiempo de ejecución 3704: La operación no está permitida si el objeto está cerrado.

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 

Obviamente, esto es una demostración recortado hacia abajo del verdadero problema que consiste de una consulta más sofisticado.

Me parece que el tipo ADODB analiza la consulta antes de pasarla a la instancia de Oracle y no comprende el con la cláusula. De todos modos, cualquier ayuda sobre esto es altamente apreciada.

Respuesta

16

Ok, realmente parece que ADODB espera que una instrucción de consulta realmente empiece con select. Por lo tanto, una solución alternativa para el problema podría ser la de encerrar la declaración en un select * from (....) así:

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 
+0

Ohhhhhhhhhhhhhhh hombre que me va a Parada ¡mucho trabajo! Escribo muchas consultas de Oracle en ADODB y he evitado usar el estado WITH. Esto proporcionará mucha más claridad. Yo votaría esto cien veces si pudiera. –

+3

No sé qué decir. Esto es tan estúpido por parte de MS. una WTF seria. – RAY

+0

Gracias por esta respuesta, realmente me ayudó. – tuj

1

Por encima de método no funcionó para mí.

Añadiendo ";" antes de la palabra clave WITH resolvió el problema.

Dim sql como secuencia sql = "; con w como (seleccione 'foo' x de la doble) seleccione x desde w"

rs.Open sql, cn

+0

no funciona para mí. obteniendo "carácter inválido". – RAY

+0

Funciona según lo anunciado. – primo

Cuestiones relacionadas