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
相关产品推荐
相关产品推荐

