Python调用oracle存储过程返回游标结果

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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值