1

我正在尝试使用这段代码从 DATA_TYPE=NUMBER(1,0) 的列中获取一些数据:

import cx_Oracle
conn = cx_Oracle.connect(usr, pwd, url)
cursor = conn.cursor()
cursor.execute("SELECT DELETED FROM SERVICEORDER WHERE ORDERID='TEST'")
print(cursor.fetchone()[0])

因此抱怨:

Traceback (most recent call last):
  File "main.py", line 247, in <module>
    check = completed()
  File "main.py", line 57, in completed
    deleted = cursor.fetchone()[0]
cx_Oracle.DatabaseError: OCI-22061: invalid format text [T

将 'DELETED' 列替换为 DATA_TYPE=VARCHAR2 不会引发此类投诉的列。

4

4 回答 4

2

我现在使用支持 Unicode 的 cx_Oracle 5.0.4 遇到了这个问题。上述接受的解决方案对我不起作用。问题中的 DELETED 列是数字列,这就是导致此错误的原因。

根据邮件列表(http://comments.gmane.org/gmane.comp.python.db.cx-oracle/2390),这可能是 Oracle 中的一个错误,仅在支持 Unicode 的 cx_Oracle 中显示。

来自链接:“当我在不支持 Unicode 的情况下构建 cx_Oracle 时,一切都按预期工作。当我在支持 Unicode 的情况下构建 cx_Oracle,尝试使用返回数值的查询(例如):

con = Connection( ... )
cur = con.cursor()
cur.execute( 'SELECT 1 FROM DUAL' )
rows = cur.fetchall()

导致此异常:

cx_Oracle.DatabaseError: OCI-22061: invalid format text [T

"

我为解决它所做的工作是在 select 语句中,执行以下操作:

cur.execute( 'SELECT to_char(1) FROM DUAL' )
rows = cur.fetchall()
for row in rows:
    val = int(row[0])

这很丑陋,但它有效。

于 2011-01-11T00:39:21.777 回答
2

当我升级到 cx_Oracle 5.1 后,这些类型的错误就消失了。如果 RPM 没有安装(就像我在 Red Hat 5.5 上发生的那样),那么您通常可以 rpm2cpio 文件,获取 cx_Oracle.so 并将其放入您的 python 站点包目录。

于 2011-10-09T21:58:50.570 回答
0

一种解决方法是放在time.sleep(1)之前cursor.fetchone()

...
cursor.execute("SELECT DELETED FROM SERVICEORDER WHERE ORDERID='TEST'")
time.sleep(1)
print(cursor.fetchone()[0])
于 2010-10-29T18:34:24.127 回答
0

我有同样的错误。

提交帮助了我:

conn = cx_Oracle.connect(...)
...
cursor.execute()
conn.commit()
于 2012-01-22T12:45:29.247 回答