繁体   English   中英

ORA-01722:无效的数字-具有cx_Oracle的Python

[英]ORA-01722: invalid number - Python with cx_Oracle

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

我以为它是原始的日期时间值,所以我尝试了TO_DATE(TO_CHAR(:9, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24: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()

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

问题是由于NUMBER列引起的,例如: TESTDB_ID而您试图在其中插入字符串“ NULL”。 请注意,默认情况下python不会将带引号的字符串“ NULL”转换为Oracle NULL。 为此,您应该使用Python None类型。

因此,您的数据应该是

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

并且包含在sql变量(带有to_date)中的插入语句应该可以正常工作。

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

但是,我将猜测分配给'NULL'一个或多个列是数字,并且发生的是您的代码正在插入'NULL'而不是null值的字符串 尝试用空字符串或Pythonic None替换'NULL'赋值,看看是否能解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM