Python3连接Oracle数据库进行批量插入数据时报错如何解决?

如题:
报了这个错误:TypeError: expecting integer

但是单条插入没问题
Python3连接Oracle数据库进行批量插入数据时报错如何解决?

3 回复

遇到批量插入报错,先看具体错误信息。最常见的是cx_Oracle.DatabaseError: DPI-1043: invalid number这类,通常是数据类型不匹配。

给你个完整示例,重点在cursor.executemany()的正确用法:

import cx_Oracle
import pandas as pd

# 1. 连接数据库
dsn = cx_Oracle.makedsn('host', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn)
cursor = conn.cursor()

# 2. 准备数据 - 确保数据类型匹配
data = [
    (1, 'John', 25.5),      # 注意数字类型
    (2, 'Jane', 30.0),
    (3, 'Bob', '35.5')      # 字符串会被Oracle隐式转换,但可能报错
]

# 3. 正确的批量插入
sql = "INSERT INTO your_table (id, name, value) VALUES (:1, :2, :3)"
try:
    cursor.executemany(sql, data)
    conn.commit()
    print(f"插入了 {cursor.rowcount} 行数据")
except cx_Oracle.DatabaseError as e:
    error, = e.args
    print(f"Oracle错误: {error.code} - {error.message}")
    conn.rollback()
finally:
    cursor.close()
    conn.close()

关键点:

  1. 数据类型一致:确保Python数据与Oracle表字段类型匹配,特别是数字和日期
  2. 绑定变量:使用:1, :2, :3占位符而不是字符串格式化
  3. 异常处理:捕获cx_Oracle.DatabaseError查看具体错误
  4. 提交回滚:成功时commit,失败时rollback

如果还报错,在executemany()前加这行调试:

cursor.execute("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. '")

先检查数据类型是否匹配。


附上代码:
def insertOracleTable(self,table_name,datas=[]):
self.conndb()
#insert_sql=“insert into “+table_name+” values(:1,:2,:3,:4,:5,:6,:7)”
print(insert_sql)
print(datas)
self.cursor.prepare(insert_sql)
self.cursor.executemany(None,datas)
self.commitdb()
self.closedb()

附上数据:
[(‘数仓 1 节点’, ‘DW_TBL’, 1214, 1136.97, 77.03, 93.65, datetime.datetime(2018, 5, 31, 10, 26, 42)), (‘数仓 2 节点’, ‘TBS_DW_ODS_DAT’, 154, 139.88, 14.12, 90.83, datetime.datetime(2018, 5, 31, 10, 26, 42))]

回到顶部