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

发布于 2024-07-05 21:48:56 字数 772 浏览 11 评论 0原文

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

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

使用 Win32 扩展 中的 Python ODBC 模块 (来自 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)不会导致此问题。 有没有办法检索时间戳?

Given an Oracle table created using the following:

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

Using the Python ODBC module from its Win32 extensions (from the win32all package), I tried the following:

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

When I run this, I get the following:

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

The other data types I've tried (VARCHAR2, BLOB) do not cause this problem. Is there a way of retrieving timestamps?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜`诱少女 2024-07-12 21:48:56

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

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

I believe this is a bug in the Oracle ODBC driver. Basically, the Oracle ODBC driver does not support the TIMESTAMP WITH (LOCAL) TIME ZONE data types, only the TIMESTAMP data type. As you have discovered, one workaround is in fact to use the TO_CHAR method.

In your example you are not actually reading the time zone information. If you have control of the table you could convert it to a straight TIMESTAMP column. If you don't have control over the table, another solution may be to create a view that converts from TIMESTAMP WITH TIME ZONE to TIMESTAMP via a string - sorry, I don't know if there is a way to convert directly from TIMESTAMP WITH TIME ZONE to TIMESTAMP.

溺渁∝ 2024-07-12 21:48:56

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

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

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

My solution to this, that I hope can be bettered, is to use Oracle to explicitly convert the TIMESTAMP into a string:

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

This works, but isn't portable. I'd like to use the same Python script against a SQL Server database, so an Oracle-specific solution (such as TO_CHAR) won't work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文