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

Python使用cx_Oracle插入CSV到Oracle报ORA-01722错误如何解决

错误根因

ORA-01722是无效数字错误,和日期转换无关,核心问题如下:

  • 没有跳过CSV表头行:CSV第一行是字段名文本,直接插入NUMBER类型的CL_SEQ字段触发类型错误
  • 数据类型未显式转换:从CSV读取的所有字段默认都是字符串类型,NUMBER、DATE类型的字段直接传字符串依赖Oracle隐式转换,规则不匹配就会报错
  • setinputsizes设置和表结构完全不匹配,反而会引发额外的类型转换问题

修复后的代码

import csv
from datetime import datetime
import cx_Oracle

# 原有数据库连接代码保留即可
batch_size = 1000  # 50万条数据批量设置1000-2000性能最优

# 日期转换函数,匹配CSV内的日期格式
def str_to_date(date_str):
    return datetime.strptime(date_str, "%m/%d/%Y %H:%M")

with open(r'C:\Users\ncdex1124\Desktop\New folder\file9.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)  # 跳过表头行,为核心修复点
    sql = """INSERT INTO UCIDBA.fut_client_list 
             VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11)"""
    data = []
    for line in csv_reader:
        # 按表结构显式转换对应字段类型
        record = (
            int(line[0]),  # CL_SEQ转换为数字类型
            line[1],
            line[2],
            line[3],
            line[4],
            line[5].strip(),  # 清理示例中CL_PAN_STATUS的多余空格,避免CHAR类型存储异常
            line[6],
            str_to_date(line[7]),  # 转换为DATE类型
            line[8],
            str_to_date(line[9]),  # 转换为DATE类型
            line[10]
        )
        data.append(record)
        if len(data) >= batch_size:
            cursor.executemany(sql, data)
            data = []
    if data:
        cursor.executemany(sql, data)
    connection.commit()
    print("successful")

批量插入优化说明

50万条数据建议将batch_size设置为1000-2000,相比单条插入性能可提升数十倍,同时不会占用过多内存。

内容的提问来源于stack exchange,提问作者alok sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:54:02