Python将DataFrame数据插入Oracle数据库报ORA-01036错误如何解决
ORA-01036报错解决方法
核心错误原因
- 插入语句的列名错误使用单引号包裹:Oracle中单引号用于标记字符串常量,包裹列名会导致Oracle将其识别为普通字符串而非表字段,引发变量匹配错误。
- 绑定变量序号不匹配:Oracle位置绑定变量从
1开始计数,你传入的单条插入参数只有3个值,对应序号应为:1/:2/:3,语句中写的:2/:3/:4无法匹配到对应参数,直接触发ORA-01036报错。 - 遍历插入逻辑冗余:自行维护索引遍历的写法容易出现索引错位问题,也没有利用数据库驱动的批量插入能力,执行效率极低。
修复代码
基础兼容版
适配你现有逻辑的最小修改方案:
# 去掉列名的单引号,修正绑定变量序号 sql_insert_temp = "INSERT INTO TEMPO(GIORNO, MESE, ANNO) VALUES(:1, :2, :3)" # 直接遍历数据列表,无需额外维护索引变量 for row in df_list: cursor.execute(sql_insert_temp, row) connection.commit()
高效批量插入版
推荐使用executemany实现批量插入,比逐行插入性能高10~100倍,无需自行遍历:
sql_insert_temp = "INSERT INTO TEMPO(GIORNO, MESE, ANNO) VALUES(:1, :2, :3)" # 一次性传入全部待插入列表 cursor.executemany(sql_insert_temp, df_list) connection.commit()
如果你DataFrame的字段顺序和表字段顺序不匹配,可以使用命名绑定变量避免顺序错位问题,示例如下:
sql_insert_temp = "INSERT INTO TEMPO(GIORNO, MESE, ANNO) VALUES(:giorno, :mese, :anno)" # 将DataFrame转为字典列表,字段名和绑定变量名一一对应即可 data_dict = df.rename(columns={ "你的DataFrame日字段名": "giorno", "你的DataFrame月字段名": "mese", "你的DataFrame年字段名": "anno" }).to_dict("records") cursor.executemany(sql_insert_temp, data_dict) connection.commit()
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

