• 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 ;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    (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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    (3)执行结果
    IndtrWpKsCVTHCMM-ENKXBCBISWGYNBMF
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3

    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 ;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    (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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    (3)执行结果
    第一种调用方式:
    第二种调用方式:
    ('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
    ('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
    ('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
    ('IndtrWpKsCVTHCMM', 'ENKXBCBISWGYNBMF')
    ('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
    ('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
    ('zaahBixxiDXGZtCK', 'ELKJAKCTVEZIKMWA')
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    FFmpeg 命令:从入门到精通 | ffmpeg 命令裁剪与合并视频
    3.1依赖注入
    CSRF漏洞利用与防御
    【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)
    Vue|单文件组件与脚手架安装
    iometer - 性能压力测试工具
    计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例
    随机过程理论知识(七)
    VTK:2D直方图的用法与编程实例
    docker系列(6) - docker数据卷
  • 原文地址:https://blog.csdn.net/qq_39065491/article/details/128021937