Pregunta

Dada una tabla de Oracle creada usando lo siguiente:

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

Usando el módulo ODBC de Python desde su extensiones win32 (del paquete win32all), probé lo siguiente:

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()

Cuando ejecuto esto, obtengo lo siguiente:

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

Los otros tipos de datos que probé (VARCHAR2, BLOB) no causan este problema.¿Existe alguna forma de recuperar marcas de tiempo?

¿Fue útil?

Solución

Creo que esto es un error en el controlador ODBC de Oracle.Básicamente, el controlador ODBC de Oracle no es compatible con el TIMESTAMP WITH (LOCAL) TIME ZONE tipos de datos, sólo el TIMESTAMP tipo de datos.Como ha descubierto, una solución alternativa es, de hecho, utilizar el TO_CHAR método.

En su ejemplo, en realidad no está leyendo la información de la zona horaria.Si tienes el control de la mesa, puedes convertirla en una recta. TIMESTAMP columna.Si no tiene control sobre la tabla, otra solución puede ser crear una vista que convierta de TIMESTAMP WITH TIME ZONE a TIMESTAMP a través de una cadena - lo siento, no sé si hay una manera de convertir directamente desde TIMESTAMP WITH TIME ZONE a TIMESTAMP.

Otros consejos

Mi solución a esto, que espero pueda mejorarse, es usar Oracle para convertir explícitamente TIMESTAMP en una cadena:

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

Esto funciona, pero no es portátil.Me gustaría usar el mismo script de Python en una base de datos de SQL Server, por lo que una solución específica de Oracle (como TO_CHAR) no funcionará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top