Oracle中定义package以及存储过程的使用

使用scott账户下的dept表;

select * from dept order by deptno;

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

为了演示方便,插入一条数据:

insert into dept(deptno, dname, loc) values(50,‘SYSTEM‘, ‘NEW YORK‘);

新插入的记录为:50 SYSTEM NEW YORK

 

我们主要演示在package中存储过程的返回类型为pipelined,cursor 和 value三种。

1.返回类型为pipelined。  

create or REPLACE type dept_obj is OBJECT( DEPTNO NUMBER(2,0), DNAME VARCHAR2(14 BYTE) );

create or REPLACE type dept_obj_type AS table of dept_obj;

2.定义package 和package body。

 1 create or replace package SPTest
 2 is
 3 /*return a pipelined demo start*/
 4 type dept_data_rec_type is RECORD(
 5   DEPTNO NUMBER(2,0),
 6      DNAME VARCHAR2(14)
 7 );
 8 
 9 type dept_ref_type is REF CURSOR;
10 
11 function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined;
12 /*return a pipelined demo end*/
13 
14 /*return a cursor demo start*/
15 FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type;
16 /*return a cursor demo end*/
17 
18 /* return a varchar value start */
19 function getName(in_deptno in number) RETURN VARCHAR2;
20 /* return a varchar value end */
21 end SPTest;
22 /
23 -----------------------------------------------------------------------------------------------
24 create or replace package body SPTest
25 is
26   /*return a pipelined demo start*/
27   function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined is
28     l_dept_obj dept_obj :=dept_obj(null, null);
29     dept_ref_type_cursor dept_ref_type;
30     dept_data_rec        dept_data_rec_type;
31   begin
32     open dept_ref_type_cursor
33     for select deptno, dname from dept where loc = in_loc;
34    
35     loop
36     fetch dept_ref_type_cursor into dept_data_rec;
37     exit when dept_ref_type_cursor%NOTFOUND;
38     l_dept_obj.DEPTNO := dept_data_rec.DEPTNO;
39     l_dept_obj.DNAME := dept_data_rec.DNAME;
40    
41     pipe row(l_dept_obj);
42     end loop;
43     close dept_ref_type_cursor;
44     RETURN ;
45   end getDept;
46   /*return a pipelined demo end*/
47   
48   /*return a cursor demo start*/
49   FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type
50   AS
51           dept_ref_type_cursor dept_ref_type;        
52      BEGIN
53     
54      OPEN dept_ref_type_cursor FOR
55           SELECT deptno, dname, loc FROM dept where deptno = in_deptno;
56     
57      RETURN dept_ref_type_cursor;
58     
59      END getDeptInfo;
60   /*return a cursor demo end*/
61   
62   /* return a varchar value start */
63   function getName(in_deptno in number) RETURN VARCHAR2
64   as rtn_deptname VARCHAR2(100);
65   begin
66     select dname into rtn_deptname from dept where deptno = in_deptno;
67     RETURN rtn_deptname;
68   end getName;
69   /* return a varchar value start */
70   
71 end SPTest;
72 /

最后,执行存储过程。

/*返回pipelined table */

select deptno, dname from table(SPTest.getDept(‘NEW YORK‘)) order by deptno;

/*返回cursor*/

select SPTest.getDeptInfo(10) from dual;

/*返回具体值*/

 

select SPTest.getName(50) from dual;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。