You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:24:03