2010-02-23 3 views
8

Ich kann eine SQL-Abfrage mit einer mit Klausel über ADODB und Oracle nicht ausführen.Warum kann ich mit ADODB und Oracle kein "mit x als (...)" machen?

Das heißt, die folgenden Schnipsel funktionieren:

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 

Allerdings sind die folgende nicht - es genererats einen Laufzeitfehler 3704: Operation ist nicht erlaubt, wenn das Objekt geschlossen ist.

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 

Offensichtlich ist dies eine abgespeckte Demonstration des realen Problems, das einer komplizierteren Abfrage besteht.

Es scheint mir, dass ADODB die Abfrage vor der Übergabe an die Oracle-Instanz analysiert und die mit der Klausel nicht versteht. Wie auch immer, jede Hilfe hier ist in hohem Grade geschätzt.

Antwort

16

Ok, es scheint wirklich so, als ob ADODB erwartet, dass eine Abfrageanweisung tatsächlich mit select beginnt. Daher , eine Arbeit um für das Problem könnte sein, die Aussage zu umschließen in einem select * from (....) etwa 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 
+0

Ohhhhhhhhhhhhhhh Mann, der gonna save me a viel Arbeit! Ich schreibe viele Oracle-Abfragen in ADODB und vermeide die Verwendung der WITH-Anweisung. Dies wird viel mehr Klarheit schaffen. Ich würde das hundert Mal abstimmen, wenn ich könnte. –

+3

Ich weiß nicht was ich sagen soll. Das ist soooo dumm von MS. eine ernste WTF. – RAY

+0

Danke für diese Antwort, es hat mir wirklich geholfen. – tuj

1

Above Methode nicht für mich arbeiten.

Hinzufügen von ";" Vor dem WITH-Schlüsselwort wurde das Problem behoben.

Dim sql As String sql = "; mit w als (wählen Sie 'foo' x von dual) wählen x von w"

rs.Open sql, cn

+0

funktioniert nicht für mich. "ungültiges Zeichen" erhalten. – RAY

+0

Funktioniert wie beschrieben. – primo