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

使用cx_Oracle调用Oracle存储过程up_sia_concilia_sia_sgc报错求助

解决cx_Oracle调用Oracle存储过程时的ORA-06550与PLS-00306错误

错误原因

核心问题是最后一个参数类型不匹配:存储过程中cs_retorno是自定义包类型pc_sia_package.empcurtyp(属于REF CURSOR类型),但你在Python中用cx_Oracle.STRING定义输出变量,完全不符合存储过程的参数要求,导致类型不匹配报错。

解决方案

1. 正确定义游标类型的输出变量

对于Oracle包中的REF CURSOR类型参数,必须使用cx_Oracle.CURSOR创建对应变量,不能用字符串或其他基础类型替代。

2. 修正后的Python代码

# 定义游标类型的输出变量
out_cursor = oracle_cursor.var(cx_Oracle.CURSOR)

# 调用存储过程
oracle_cursor.callproc("up_sia_concilia_sia_sgc", [
    "123", "123", "99", "9999", 
    date.today(), date.today(), 
    "123", 1, 123, "T", 
    out_cursor
])

# 获取游标并读取返回数据
result_cursor = out_cursor.getvalue()
for row in result_cursor:
    print(row)
result_cursor.close()

3. 额外参数匹配验证

确认其他参数的类型兼容性:

  • 所有char类型参数:Python传入字符串即可,Oracle会自动适配固定长度的char类型。
  • date类型参数:date.today()生成的datetime对象可直接传入,cx_Oracle会自动转换为Oracle DATE类型。
  • integer/number类型参数:Python的int类型可直接匹配,无需额外转换。

关键说明

Oracle的自定义REF CURSOR类型在cx_Oracle中统一用cx_Oracle.CURSOR映射,调用完成后需通过getvalue()获取游标对象,遍历读取结果后记得关闭游标释放资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:05:19