python - ORA-01722 : invalid number - Python with cx_Oracle

标签 python python-3.x oracle cx-oracle bind-variables

我将以下脚本插入到 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()

最佳答案

该错误不是由于日期造成的。您使用 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 )应该正常工作。

关于python - ORA-01722 : invalid number - Python with cx_Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52259473/

相关文章:

database - Oracle 查询优化器的诊断输出

python - Keras 似乎在调用 fit_generator 后挂起

python - 如何在python上捕获ffmpeg连接错误

python - 如何制作编码语言?

python-3.x - 从 Cloud Functions 中的父目录或同级目录导入模块?

java - 使用 Oracle SQL Developer 调用存储过程

Python 3 mySQL.connector 卡住导入库

python-3.x - 使用 Python 与句子形式的数据关联规则

forms - 使用flask wtform DateTimeField 的无效日期时间格式的自定义错误消息

oracle - PL/SQL : Selecting from a table into an assoc array