Python调用oracle存储过程返回游标结果
Python调用oracle存储过程,调用参数使用,返回参数使用,包括返回参数是游标的情况。
下面分别介绍和测试。
1、基本数据表
– Create table
create table TEST_ID
(
order_id VARCHAR2(20),
contract_id VARCHAR2(20)
);
2、返回字符串参数
(1)存储过程
说明:返回参数是将两个调用参数合并后返回。
create or replace procedure pro_test_insert (v_order_id varchar2, v_contract_id varchar2,v_id out varchar2 ) is
sql_text varchar2(200);
begin
sql_text:='insert into test_id (order_id,contract_id) values (:1,:2)' ;
execute immediate sql_text using v_order_id,v_contract_id;
commit;
v_id := (v_order_id || '-' || v_contract_id) ;
end ;
/
(2)Python调用
import cx_Oracle
def call_procedure_return():
db = cx_Oracle.connect('scott', 'Tiger', '192.168.123.123:1521/backup')
cursor_query = db.cursor()
out_string = cursor_query.var(cx_Oracle.STRING) # 定义出参类型,返回字符串
cursor_query.callproc('PRO_TEST_INSERT',['IndtrWpKsCVTHCMM','ENKXBCBISWGYNBMF',out_string])
print(out_string.getvalue())
cursor_query.close()
db.close()
if __name__ == "__main__":
call_procedure_return()
(3)执行结果
IndtrWpKsCVTHCMM-ENKXBCBISWGYNBMF
Process finished with exit code 0
2、返回游标参数
(1)存储过程
重点说明:sys_refcursor 返回参数的数据类型
在上一个的存储过程中略作修改。
create or replace procedure pro_test_return_cursor (v_order_id varchar2, v_contract_id varchar2,v_cursor out sys_refcursor ) is
sql_text varchar2(200);
begin
sql_text:='insert into test_id (order_id,contract_id) values (:1,:2)' ;
execute immediate sql_text using v_order_id,v_contract_id;
commit;
-- 使用open将结果存入游标返回出去
sql_text := 'select * from test_id';
open v_cursor for sql_text;
end ;
/
(2)Python调用
重点说明:
callproc函数第一个参数是存储过程名称,第二个参数是列表,包括调用参数和返回参数。
第一种调用方式:调用列表中第三个是返回参数,从0开始,因此数字是2
两种调用方式不能同时使用。
import cx_Oracle
def call_procedure_return_cursor():
db = cx_Oracle.connect('scott', 'Tiger', '192.168.123.123:1521/backup')
cursor_query = db.cursor()
out_cursor = cursor_query.var(cx_Oracle.CURSOR) # 定义出参类型,返回结果是游标
data = cursor_query.callproc('pro_test_return_cursor',['zaahBixxiDXGZtCK','ELKJAKCTVEZIKMWA',out_cursor])
print('第一种调用方式:')
# 第一种调用方式:调用列表中第三个是返回参数,从0开始,因此数字是2
'''
v_cursor = data[2]
for c in v_cursor :
print(c)
'''
print('第二种调用方式:')
# 第二种调用方式:可以不用data赋值,直接从返回参数变量取值
v_cursor = out_cursor.getvalue()
for c in v_cursor :
print(c)
cursor_query.close()
db.close()
if __name__ == "__main__":
call_procedure_return_cursor()
(3)执行结果
第一种调用方式:
第二种调用方式:
('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
Process finished with exit code 0