在cx_Oracle上执行CLOB元素

| 我有一个函数,可以将大量数据插入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,但大多数时候不起作用。我什至在块大小为4时使它工作一次。我正在使用此功能将块大小设置为1000左右,以加快处理速度。 当chunksize设置为3时,有时会返回以下错误: ORA-24813:无法发送或接收不支持的LOB。 有时它说中止并停止脚本。 知道为什么每次使用相同参数运行此脚本时都会有不同的行为吗?     
已邀请:
我有同样的问题。在我的情况下,这是由于错误地使用
cx_Oracle
变量类型引起的。当我填写相当于equivalent2的金额时,我正在执行以下操作:
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代码在内部希望遍历指针列表,所以这就是您需要做的。     

要回复问题请先登录注册