简体   繁体   中英

Python cx_Oracle in/out variables for callproc

I have an oracle procedure that is supposed to return a chunk of json.

The procedure has 4 paramaters

input is an ID value output json CLOB output some message in json format CLOB output if success or failure varchar2

so in my code I have done the following just to test if I can successfully call and return it

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])

However, it fails and returns

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

This is the procedure definition

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

This is calling an oracle 12c db I'm really not familiar at all with calling procedures in python. Typically I callfunc with the stored type and just get a return

The procedure is expecting

CLOB, CLOB, CLOB, VARCHAR2

but you are passing

VARCHAR2, CLOB, CLOB, VARCHAR2

The name you gave (callOracle) also doesn't match what you are calling in Python (project.getsomejson). Perhaps verify that you have the right procedure signature? Assuming it is correct, though, you'll need to change the first one to be a CLOB as well or change the stored procedure to accept VARCHAR2. Something like this should do it:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM