Informix via ODBC Fehler "CURSOR not on SELECT statement"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Guten Morgen Forum,

ich habe hier ein kleines Problem nach einem Update.

Ich verwende einige kleine Scripte um Daten aus einer alten Informix-Datenbank abzufragen und entsprechend auszuwerten. Das hat in der Vergangenheit problemlos funktioniert.

Die Verbindung habe ich bisher immer (weil es so schön einfach war) von einem Windows-PC aus hergestellt bei dem der Zugang zur Informix-Datenbank als ODBC-Datenquelle in Windows angelegt habe.
Der entsprechende ODBC-Treiber kommt bei der Software iconnect mit die von IBM entsprechend zur Verfügung gestellt wird.

Zur Kommunikation mit der ODBC-Schnittstelle aus Python heraus vewende ich PyODBC.

Wie gesagt, unter alten Maschinen auf denen Windows 2000 lief hat das ganze wunderbar funktioniert. Auf neueren Windows 7 Maschinen (da wurde auch ein entsprechend neuer ODBC-Treiber installiert) kommt es zu bei identischem Code zu folgenden Fehler:

Code: Alles auswählen

Error: ('HY000', '[HY000] [Informix][Informix ODBC Driver][Informix]CURSOR not on SELECT statement. (-363) (SQLExecDirectW)')
Das Problem taucht immer dann auf wenn ich mit SELECT [...] INTO TEMP in eine temporäre Tabelle schreibe. Das scheint etwas damit zu tun zu haben, dass solch eine Selektion keinerlei Datensätze zurück liefert (logisch, die landen ja in der temporären Tabelle). Nur... öhm... was muss ich tun, damit das trotzdem geht?
Die (Informix-)Dokumentation sagt, dass man dann keinen Cursor verwenden darf:

Von hier:
-363 CURSOR not on SELECT statement.

The cursor named in this statement (probably an OPEN) has been
associated with a prepared statement that is not a SELECT statement.
Review the program logic, especially the DECLARE for the cursor, the
statement id specified in it, and the PREPARE that set up that
statement. If you intended to use a cursor with an INSERT statement,
you can only do that when the INSERT statement is written as part of
the DECLARE statement. If you intended to execute an SQL statement, do
that directly with the EXECUTE statement, not indirectly through a
cursor.

This error is also returned when you attempt to associate a cursor with
a SELECTINTO TEMP statement. Because of the INTO TEMP clause, the
SELECT statement can return no rows and so cannot be used with a
cursor.


Für Hilfe wäre ich sehr dankbar!

Gruß
Sebastian
BlackJack

@sparrow: Wenn Du nichts anders machst, muss ja bei `PyODBC` oder beim ODBC-Treiber auf dem neuen System etwas anders laufen. Hast Du schon mal versucht so ein SELECT in eine temporäre Tabelle von einem anderen Programm aus zu machen, das sich per ODBC mit der DB verbindet?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich bin mir auch ziemlich sicher, dass es an dem ODBC-Treiber liegt, denn ansonsten ist ja alles weitestgehend identisch.

Hmm... ich könnte bei Gelegenheit mal mit Java eine Versuchsumgebung hochziehen um zu schauen ob es von da aus funktioniert.

Ich hatte gehofft, dass jemand schon einmal die Fehlermeldung gesehen hat. Vielleicht muss man den Cursortyp vor dem Statement für die Datenbank umstellen (also mit einem eigenen Statement an die Datenbank), aber ich habe keine Ahnung wie ;)
BlackJack

@sparrow: Grundsätzlich muss ich mich auch mit Informix herumschlagen, aber nicht mit ODBC. Ich gehe entweder über Jython + JDBC-Treiber oder CPython und `informixdb` an die Datenbank heran.
Antworten