cx_oracleを使用して挿入するためにhex文字列をpythonのバイナリに変換する方法

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

  •  29-10-2019
  •  | 
  •  

質問

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top