A recuperação de um Oracle carimbo de data / hora utilizando Python Win32 ODBC módulo

StackOverflow https://stackoverflow.com/questions/38435

  •  09-06-2019
  •  | 
  •  

Pergunta

Dada uma tabela do Oracle criado usando o seguinte:

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

Usando o Python módulo ODBC a partir de sua Win32 extensões (a partir do win32all pacote), 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 obter carimbos de data / hora?

Foi útil?

Solução

Eu acredito que este é um bug no driver de ODBC do Oracle.Basicamente, o driver de ODBC do Oracle não suporta a TIMESTAMP WITH (LOCAL) TIME ZONE tipos de dados, apenas o TIMESTAMP tipo de dados.Como você descobriu, uma solução é, na verdade, usar o TO_CHAR o método.

No seu exemplo você não está realmente lendo as informações de fuso horário.Se você tem controle de tabela, você pode convertê-lo para um straight TIMESTAMP coluna.Se você não tem o controle sobre a mesa, outra solução pode ser a de criar um modo de exibição que converte a partir de TIMESTAMP WITH TIME ZONE para TIMESTAMP através de uma seqüência de caracteres - desculpe, eu não sei se existe uma maneira de converter directamente a partir TIMESTAMP WITH TIME ZONE para TIMESTAMP.

Outras dicas

A minha solução para isso, que eu espero pode ser melhorada, é a utilização de Oracle para converter explicitamente o CARIMBO de data / hora em uma seqüência de caracteres:

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 um Oracle solução específica (tais como TO_CHAR) não funcionam.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top