ORA-01722:无效数字-带cx_Oracle的Python

ORA-01722:无效数字-带cx_Oracle的Python,python,python-3.x,oracle,cx-oracle,bind-variables,Python,Python 3.x,Oracle,Cx Oracle,Bind Variables,我将下面的脚本插入到Oracle数据库中。如果我手动将所有传入的值放入INSERT语句并在Python中运行硬编码语句,则INSERT可以工作,但由于某种原因,当我使用下面的方法时,它总是失败,出现ORA-01722:invalid number 我认为这是原始的日期时间值,所以我尝试了到日期(到字符(:9,'YYYY-MM-DD HH24:MI:SS'),'yyy-MM-DD h24:MI:SS'),但没有任何区别 花了很多时间尝试来自SO和互联网的不同建议,但到目前为止运气不佳 data =

我将下面的脚本插入到Oracle数据库中。如果我手动将所有传入的值放入INSERT语句并在Python中运行硬编码语句,则INSERT可以工作,但由于某种原因,当我使用下面的方法时,它总是失败,出现
ORA-01722:invalid number

我认为这是原始的日期时间值,所以我尝试了
到日期(到字符(:9,'YYYY-MM-DD HH24:MI:SS'),'yyy-MM-DD h24:MI:SS')
,但没有任何区别

花了很多时间尝试来自SO和互联网的不同建议,但到目前为止运气不佳

data = ['NULL', 'NULL', 'NULL', 'NULL', '2', 'Test Text', 'NULL', 'NULL', '2017-06-02 16:00:00', '20180910122315440220.csv']

conn = cx_Oracle.connect(env.DB_USER, env.DB_PASSWORD,cx_Oracle.makedsn(env.DB_HOST, env.DB_PORT, env.DB_NAME));

# Disable auto commit.
conn.autocommit = False

cursor = conn.cursor()

sql = """INSERT INTO TESTDB (TESTDB_ID, TESTDB_ACYR_CODE, TESTDB_SEM_CODE, TESTDB_MODULEID, TESTDB_STU_PIDM, TESTDB_COMPONENT_ID, TESTDB_COMPONENT_NAME, TESTDB_GRADE_MARK, TESTDB_GRADER_PIDM, TESTDB_GRADE_MODIFIED_DATE, TESTDB_CREATION_DATE, TESTDB_FILENAME, TESTDB_ACTIVITY_DATE, TESTDB_USER_ID) VALUES(TESTDB_SEQ.NEXTVAL, :1, :2, :3, :4, :5, :6, :7, :8, TO_DATE(:9, 'YYYY-MM-DD HH24:MI:SS'), SYSDATE, :10, SYSDATE, USER)"""

cursor.prepare(sql)

cursor.execute(sql, data)

conn.commit()

cursor.close()

# Enable auto commit.
conn.autocommit = True
conn.close()

您需要将
数据
数组中的值与表的投影进行比较
TESTDB
。确保字典条目的数据类型与其目标列的数据类型匹配


但是,我猜分配给
'NULL'
的一个或多个列是数字,发生的情况是代码插入了
'NULL'
字符串,而不是空值。尝试用空字符串或Pythonic
None
替换
'NULL'
赋值,看看这是否解决了问题。

错误不是由于
日期造成的。您使用
TO_DATE
将其转换为DATE,这应该可以正常工作

问题是由于列数太多,例如:
TESTDB\u ID
,您试图在其中插入字符串“NULL”。请注意,python默认情况下不会将带引号的字符串“NULL”转换为Oracle NULL。为此,应该使用Python
None
type

因此,您的数据应该是

data = [None, None, None, None, '2', 'Test Text', None, None, '2017-06-02 16:00:00', '20180910122315440220.csv']
sql
变量(带有tou-date)中包含的insert语句应该可以正常工作