Python 在cx\U Oracle上执行CLOB元素

Python 在cx\U Oracle上执行CLOB元素,python,cx-oracle,executemany,Python,Cx Oracle,Executemany,我有一个函数,可以将一块数据插入oracle数据库。我试图通过使用ExecuteMy来实现这一点 我的函数如下所示: def InsertChunk(self): try: if len(self.list_dict_values) >= self.chunksize: self.db.cursor.executemany( str(self.insert_sql), self.list_dict_values

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

我的函数如下所示:

  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
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()
许多表都使用此函数,如果这些表中没有CLOB列,则此函数可以正常工作。只有当chunksize设置为1或2时,它才适用于具有CLOB列的表。有时它在3上有效,但大多数情况下不起作用。我甚至在chunksize为4时让它工作过一次。我使用这个函数将块大小设置为1000左右,以加快处理速度

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

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

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


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

我也有同样的问题。在我的例子中,这是由于不正确地使用
cx\u Oracle
变量类型造成的。当填写我的等价物
列表记录值时
我是这样做的:

  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
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()
与许多小变量不同,您需要创建一个带有arraysize的单个变量,然后在dict的每一行中引用它

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代码在内部想要迭代指针列表,所以这就是您需要做的。

除了
if
语句之外,哪里使用了
chunksize