0

16 ビットの 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: illegal variable name/number で失敗します。executemany を呼び出す前に、Python で値をバイナリに変換する必要がありますか? もしそうなら、どのように?NB同じSQLがcursor.executeと単一の値で正常に機能しますが、リストだけで問題が発生しています。

4

1 に答える 1

0

さて、いくつかの方法で解決しました。まず、タプルのリストを作成する必要があるのに、値のリストを作成するため、上記のコードは正しくありません。すなわち

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

そして使用する

cursor.setinputsizes(cx_Oracle.STRING)

できます。元の質問 - hextoraw を取り除く方法について、私はこれが機能することを発見しました:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)
于 2012-01-17T11:07:02.307 に答える