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

