Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338880
  • 博文数量: 94
  • 博客积分: 1500
  • 博客等级: 上尉
  • 技术积分: 1020
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-11 09:23
文章分类
文章存档

2011年(76)

2010年(18)

分类: Oracle

2011-02-15 14:02:04

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. 过程已创建。  

 

调用存储过程:

declare

 p_outstr VARCHAR2(10);
 p_outint NUMBER;
 p_ref1 REFCURSOR;

 Result_  number;


 begin

sp_test(p_outstr,p_outint,p_ref1);   

loop

fetch p_ref1 into result_;

exit when p_ref1%notfound

dbms_output.put_line(result_);

end loop;

close p_ref1;
 
end;

 

利用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;  

 

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  

 也可以在声明输入输出变量之后,依次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行。  

 

 

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行。  
阅读(5531) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-06 17:42:10

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com