Python调用Oracle存储过程报ORA-06550、PLS-00306错误如何解决?
错误诱因
- 核心原因是存储过程的第四个参数
P_ERROR_INFO为OUT输出类型,你代码中直接传入普通Python字符串作为参数,cx_Oracle无法将其识别为需要接收返回值的输出参数,参数类型不匹配触发PLS-00306: 调用'ZMIANA_OPISU_LIST_PRZEWOZOWY'时参数个数或类型错误,连带抛出ORA-06550语法报错。
修复方案
cx_Oracle中调用带OUT参数的存储过程时,需要先用cursor.var()声明输出参数的对应Oracle类型,修改后的参考代码如下:
import cx_Oracle con = cx_Oracle.connect('***********') cur = con.cursor() faktura= "QQ0009365/21" numer_listu = "421435636356536" kod_k = int(112377) # 声明OUT参数,指定对应Oracle的字符串类型 out_data = cur.var(cx_Oracle.STRING) # 调用存储过程,参数顺序和存储过程定义保持一致 cur.callproc('QQ.ECOMMERCE.ZMIANA_OPISU_LIST_PRZEWOZOWY',[numer_listu,kod_k,faktura,out_data]) # 如需获取输出参数的返回值,调用getvalue()方法即可 error_info = out_data.getvalue() print(error_info) # 业务处理完成后关闭游标和连接 cur.close() con.close()
补充说明:
- 如果输出参数是其他类型,数字可替换为
cx_Oracle.NUMBER,日期可替换为cx_Oracle.DATETIME,需要和存储过程定义的参数类型严格匹配。 - 如果担心参数顺序写错,也可以用关键字参数的方式调用,写法如下:
cur.callproc('QQ.ECOMMERCE.ZMIANA_OPISU_LIST_PRZEWOZOWY', keywordParameters={ "P_NUMER_LISTU": numer_listu, "P_KOD_KURIERA": kod_k, "P_NUMER_FAKTURY": faktura, "P_ERROR_INFO": out_data })
内容的提问来源于stack exchange,提问作者programmersd
相关产品推荐
相关产品推荐

