2008-09-01 4 views
2

eine Oracle-Tabelle erstellt folgenden Verwendung:Abrufen einen Oracle-Zeitstempels mit Python Win32 ODBC-Modul

CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE); 

das Python-ODBC-Modul Mit Hilfe von seinem Win32 extensions (aus dem win32all Paket), habe ich versucht, die folgende:

import dbi, odbc 

connection = odbc.odbc("Driver=Oracle in OraHome92;Dbq=SERVER;Uid=USER;Pwd=PASSWD") 

cursor = connection.cursor() 
cursor.execute("SELECT WhenAdded FROM Log") 

results = cursor.fetchall() 

Als ich das laufen, erhalte ich folgendes:

Traceback (most recent call last): 
... 
    results = cursor.fetchall() 
dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s 
in FETCH 

Die anderen Datentypen, die ich versucht habe (VARCHAR2, BLOB), verursachen dieses Problem nicht. Gibt es eine Möglichkeit, Zeitstempel abzurufen?

Antwort

2

Ich glaube, das ist ein Fehler im Oracle ODBC-Treiber. Grundsätzlich unterstützt der Oracle-ODBC-Treiber die TIMESTAMP WITH (LOCAL) TIME ZONE Datentypen nur den TIMESTAMP-Datentyp nicht. Wie Sie herausgefunden haben, ist eine Abhilfe die Methode TO_CHAR.

In Ihrem Beispiel lesen Sie nicht gerade die Zeitzoneninformationen. Wenn Sie die Kontrolle über die Tabelle haben, können Sie sie in eine gerade TIMESTAMP Spalte umwandeln. Wenn Sie keine Kontrolle über die Tabelle haben, kann eine andere Lösung darin bestehen, eine Ansicht zu erstellen, die von TIMESTAMP WITH TIME ZONE in TIMESTAMP über eine Zeichenfolge konvertiert - ich weiß nicht, ob es eine Möglichkeit gibt, direkt von TIMESTAMP WITH TIME ZONE zu TIMESTAMP zu konvertieren.

1

Meine Lösung dafür, dass ich hoffe, übertroffen werden kann, ist Oracle zu verwenden, um explizit den Zeitstempel in einen String zu konvertieren:

cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log") 

Dies funktioniert, aber ist nicht tragbar. Ich möchte das gleiche Python-Skript für eine SQL Server-Datenbank verwenden, sodass eine Oracle-spezifische Lösung (z. B. TO_CHAR) nicht funktioniert.

Verwandte Themen