0

我有一个包含 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 中将值转换为二进制?如果是这样怎么办?注意,相同的 sql 适用于 cursor.execute 和单个值,它仅适用于我遇到问题的列表。

4

1 回答 1

0

好吧,我已经通过几种方式解决了它。首先,上面的代码是不正确的,因为它创建了一个值列表,而它应该创建一个元组列表。IE

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 回答