Recuperando um timestamp Oracle usando módulo de ODBC Win32 do Python

votos
2

Dada uma tabela Oracle criada usando o seguinte:

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

Usando o módulo de ODBC Python de suas extensões Win32 (do pacote win32all), eu tentei o seguinte:

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

Quando eu executo isso, recebo a seguinte:

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

Os outros tipos de dados que eu tentei (VARCHAR2, BLOB) não causam esse problema. Existe uma maneira de recuperar timestamps?

Publicado 01/09/2008 em 22:06
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Eu acredito que este é um bug no driver ODBC Oracle. Basicamente, o driver ODBC para Oracle não suporta os TIMESTAMP WITH (LOCAL) TIME ZONEtipos de dados, apenas o TIMESTAMPtipo de dados. Como você descobriu, uma solução é, de fato, usar o TO_CHARmétodo.

No seu exemplo você não está realmente lendo as informações de fuso horário. Se você tem o controle da tabela que você pode convertê-lo para um straight TIMESTAMPcoluna. Se você não tem controle sobre a mesa, outra solução pode ser criar uma visão que converte a partir TIMESTAMP WITH TIME ZONEde TIMESTAMPatravés de uma string - desculpe, eu não sei se existe uma maneira de converter directamente a partir TIMESTAMP WITH TIME ZONEde TIMESTAMP.

Respondeu 02/09/2008 em 03:33
fonte usuário

votos
1

Minha solução para isso, que eu espero que pode ser melhorado, é usar o Oracle para converter explicitamente o TIMESTAMP em uma string:

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

Isso funciona, mas não é portátil. Eu gostaria de usar o mesmo script Python contra um banco de dados SQL Server, para uma solução da Oracle específico-(como TO_CHAR) não funcionará.

Respondeu 01/09/2008 em 22:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more