使用 cx_Oracle 插入 CLOB

问题描述 投票:0回答:2

我正在尝试使用以下代码插入一个 CLOB。

cursor = connection.cursor()
cursor.setinputsizes(HERP = cx_Oracle.CLOB)

cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", FOO=val1, BAR=val2)
cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3) 
#len(HERP) 39097

当我在没有

cursor.setinputsizes(HERP = cx_Oracle.CLOB)
的情况下运行脚本时,它在使用
ValueError: string data too large
的第二个查询中失败,当我使用
cursor.setinputsizes(HERP = cx_Oracle.CLOB)
运行脚本时,它在使用
DatabaseError: ORA-01036: illegal variable name/number
的第一个查询中失败。我试图插入的 CLOB 包含一个代码片段(即它有很多分号、逗号和括号),
"string".decode("ascii")
返回
u'string'
,所以 unicode 不是问题……对吗?我不知道这两件事是否有问题。数据库中的字段当前是一个 CLOB,但是我已经用 NCLOB 尝试过并且行为没有改变。

我也尝试将该字段作为 BLOB,然后在我插入的值上使用

.encode("hex")
,同样的行为。

我也尝试过

HERP = cursor.var(cx_Oracle.CLOB)
而不是
cursor.setinputsizes(HERP = cx_Oracle.CLOB)
,同样的问题。

我一直在讨论 cx-oracle-users 列表,但还没有运气。

如果我使用这条线

cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP="".join(set(val3)).encode("hex"))
,它会起作用,所以我认为这不是数据内容的问题(这是 BLOB)。

如何使用

cx_Oracle
将 CLOB 插入 Oracle 数据库?

python oracle cx-oracle
2个回答
5
投票

有几种可能的解决方案:

  1. 升级cx_Oracle。我不确定你使用的是哪个版本,但我使用的是 python 2.7.2 和 cx_Oracle 5.1,在不使用 setinputsizes 的情况下将 150,000 个字符插入 CLOB 列时我没有收到任何错误。
  2. 由于 setinputsizes 适用于每个后续游标使用,只需在这些不同的 cursor.execute 语句之间更改它。

例如:

cursor = connection.cursor()
cursor.setinputsizes(FOO=None, BAR=None)
cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", 
FOO=val1,  BAR=val2)
cursor.setinputsizes(HERP = cx_Oracle.CLOB)
cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3)

0
投票

我只是使用了一个 json 对象,因为我已经有了要剪切和粘贴的代码。我敢肯定还有其他东西可以将文本设置为 eh

eh = json.loads(text)
eh[var]=whatever

cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=eh[var]) 
© www.soinside.com 2019 - 2024. All rights reserved.