`

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

分享到:
评论
发表评论

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

相关推荐

Global site tag (gtag.js) - Google Analytics