我正在尝试使用以下代码从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并未引起此类投诉的列。
答案 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()