Come convertire la stringa esadecimale in binario in Python per l'inserto usando cx_oracle

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

  •  29-10-2019
  •  | 
  •  

Domanda

Ho un file di testo contenente un elenco di numeri esadecimali a 16 bit (ad esempio 61C7393AA9B3474DB081C7B7CCE1C545 ') e devo inserirli una colonna Oracle RAW usando CX_ORACLE. Ho provato questo:

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)

Ma fallisce con CX_oracle.databaseerror: ORA-01036: nome/numero della variabile illegale. Devo convertire i valori in binario in Python prima di chiamare ExecuteMany? E se sì come? NB Lo stesso SQL funziona bene con Cursor.Execute e un unico valore, solo con l'elenco che sto avendo problemi.

È stato utile?

Soluzione

Bene, l'ho risolto, in un paio di modi. In primo luogo, il codice sopra è errato in quanto crea un elenco di valori mentre dovrebbe creare un elenco di tuple. cioè

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

e poi usando

cursor.setinputsizes(cx_Oracle.STRING)

funziona. Sulla domanda originale: come sbarazzarsi di Hextoraw, ho scoperto che funziona:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top