странная ошибка Оракула:“неверный формат текста”
-
27-09-2019 - |
Вопрос
Я пытаюсь извлечь некоторые данные из столбца, 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 не вызывает такой жалобы.
Решение 3
Обходной путь заключается в том, чтобы поместить time.sleep(1)
до того, как cursor.fetchone()
:
...
cursor.execute("SELECT DELETED FROM SERVICEORDER WHERE ORDERID='TEST'")
time.sleep(1)
print(cursor.fetchone()[0])
Другие советы
Сейчас я решаю эту проблему, используя cx_Oracle 5.0.4 с поддержкой Unicode.Приведенное выше принятое решение у меня не сработало.УДАЛЕННЫЙ столбец в вопросе - это числовой столбец, который и является причиной этой ошибки.
Согласно списку рассылки ( 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
"
Что я сделал, чтобы обойти это, так это в инструкции select выполните:
cur.execute( 'SELECT to_char(1) FROM DUAL' )
rows = cur.fetchall()
for row in rows:
val = int(row[0])
Это довольно некрасиво, но это работает.
Эти типы ошибок исчезли, когда я обновился до cx_Oracle 5.1.Если RPM не устанавливается (как это случилось со мной в Red Hat 5.5), то обычно вы можете rpm2cpio файл, взять cx_Oracle.so и поместить его в каталог пакетов вашего сайта python.
У меня была такая же ошибка.
Фиксация помогла мне:
conn = cx_Oracle.connect(...)
...
cursor.execute()
conn.commit()