奇怪的Oracle错误:“格式文本无效”

时间:2010-08-12 00:42:46

标签: python-3.x cx-oracle

我正在尝试使用以下代码从DATA_TYPE = NUM​​BER(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 个答案:

答案 0 :(得分: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])

这很丑陋,但确实有效。

答案 1 :(得分:2)

当我升级到cx_Oracle 5.1时,这些类型的错误消失了。如果RPM没有安装(就像我在Red Hat 5.5上发生的那样)那么你通常可以rpm2cpio文件,把cx_Oracle.so放到你的python site-packages目录中。

答案 2 :(得分:0)

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

...
cursor.execute("SELECT DELETED FROM SERVICEORDER WHERE ORDERID='TEST'")
time.sleep(1)
print(cursor.fetchone()[0])

答案 3 :(得分:0)

我遇到了同样的错误。

提交帮助我:

conn = cx_Oracle.connect(...)
...
cursor.execute()
conn.commit()