3

给定一个使用以下命令创建的 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)不会导致这个问题。有没有办法检索时间戳?

4

2 回答 2

2

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

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

于 2008-09-02T02:33:57.807 回答
1

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

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

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

于 2008-09-01T21:14:43.110 回答