étrange erreur Oracle: « texte de format non valide »
-
27-09-2019 - |
Question
Je suis en train de chercher des données d'une colonne dont DATA_TYPE = NUMBER (1,0) avec ce morceau de 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])
qui se plaint ainsi:
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
Remplacement colonne « SUPPRIME » avec celui dont DATA_TYPE = VARCHAR2 ne jette pas une telle plainte.
La solution 3
met au travail autour time.sleep(1)
avant cursor.fetchone()
:
...
cursor.execute("SELECT DELETED FROM SERVICEORDER WHERE ORDERID='TEST'")
time.sleep(1)
print(cursor.fetchone()[0])
Autres conseils
Je suis en cours d'exécution pour ce problème en utilisant maintenant cx_Oracle 5.0.4 avec le support Unicode. La solution ci-dessus acceptée n'a pas fonctionné pour moi. La colonne SUPPRIME dans la question est une colonne numérique, qui est ce qui provoque ce bogue.
D'après la liste de diffusion ( http: // commentaires. gmane.org/gmane.comp.python.db.cx-oracle/2390 ), il peut être un bogue dans Oracle qui ne montre que dans cx_Oracle avec le support Unicode.
à partir du lien: « Quand je construis cx_Oracle sans support Unicode, tout fonctionne comme prévu. Quand je construis cx_Oracle avec support Unicode, essayez d'utiliser une requête qui retourne une valeur numérique (par exemple):
con = Connection( ... )
cur = con.cursor()
cur.execute( 'SELECT 1 FROM DUAL' )
rows = cur.fetchall()
résultats dans cette exception:
cx_Oracle.DatabaseError: OCI-22061: invalid format text [T
"
Ce que je faisais au travail autour d'elle, est sur l'instruction select, faites:
cur.execute( 'SELECT to_char(1) FROM DUAL' )
rows = cur.fetchall()
for row in rows:
val = int(row[0])
Il est assez laid, mais ça fonctionne.
Ces types d'erreurs a disparu quand je suis passé à cx_Oracle 5.1. Si le RPM n'installe pas (comme il est arrivé pour moi sur Red Hat 5.5), vous pouvez généralement rpm2cpio le fichier, prenez le cx_Oracle.so et la mettre dans votre python répertoire site-packages.
J'ai eu la même erreur.
commit m'a aidé:
conn = cx_Oracle.connect(...)
...
cursor.execute()
conn.commit()