我正在尝试在python和oracle db之间调用存储过程。我遇到的问题是传递游标超出参数。

Oracle存储过程本质上是:

create or replace procedure sp_procedure(
    cid int,
    rep_date date,
    ret out sys_refcursor
) is
begin

  open ret for
  select
 ...
  end;

调用数据库的python代码是:
import cx_Oracle
from datetime import date

connstr='user/[email protected]:2521/XE'
conn = cx_Oracle.connect(connstr)
curs = conn.cursor()

cid = 1
rep_date = date(2011,06,30)

curs.callproc('sp_procedure', (cid, rep_date, curs))

错误是:
curs.callproc('sp_procedure', (cid, rep_date, curs))
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

我也尝试过将字典作为keywordParameters传递:
cid = 1
rep_date = date(2011,06,30)

call_params = {'cid': cid, 'rep_date': rep_date, 'ret': curs}
curs.callproc('sp_procedure', (cid, rep_date, curs), call_params)

返回相同的错误。

谢谢。

最佳答案

经过几个小时的谷歌搜索和跟踪/错误后,以下是解决方法:

cid = 1
rep_date = date(2011,06,30)

l_cur = curs.var(cx_Oracle.CURSOR)
l_query = curs.callproc('sp_procedure', (cid,rep_date,l_cur))

l_results = l_query[2]

for row in l_results:
    print row

# Column Specs
for row in l_results.description:
    print row

10-02 00:40