2008-09-01 1 views
2

Учитывая таблица Oracle создан с использованием следующих:Получение в метку времени Oracle с использованием Win32 ODBC Пайтона модуль

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

Использование модуля Python ODBC из его Win32 extensions (из пакета win32all), я попробовал следующее:

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

Когда я запускаю это, я получаю следующее:

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

Другие типы данных, которые я пробовал (VARCHAR2, BLOB), не вызывают этой проблемы. Есть ли способ получить временные метки?

ответ

2

Я считаю, что это ошибка в драйвере Oracle ODBC. В принципе, драйвер ODBC Oracle не поддерживает типы данных TIMESTAMP WITH (LOCAL) TIME ZONE, только тип данных TIMESTAMP. Как вы обнаружили, одним из способов является использование метода TO_CHAR.

В вашем примере вы фактически не читаете информацию о часовом поясе. Если у вас есть контроль над таблицей, вы можете преобразовать ее в прямой столбец TIMESTAMP. Если у вас нет контроля над таблицей, другим решением может быть создание представления, которое преобразует из TIMESTAMP WITH TIME ZONE в TIMESTAMP через строку - извините, я не знаю, есть ли способ конвертировать непосредственно из TIMESTAMP WITH TIME ZONE в TIMESTAMP.

1

Мое решение этой проблемы, то я надеюсь, что может быть улучшено, является использование Oracle явно преобразовать TIMESTAMP в строку:

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

Это работает, но не является портативным. Я хотел бы использовать один и тот же скрипт Python для базы данных SQL Server, поэтому решение, специфичное для Oracle (например, TO_CHAR), не будет работать.