gpt4 book ai didi

python - 在 cx_Oracle 上执行许多 CLOB 元素

转载 作者:行者123 更新时间:2023-11-30 23:52:58 44 4
gpt4 key购买 nike

我有一个函数可以将一大块数据插入到oracle数据库中。我试图通过使用executemany 来实现这一点。

我的函数如下所示:

  def InsertChunk(self):
try:
if len(self.list_dict_values) >= self.chunksize:
self.db.cursor.executemany(
str(self.insert_sql),
self.list_dict_values
)
self.list_dict_values = []
except cx_Oracle.Error, e:
print e

此函数被许多表使用,如果这些表中没有 CLOB 列,则该函数可以正常工作。仅当 chunksize 设置为 1 或 2 时,它才适用于具有 CLOB 列的表。有时它适用于 3,但大多数情况下不起作用。当 block 大小为 4 时,我什至让它工作了一次。我使用此函数将 block 大小设置为 1000 左右,以加快进程。

当chunksize设置为3时,有时会返回以下错误:

ORA-24813: 无法发送或接收不受支持的 LOB。

有时它会说已中止并停止脚本。

知道为什么这个脚本每次使用相同的参数运行时都有不同的行为吗?

最佳答案

我也遇到了同样的问题。就我而言,这是由于错误使用 cx_Oracle 变量类型造成的。当填写相当于 list_dict_values 的内容时,我正在做这样的事情:

for row in list_dict_values:
for key, val in row.iteritems():
v = cursor.var(cx_Oracle.CLOB)
v.setvalue(0, val)
row[key] = v
..
InsertChunk()

您需要创建一个具有数组大小的单个变量,而不是许多小变量,然后在字典的每一行中引用它。

lobdict = {}
for k in list_dict_vals[0].keys():
lobdict[k] = cursor.var(cx_Oracle.CLOB, arraysize=len(list_dict_vals))
for rownum, row in enumerate(list_dict_values):
for key, val in row.iteritems():
lob = lobdict[key]
lob.setvalue(rownum, val)
row[key] = lob
...
InsertChunk()

将每一行设置为相同的值似乎很奇怪,但它是有效的 - 在内部,oracle 代码想要迭代指针列表,所以这就是您需要做的。

关于python - 在 cx_Oracle 上执行许多 CLOB 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6131306/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com