首页 > 解决方案 > 用于 callproc 的 Python cx_Oracle 输入/输出变量

问题描述

我有一个应该返回一大块 json 的 oracle 程序。

该过程有4个参数

input 是一个 ID 值 output json CLOB 以 json 格式输出一些消息 CLOB 输出如果成功或失败 varchar2

所以在我的代码中我做了以下只是为了测试我是否可以成功调用并返回它

ConnectionString = 'someconnection.connection'
con = cx_Oracle.connect(ConnectionString)
cur = con.cursor()

ID = '51858645'
json_out = cur.var(cx_Oracle.CLOB)
message = cur.var(cx_Oracle.CLOB)
status = cur.var(cx_Oracle.STRING)
oracle_return = cur.callproc('project.getsomejson',[ID,json_out,message,status])

但是,它失败并返回

PLS-00306: wrong number or types of arguments in call to 'getsomejson'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

这是过程定义

procedure callOracle(json_in clob,json_out out clob,message out clob,status out varchar2)

这是调用一个 oracle 12c db 我真的不熟悉 python 中的调用过程。通常我用存储的类型调用func并得到一个返回

标签: pythonpython-2.7procedurecx-oracle

解决方案


该程序正在等待

CLOB、CLOB、CLOB、VARCHAR2

但你正在路过

VARCHAR2、CLOB、CLOB、VARCHAR2

您提供的名称 (callOracle) 也与您在 Python (project.getsomejson) 中调用的名称不匹配。也许验证你有正确的程序签名?但是,假设它是正确的,您需要将第一个也更改为 CLOB,或者将存储过程更改为接受 VARCHAR2。这样的事情应该这样做:

json_in = conn.createlob(cx_Oracle.DB_TYPE_CLOB)
json_in.write("51858645")
json_out_var = cur.var(cx_Oracle.DB_TYPE_CLOB)
message_var = cur.var(cx_Oracle.DB_TYPE_CLOB)
status_var = cur.var(str)
cur.callproc(json_in, json_out, message, status)

推荐阅读