Comment convertir une chaîne hexadécimale en binaire en python pour une insertion à l'aide de cx_oracle

StackOverflow https://stackoverflow.com/questions/8886359

  •  29-10-2019
  •  | 
  •  

Question

J'ai un fichier texte contenant une liste de nombres hexadécimaux 16 bits (par exemple '61C7393AA9B3474DB081C7B7CCE1C545') et je dois leur insérer une colonne Oracle RAW en utilisant cx_Oracle. J'ai essayé ceci:

sql = "INSERT INTO GUIDS VALUES (HEXTORAW(:1))"
ids = [l.strip() for l in guidfile.readlines()]
cursor.bindarraysize = len(ids)
cursor.setinputsizes(cx_Oracle.BINARY)
cursor.executemany(sql, ids)

mais il échoue avec cx_Oracle.DatabaseError: ORA-01036: nom / numéro de variable non autorisé. Dois-je convertir les valeurs en binaire en python avant d'appeler executemany?Et si oui comment?NB le même sql fonctionne bien avec cursor.execute et une seule valeur, c'est juste avec la liste que j'ai des problèmes.

Était-ce utile?

La solution

Eh bien, je l'ai résolu, de plusieurs manières.Premièrement, le code ci-dessus est incorrect car il crée une liste de valeurs alors qu'il devrait créer une liste de tuples.c'est-à-dire

ids = [(l.strip(),) for l in guidfile.readlines()]

puis en utilisant

cursor.setinputsizes(cx_Oracle.STRING)

ça marche. Sur la question initiale - comment se débarrasser de l'hextoraw, j'ai trouvé que cela fonctionne:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top