使用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
相关产品推荐
相关产品推荐

