You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将cx_Oracle/oracledb批量插入的坏记录导入指定表?

需求完全可行,实现方案如下

首先修正你原代码里的两处语法问题:

  • SQL语句的右括号缺失,应该写成 "insert into target_table(col1, col2, col3) values (:1, :2, :3)"
  • batcherrors=True 是关键字参数,要放在正确位置

接下来是具体实现步骤和代码:

  1. 获取坏记录的位置:cursor.getbatcherrors() 返回的错误对象包含 rowindex 属性,对应 data 列表中失败记录的下标。
  2. 转换坏记录格式:通过下标取出坏记录,用竖线 | 拼接成字符串(注意处理非字符串类型的字段,统一转成字符串)。
  3. 收集错误信息:从错误对象中提取错误码、错误描述等详情。
  4. 批量插入错误日志表:把包含执行时间、转换后的记录字符串、错误信息的数据批量插入目标日志表。

示例代码(以cx_Oracle驱动为例,其他数据库驱动逻辑类似,仅错误对象属性可能略有差异):

import datetime

# 目标表插入语句(修正语法错误)
insert_sql = "insert into target_table(col1, col2, col3) values (:1, :2, :3)"
cursor.executemany(insert_sql, data, batcherrors=True)
connection.commit()

# 错误日志表插入语句
error_log_sql = "insert into error_log(run_date, data_string, error) values (:1, :2, :3)"
error_data = []

# 遍历批量错误,组装日志数据
for error_obj in cursor.getbatcherrors():
    # 取出对应下标坏记录
    bad_row = data[error_obj.rowindex]
    # 转成竖线分隔字符串
    row_str = "|".join(str(item) for item in bad_row)
    # 拼接错误详情(不同驱动的错误属性可能不同,比如有些是row_index、msg等)
    error_detail = f"错误码: {error_obj.code}, 错误信息: {error_obj.message}"
    # 组装日志记录,run_date用当前执行时间
    error_data.append((datetime.datetime.now(), row_str, error_detail))

# 批量插入错误日志
if error_data:
    cursor.executemany(error_log_sql, error_data)
    connection.commit()

注意事项

  • 不同数据库驱动的批量错误对象属性可能有差异,比如部分驱动用 row_index 代替 rowindex,需参考对应驱动文档。
  • 如果记录字段本身包含竖线,建议提前做转义处理(比如用 \| 代替 |),避免后续解析日志时出错。
  • run_date 可根据需求替换为任务启动时间,不一定用当前时间。

内容的提问来源于stack exchange,提问作者Dinakar Ullas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:42:13