ORA-01722: 无效数字 - Python 和 cx_Oracle
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()
您需要将 data
数组中的值与 table TESTDB
的投影进行比较。确保字典条目的数据类型与其目标列的数据类型相匹配。
但是,我猜测分配给 'NULL'
的一列或多列是数字的,而发生的事情是您的代码插入了一个 字符串 'NULL'
而不是空值。尝试用空字符串或 Pythonic None
替换 'NULL'
赋值,看看是否能解决问题。
错误不是由于 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 )中的插入语句应该可以正常工作。
我将以下脚本插入到 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()
您需要将 data
数组中的值与 table TESTDB
的投影进行比较。确保字典条目的数据类型与其目标列的数据类型相匹配。
但是,我猜测分配给 'NULL'
的一列或多列是数字的,而发生的事情是您的代码插入了一个 字符串 'NULL'
而不是空值。尝试用空字符串或 Pythonic None
替换 'NULL'
赋值,看看是否能解决问题。
错误不是由于 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 )中的插入语句应该可以正常工作。