Jam*_*ama 6 python oracle cx-oracle cursor
我试图在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;
Run Code Online (Sandbox Code Playgroud)
调用数据库的python代码是:
import cx_Oracle
from datetime import date
connstr='user/pass@127.0.0.1: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))
Run Code Online (Sandbox Code Playgroud)
错误是:
curs.callproc('sp_procedure', (cid, rep_date, curs))
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
Run Code Online (Sandbox Code Playgroud)
我也试过传递一个字典作为keywordsParameters:
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)
Run Code Online (Sandbox Code Playgroud)
返回相同的错误.
谢谢.
Jam*_*ama 11
经过几个小时的谷歌搜索和追踪/错误,这是解决方案:
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
Run Code Online (Sandbox Code Playgroud)
尝试这个:
curs = con.cursor()
out_curs = con.cursor()
curs.execute("""
BEGIN
sp_procedure(:cid, :rep_date, :cur);
END;""", cid=cid, rep_date=rep_date, ret=outcurs)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7404 次 |
最近记录: |