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

使用Python+cx_Oracle调用存储过程时遇ORA-01830错误求助

解决Python调用cx_Oracle存储过程时的ORA-01830错误

错误原因

ORA-01830是Oracle日期转换的典型错误,核心问题是日期字符串格式与指定的格式掩码不匹配。你的代码中:

  • formatted_date是YYYY-MM-DD格式的字符串(比如2024-05-20)
  • 但存储过程调用时用了TO_DATE(:1, 'YYYY-MM-DD HH:MI'),格式掩码要求输入包含时分的完整日期字符串,两者不匹配导致转换失败。

解决方案

方案1:调整格式掩码匹配输入字符串

既然你的输入只有年月日,直接修改TO_DATE的格式掩码即可:

formatted_date = fecha.strftime('%Y-%m-%d')
sql_query = "BEGIN PK_NAME(TO_DATE(:1, 'YYYY-MM-DD')); END;"
cursor.execute(sql_query, [formatted_date])

方案2:直接传入Python日期对象(推荐)

cx_Oracle支持直接绑定Python的datetime对象,无需手动做字符串转日期的操作,既高效又能彻底避免格式错误:

# 取消formatted_date的转换步骤,直接传fecha对象
sql_query = "BEGIN PK_NAME(:1); END;"
cursor.execute(sql_query, [fecha])

代码优化建议

循环内重复创建游标会浪费资源,建议将游标初始化移到循环外,并在结束后关闭:

splited_date = (fecha.year, fecha.month, fecha.day)
print("flag {}{:02d}{:02d}".format(*splited_date))
cursor = conn.cursor()  # 游标初始化移到循环外
while flag == 1:
    print(fecha.strftime('%Y-%m-%d'))
    try:
        print('Filling...')
        sql_query = "BEGIN PK_NAME(:1); END;"
        cursor.execute(sql_query, [fecha])
        print("table_proc")
        flag = 2
    except Exception as error:
        print(error)
        flag = 1
cursor.close()  # 结束后关闭游标
print("Filling finished.")

内容的提问来源于stack exchange,提问作者Johhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:46:00