`

SYS_REFCURSOR一例

阅读更多

1.看见很多人调试过程依然使用DBMS_OUTPUT.PUT_LINE进行着输出,或是对oracle procedure返回resultset比较疑惑,下面的例子仅供参考。

 

Sql代码 复制代码
  1. CREATE OR REPLACE PROCEDURE sp_test (   
  2.        p_outstr  OUT VARCHAR2   
  3.       ,p_outint  OUT NUMBER   
  4.       ,p_ref1    OUT SYS_REFCURSOR   
  5.       ,p_ref2    OUT SYS_REFCURSOR   
  6.       )   
  7. AS  
  8. BEGIN  
  9.    p_outstr := 'abc';   
  10.    p_outint := '56789';   
  11.    OPEN p_ref1 FOR SELECT ROWNUM*2 AS RN FROM DUAL CONNECT BY ROWNUM<=10;   
  12.    OPEN p_ref2 FOR SELECT ROWNUM*2+1 AS RN FROM DUAL CONNECT BY ROWNUM<=10;   
  13.       
  14. END sp_test;   
  15.   
  16. /   
  17.   
  18. 过程已创建。  
CREATE OR REPLACE PROCEDURE sp_test (
       p_outstr  OUT VARCHAR2
      ,p_outint  OUT NUMBER
      ,p_ref1    OUT SYS_REFCURSOR
      ,p_ref2    OUT SYS_REFCURSOR
      )
AS
BEGIN
   p_outstr := 'abc';
   p_outint := '56789';
   OPEN p_ref1 FOR SELECT ROWNUM*2 AS RN FROM DUAL CONNECT BY ROWNUM<=10;
   OPEN p_ref2 FOR SELECT ROWNUM*2+1 AS RN FROM DUAL CONNECT BY ROWNUM<=10;
   
END sp_test;

/

过程已创建。

 

 

利用print客户端打印,sqlplus下:

Sql代码 复制代码
  1. SET AUTOPRINT ON  
  2. VAR p_outstr VARCHAR2(10);   
  3. VAR p_outint NUMBER;   
  4. VAR p_ref1 REFCURSOR;   
  5. VAR p_ref2 REFCURSOR;  
SET AUTOPRINT ON
VAR p_outstr VARCHAR2(10);
VAR p_outint NUMBER;
VAR p_ref1 REFCURSOR;
VAR p_ref2 REFCURSOR;

 

Sql代码 复制代码
  1. scott@ORCL>EXEC sp_test(:p_outstr,:p_outint,:p_ref1,:p_ref2);   
  2.   
  3. PL/SQL 过程已成功完成。   
  4.   
  5.   
  6.         RN   
  7. ----------   
  8.          3   
  9.          5   
  10.          7   
  11.          9   
  12.         11   
  13.         13   
  14.         15   
  15.         17   
  16.         19   
  17.         21   
  18.         23   
  19.   
  20. 已选择11行。   
  21.   
  22.   
  23.         RN   
  24. ----------   
  25.          2   
  26.          4   
  27.          6   
  28.          8   
  29.         10   
  30.         12   
  31.         14   
  32.         16   
  33.         18   
  34.         20   
  35.         22   
  36.   
  37. 已选择11行。   
  38.   
  39.   
  40.   P_OUTINT   
  41. ----------   
  42.      56789   
  43.   
  44.   
  45. P_OUTSTR   
  46. --------------------------------   
  47. abc  
scott@ORCL>EXEC sp_test(:p_outstr,:p_outint,:p_ref1,:p_ref2);

PL/SQL 过程已成功完成。


        RN
----------
         3
         5
         7
         9
        11
        13
        15
        17
        19
        21
        23

已选择11行。


        RN
----------
         2
         4
         6
         8
        10
        12
        14
        16
        18
        20
        22

已选择11行。


  P_OUTINT
----------
     56789


P_OUTSTR
--------------------------------
abc

 也可以在声明输入输出变量之后,依次print p_outstr,...........

 

2.使用对象类型,同样返回结果集.

Sql代码 复制代码
  1. scott@ORCL> CREATE TYPE t_test AS OBJECT (   
  2.   2                 id    NUMBER   
  3.   3             ,name VARCHAR2(20)   
  4.   4      )   
  5.   5  ;   
  6.   6  /   
  7.   
  8. 类型已创建。   
  9.   
  10. scott@ORCL>CREATE TYPE tb_test AS TABLE OF t_test;   
  11.   2  /   
  12.   
  13. 类型已创建。   
  14.   
  15. scott@ORCL>CREATE OR REPLACE FUNCTION f_test RETURN tb_test   
  16.   2  AS  
  17.   3     v_ret tb_test:=tb_test();   
  18.   4  BEGIN  
  19.   5     FOR i IN 1..10 LOOP   
  20.   6         v_ret.EXTEND;   
  21.   7         v_ret(i) := t_test(i,'name'||i);   
  22.   8     END LOOP;   
  23.   9     RETURN v_ret;   
  24.  10  END f_test;   
  25.  11  /   
  26.   
  27. 函数已创建。   
  28.   
  29. scott@ORCL>select * from table(f_test);   
  30.   
  31.         ID NAME  
  32. ---------- ------------------------------   
  33.          1 name1   
  34.          2 name2   
  35.          3 name3   
  36.          4 name4   
  37.          5 name5   
  38.          6 name6   
  39.          7 name7   
  40.          8 name8   
  41.          9 name9   
  42.         10 name10   
  43.   
  44. 已选择10行。  
scott@ORCL> CREATE TYPE t_test AS OBJECT (
  2         		id    NUMBER
  3      		,name VARCHAR2(20)
  4      )
  5  ;
  6  /

类型已创建。

scott@ORCL>CREATE TYPE tb_test AS TABLE OF t_test;
  2  /

类型已创建。

scott@ORCL>CREATE OR REPLACE FUNCTION f_test RETURN tb_test
  2  AS
  3     v_ret tb_test:=tb_test();
  4  BEGIN
  5     FOR i IN 1..10 LOOP
  6         v_ret.EXTEND;
  7         v_ret(i) := t_test(i,'name'||i);
  8     END LOOP;
  9     RETURN v_ret;
 10  END f_test;
 11  /

函数已创建。

scott@ORCL>select * from table(f_test);

        ID NAME
---------- ------------------------------
         1 name1
         2 name2
         3 name3
         4 name4
         5 name5
         6 name6
         7 name7
         8 name8
         9 name9
        10 name10

已选择10行。

 

 

3. 用SELECT BULK COLLECT INTO取得数据,返回嵌套表的例子。

Sql代码 复制代码
  1. scott@ORCL>create table test (id number, name varchar2(20));   
  2.   
  3. 表已创建。   
  4.   
  5. scott@ORCL>CREATE TYPE t_test AS OBJECT (   
  6.   2       id    NUMBER   
  7.   3      ,name VARCHAR2(20)   
  8.   4      )   
  9.   5  /   
  10.   
  11. 类型已创建。   
  12.   
  13. scott@ORCL>;   
  14. scott@ORCL>CREATE TYPE tb_test AS TABLE OF t_test;   
  15.   2  /   
  16.   
  17. 类型已创建。   
  18.   
  19. scott@ORCL>CREATE OR REPLACE FUNCTION f_test RETURN tb_test   
  20.   2  AS  
  21.   3     v_ret tb_test:=tb_test();   
  22.   4  BEGIN  
  23.   5     SELECT t_test(id,name)   
  24.   6       BULK COLLECT INTO v_ret   
  25.   7       FROM TEST;   
  26.   8   
  27.   9     RETURN v_ret;   
  28.  10  END f_test;   
  29.  11  /   
  30.   
  31. 函数已创建。   
  32.   
  33. scott@ORCL>select * from table(f_test);   
  34.   
  35. 未选定行   
  36.   
  37. scott@ORCL>insert into test select rownum,'NAME'||rownum FROM DUAL CONNECT BY RO   
  38. WNUM<=10;   
  39.   
  40. 已创建11行。   
  41.   
  42. scott@ORCL>select * from table(f_test);   
  43.   
  44.         ID NAME  
  45. ---------- ------------------------------   
  46.          1 NAME1   
  47.          2 NAME2   
  48.          3 NAME3   
  49.          4 NAME4   
  50.          5 NAME5   
  51.          6 NAME6   
  52.          7 NAME7   
  53.          8 NAME8   
  54.          9 NAME9   
  55.         10 NAME10   
  56.         11 NAME11   
  57.   
  58. 已选择11行。  

http://diegoball.iteye.com/blog/518604

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    oracle如何合并多个sys_refcursor详解

    假设你有一个复杂的存储过程`PROC_A`,它执行特定的业务逻辑并返回一个`sys_refcursor`。后来,你需要创建另一个存储过程`PROC_B`,它不仅需要执行与`PROC_A`相同的逻辑,还需要在一个循环中调用`PROC_A`。这时,有...

    Oracle游标的使用

    在提供的示例中,`add_sal`过程首先更新指定部门的员工工资,然后打开一个`sys_refCursor`,从中选择员工的`empno`, `ename`和`sal`字段。在PL/SQL中调用这个过程时,可以使用变量来接收和处理返回的`sys_refCursor`...

    ORACLE中的sys_context函数

    sys_context 函数是 Oracle 提供的一个获取环境上下文信息的预定义函数。该函数用来返回一个指定 namespace 下的 parameter 值。该函数可以在 SQL 和 PL/SQL 语言中使用。 sys_context 函数的基本语法为:`SYS_...

    A40-T3的sys_partition.fex分区表说明

    sys_partition.fex分区表的配置是系统设计和开发过程中的一个关键步骤,需要根据系统的需求和硬件的特性进行仔细的设计和配置,以确保系统的高效运行和稳定性。 sys_partition.fex分区表是A40-T3芯片的分区表配置...

    jeesite 4.x.x 的全国市区地区编码表,一共3511条数据。表名是js_sys_area。mysql。

    表名是js_sys_area。 jeesite 4.x.x 的全国市区地区编码表,一共3511条数据。表名是js_sys_area。 jeesite 4.x.x 的全国市区地区编码表,一共3511条数据。表名是js_sys_area。 jeesite 4.x.x 的全国市区地区编码表,...

    sys_arch1.4.0.rar_lwip 1.4.0 ucos_lwip1.4.0 ucos_sys_arch_sys_ar

    sys_arch是LwIP中的一个关键组件,它负责提供操作系统特定的多任务接口,如互斥锁(mutexes)、信号量(semaphores)以及时间管理等功能。在uCOS这种实时操作系统中,sys_arch的实现需要与uCOS的内核机制紧密集成,...

    adams_sys_template.rar

    标题中的"adams_sys_template.rar"表明这是一个与Adams(Mechanical Advantage Adams)软件相关的压缩文件,用于创建或保存系统模板。Adams是一款先进的多体动力学仿真软件,广泛应用于机械工程领域,用来预测和分析...

    LwIP的sys_arch说明文档下载

    `sys_arch`是LwIP的一个关键组成部分,主要负责为LwIP提供一个通用的操作系统模拟层。通过这个层,LwIP能够与不同类型的硬件和操作系统进行交互,从而实现跨平台的移植性。在`sys_arch`中,主要实现了以下几个方面的...

    V40 sys_config.fex使用配置说明V1.0.pdf

    根据提供的文件信息,以下是对全志V40、全志R40、全志A40 sys_config.fex配置文件的详细知识点说明: 1. sys_config.fex文件结构 sys_config.fex文件是全志芯片平台的配置文件,包含了硬件资源的分配、初始化参数等...

    汉化版sys_log.rar

    【sys_log】是一款系统日志监控工具的汉化版本,主要功能是收集、记录和分析计算机系统的各种操作和事件,以便于系统管理员监控系统运行状态、排查问题和优化性能。这款软件的汉化版是为了方便中国用户使用,将原本...

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    sys_value demo

    在IT行业中,`sys_value`通常指的是一个系统相关的值或者变量,它可能涉及到操作系统底层的配置、状态信息或特定功能的开关。在这个`sys_value demo`中,我们可能正在研究如何在C语言环境下操作和管理这类系统级别的...

    plsql.zip_PLSQL Developer_cursor

    在PL/SQL(Procedural Language/Structured Query Language)中,...通过阅读《PLSQL中显示Cursor、隐示Cursor、动态Ref_Cursor区别(有分支图解).pdf》这份资料,你可以更深入地了解这些概念,并结合实际例子进行学习。

    js_sys_area.rar

    本文将深入探讨"js_sys_area.rar"压缩包中的核心内容——"js_sys_area.sql",这是一个专为Jeesite 4.x框架设计的全国行政区域划分的SQL导入脚本,旨在帮助开发者快速构建支持全国范围的地理位置信息的系统。...

    linux 中的sys_execve机理

    在Linux操作系统中,`sys_execve`是一个系统调用,它是程序执行的核心机制。这个调用使得一个进程能够替换其当前的执行上下文,加载并运行新的可执行文件。通过理解`sys_execve`的工作原理,我们可以更好地了解进程...

    Oracle中的USERENV和SYS_CONTEXT范例

    "Oracle中的USERENV和SYS_CONTEXT范例" Oracle中的USERENV和SYS_CONTEXT是两个非常重要的函数,它们都可以用于获取当前会话的信息,例如当前用户、当前实例、当前语言等。 USERENV函数 USERENV函数用于返回当前...

    sys_area.sql

    select id,name,lat,lng,pinyin from sys_area where 1=1 and `level` = 1; city 市 -- 江西 select id,name,lat,lng,pinyin from sys_area where 1=1 and `level` = 2 and find_in_set('360000',`path`); ...

    Quartus_II_13.1 64位 32位破解器 及sys_cpt文件备份

    Quartus_II_13.1 64位 32位破解器 ,适用QuartusSetup-13.1.0.162,另外内含Crack_QII_13.1_Windows补丁备份文件夹,存放了gcl_afcq.dll、sys_cpt.dll原始文件,方便出错还原

    A20_sys_partition.fexv1.3.zip_A20_partition_sys_partition.fex

    这里我们关注的是针对A20处理器的`sys_partition.fex`文件,它是一个用于定义和管理设备分区的配置文件。这个文件在2014年6月12日更新到了v1.3版本,是系统分区的重要组成部分。本文将深入探讨`sys_partition.fex`的...

Global site tag (gtag.js) - Google Analytics