Получение метки времени Oracle с использованием модуля Python Win32 ODBC - PullRequest
3 голосов
/ 02 сентября 2008

С учетом таблицы Oracle, созданной с использованием следующего:

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

Используя модуль Python ODBC из его Win32-расширений (из пакета 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 ]

2 голосов
/ 02 сентября 2008

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

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

1 голос
/ 02 сентября 2008

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

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

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

...