python - cx_Oracle.DatabaseError ORA-01722: 无效数字 python
问题描述
我需要将多条记录从 csv 插入到 oracle 数据库。但低于错误。据我了解,它正在引发错误,因为它试图将日期和时间从字符串转换为日期数据类型并引发错误。我怎样才能纠正这个错误以便它被插入。最初我试图只插入一行,但它将有大约一百万,而且我也不允许在数据库级别更改数据类型。有类似的问题,但无法真正理解或找到解决方案,这就是为什么发布这个.
注意:此代码适用于具有两列的不同 csv 和不同表,并且两列都具有 varchar 的 db 数据类型
错误:
Traceback (most recent call last):
File "D:\test\insertfutclient.py", line 26, in <module>
cursor.executemany(sql, data)
cx_Oracle.DatabaseError: ORA-01722: invalid number
我的 CSV 文件:
CL_SEQ,CL_TMID,CL_CLIENT_ID,CL_PAN,CL_CLI_STATUS,CL_PAN_STATUS,CL_ACTION_TYPE,CL_CREATED_DATE,CL_CREATED_BY,CL_MODIFIED_DATE,CL_MODIFIED_BY
3793375,21,MEN0008,ARJPP6330Q,A,V ,0,9/6/2019 14:23,SYSTEM,9/9/2019 11:28,SYSTEM
我的代码:
# Predefine the memory areas to match the table definition
cursor.setinputsizes(None,25)
# Adjust the batch size to meet your memory and performance requirements
batch_size = 1
with open('C:\\Users\\ncdex1124\Desktop\\New folder\\file9.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
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:
data.append((line[0],line[1],line[2],line[3],line[4],line[5],line[6],line[7],line[8],line[9],line[10]))
if len(data) % batch_size == 0:
cursor.executemany(sql, data)
if data:
cursor.executemany(sql, data)
connection.commit()
print("successful")
数据库表信息:
desc fut_client_list
Name Null Type
CL_SEQ NOT NULL NUMBER
CL_TMID VARCHAR2(5)
CL_CLIENT_ID VARCHAR2(10)
CL_PAN VARCHAR2(10)
CL_CLI_STATUS CHAR(1)
CL_PAN_STATUS CHAR(2)
CL_ACTION_TYPE VARCHAR2(1)
CL_CREATED_DATE DATE
CL_CREATED_BY VARCHAR2(10)
CL_MODIFIED_DATE DATE
CL_MODIFIED_BY VARCHAR2(10)
解决方案
您的数据类型不匹配 - 在 Python 端,所有变量都是字符串(转换为VARCHAR2
),但在 Oracle 端,您的表有多种数据类型。您可以在 Python 端或 Oracle 端解决此问题。
Python 端:将字符串转换为适当的数据类型。Cx_Oracle 理解datetime.datetime
对象,因此将您的日期字符串转换为那些。
data.append((int(line[0]),line[1],line[2],line[3],line[4],line[5],line[6],
datetime.datetime.strptime(line[7], "%m/%d/%Y %H:%M"),line[8],
datetime.datetime.strptime(line[9], "%m/%d/%Y %H:%M"),line[10]))
或者
Oracle 端:将 varchar2 参数转换为适当的数据类型
"INSERT INTO UCIDBA.fut_client_list VALUES (to_number(:1),:2,:3,:4,:5,:6,
to_date(:7,'mm/dd/yyyy hh24:mi'),:8,
to_date(:9,'mm/dd/yyyy hh24:mi'),:10,:11)"
为了便于阅读,我在这些代码片段中添加了换行符,但不要将它们包含在您的代码中。
推荐阅读
- mysql - Mysql UNION ALL 创建双记录
- javascript - V8 如何优化超大数组的创建?
- xamarin.forms - Xamarin Forms Appcenter如何获取安装ID
- javascript - 在 foreach 循环中动态创建 javascript 对象
- sql - 有什么用?在选择不同的查询中
- javascript - 如何在javascript中从字符串转换为数组?
- linux - 如何从文件中提取多行扩展的电子邮件标题
- php - 删除一篇帖子时,删除所有相关帖子
- c - 为什么代码不能使用 Sublime TextEditor 创建的 test.in 文件运行
- c++ - 我正在制作一个自动点击器,我需要将其自定义为仅在按住左键时单击