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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:45:01