开发者

strange Oracle error: "invalid format text"

开发者 https://www.devze.com 2023-01-11 09:32 出处:网络
I\'m trying to fetch some data from a column whose DATA_TYPE=NUMBER(1,0) with this piece of code: import cx_Oracle

I'm trying to fetch some data from a column whose DATA_TYPE=NUMBER(1,0) with this piece of code:

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

which complains thus:

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

Replacing 'DELETED' column with one whose DATA_TYPE=VARCHAR2 does not throw such a complaint.


I am running in to this problem now using cx_Oracle 5.0.4 with Unicode support. The above accepted solution did not work for me. The DELETED column in the question is a Numeric column, which is what causes this bug.

According to the mailing list ( http://comments.gmane.org/gmane.comp.python.db.cx-oracle/2390 ) it may be a bug in Oracle that shows only in cx_Oracle with Unicode support.

from the link: "When I build cx_Oracle without Unicode support, it all works as expected. When I build cx_Oracle with Unicode support, attempting to use a query that returns a numeric value (such as):

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

results in this exception:

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

"

What I did to work around it, is on the select statement, do:

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

It's pretty ugly, but it works.


These types of errors went away when I upgraded to cx_Oracle 5.1. If the RPM doesn't install (like it happened for me on Red Hat 5.5) then you can usually rpm2cpio the file, take the cx_Oracle.so and put it into your python site-packages directory.


A work-around is putting time.sleep(1) before cursor.fetchone():

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


I had the same error.

Commit helped me:

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

精彩评论

暂无评论...
验证码 换一张
取 消