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
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐