首页 > 解决方案 > 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)                                                                                                                                                                                                        

标签: pythonoraclecx-oracle

解决方案


您的数据类型不匹配 - 在 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)"

为了便于阅读,我在这些代码片段中添加了换行符,但不要将它们包含在您的代码中。


推荐阅读