使用Python的Win32 ODBC模块检索Oracle时间戳

时间:2020-03-05 18:46:08  来源:igfitidea点击:

给定使用以下命令创建的Oracle表:

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

我使用来自Win32扩展(来自win32all软件包)的Python ODBC模块,尝试了以下操作:

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)不会导致此问题。有没有一种获取时间戳的方法?

解决方案

回答

我希望可以改善此问题的解决方案是使用Oracle将TIMESTAMP显式转换为字符串:

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

这可行,但不可移植。我想对SQL Server数据库使用相同的Python脚本,因此特定于Oracle的解决方案(例如TO_CHAR)将不起作用。

回答

我相信这是Oracle ODBC驱动程序中的错误。基本上,Oracle ODBC驱动程序不支持" TIMESTAMP WITH(LOCAL)TIME ZONE"数据类型,仅支持" TIMESTAMP"数据类型。正如我们所发现的,一种解决方法实际上是使用TO_CHAR方法。

在示例中,我们实际上并没有在阅读时区信息。如果我们可以控制表格,则可以将其转换为直接的" TIMESTAMP"列。如果我们无法控制表格,则另一种解决方案可能是创建一个视图,该视图通过字符串从" TIMESTAMP WITH TIME ZONE"转换为" TIMESTAMP",抱歉,我不知道是否有直接转换的方法从"带时区的时间戳"到"时间戳"。