странная ошибка Oracle: «неверный формат текста» - PullRequest
1 голос
/ 12 августа 2010

Я пытаюсь получить некоторые данные из столбца, 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

Замена столбца «УДАЛЕНО» на столбец с DATA_TYPE = VARCHAR2 не вызывает такую ​​жалобу.

Ответы [ 4 ]

2 голосов
/ 11 января 2011

Я работаю над этой проблемой сейчас, используя cx_Oracle 5.0.4 с поддержкой Unicode.Принятое выше решение не работает для меня.Столбец DELETED в вопросе - это числовой столбец, который и вызывает эту ошибку.

Согласно списку рассылки (http://comments.gmane.org/gmane.comp.python.db.cx-oracle/2390), это может быть ошибка в Oracle, которая отображается только в cx_Oracle сПоддержка Unicode.

по ссылке: «Когда я собираю cx_Oracle без поддержки Unicode, все работает как положено. Когда я собираю cx_Oracle с поддержкой Unicode, пытаюсь использовать запрос, который возвращаетчисловое значение (например,):

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

приводит к этому исключению:

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

"

То, что я сделал, чтобы обойти это, находится в операторе выбора, сделайте:

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

Это довольно уродливо, но работает.

2 голосов
/ 10 октября 2011

Эти типы ошибок исчезли, когда я обновился до cx_Oracle 5.1. Если RPM не устанавливается (как это случилось со мной в Red Hat 5.5), то обычно вы можете rpm2cpio файл, взять cx_Oracle.so и поместить его в каталог python site-packages.

0 голосов
/ 22 января 2012

У меня была такая же ошибка.

Фиксация помогла мне:

conn = cx_Oracle.connect(...)
...
cursor.execute()
conn.commit()
0 голосов
/ 29 октября 2010

Обходной путь ставит time.sleep(1) перед cursor.fetchone():

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