cx_oracleを使用して挿入するためにhex文字列をpythonのバイナリに変換する方法
質問
16ビットヘックス番号のリスト( '61C7393AA9B3474DB081C7B7CCE1C545')のリストを含むテキストファイルがあり、CX_ORACLEを使用してOracle RAW列を挿入する必要があります。私はこれを試しました:
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)
ただし、CX_ORACLE.DATABASEERROR:ORA-01036:違法な変数名/番号で失敗します。 executemanyを呼び出す前に、値をPythonのバイナリに変換する必要がありますか?もしそうなら、どうやって? NB同じSQLは、cursor.executeと単一の値で正常に動作します。これは、問題があるリストだけです。
解決
まあ、私はいくつかの方法でそれを解決しました。まず、値のリストを作成するのに対し、上記のコードは正しくありませんが、タプルのリストを作成する必要があります。すなわち
ids = [(l.strip(),) for l in guidfile.readlines()]
そして、使用します
cursor.setinputsizes(cx_Oracle.STRING)
できます。元の質問で - ヘクストラウを取り除く方法、私はこれが機能することを発見しました:
import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)
所属していません StackOverflow