包的介绍:
一 包的组成:
-
- 包头(package):包头部分申明包内数据类型,常量,变量,游标,子程序和异常错误处理,这些元素为包的公有元素。
- 包主体(package body):包主体则是包定义部分的具体实现,它负责为包头中所声明子程序提供具体的实现,在包主体中还可以声明包的私有元素。
- 包头和包主体分开编译,并作为两个分开的对象分别存放在数据库字典中。
二 包的语法规则
包头的语法如下:
create or replace package 包名
As | IS
procedure 过程名();
Function 函数名() return 数据类型;
变量定义;
异常定义;
光标定义;
...........
...........
End 包名;
创建包体的语法:
create or replace Package Body 包名
As | IS
Procedure 过程定义;
Procedure 过程定义;
Function 函数定义;
Function 函数定义;
.........;
end 包名;
下面是student和SC表的定义:
定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。
下面开始定义包头:
创建程序包体:
程序包体已创建。
现在,执行这2个过程的时候,我们就会获取结果:
As | IS
procedure 过程名();
Function 函数名() return 数据类型;
变量定义;
异常定义;
光标定义;
...........
...........
End 包名;
创建包体的语法:
create or replace Package Body 包名
As | IS
Procedure 过程定义;
Procedure 过程定义;
Function 函数定义;
Function 函数定义;
.........;
end 包名;
下面是student和SC表的定义:
- CREATE TABLE Student
- (Sno CHAR(9) PRIMARY KEY,
- Sname CHAR(20) NOT NULL,
- Ssex CHAR(4),
- Sage SMALLINT,
- Sdept CHAR(20)) tablespace starivespace;
-
-
- CREATE TABLE SC
- (Sno CHAR(9) NOT NULL,
- Cno CHAR(6) NOT NULL,
- Grade SMALLINT,
- PRIMARY KEY (Sno,Cno),
- constraint f1 FOREIGN KEY (Sno) REFERENCES Student(Sno),
- FOREIGN KEY (Cno) REFERENCES Course(Cno)
- ) tablespace starivespace
定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。
下面开始定义包头:
- create or replace
package sdept_or_grade as
procedure print_sdept(psno char);
procedure print_grade(psno char);
end;
/
-
-
- 程序包已创建。
创建程序包体:
- create or replace
- package body sdept_or_grade
- as
- procedure print_sdept(psno char) as
- psdept student.sdept%type;
- begin
- select sdept into psdept
- from student
- where sno=psno;
- dbms_output.put_line(psdept);
- exception
- when no_data_found then
- dbms_output.put_line(\'Invalid student number\');
- end;
- procedure print_grade(psno char) as
- pgrade SC.grade%type;
- cursor printgrade is select grade into pgrade
- from sc
- where sno=psno;
-
- begin
- open printgrade;
- loop
- fetch printgrade into pgrade;
- dbms_output.put_line(pgrade);
- exit when printgrade%notfound;
- end loop;
- close printgrade;
- exception
- when no_data_found then
- dbms_output.put_line(\'Invalid student number\');
- end;
- end;
- /
程序包体已创建。
现在,执行这2个过程的时候,我们就会获取结果:
- SQL> set serveroutput on;
- SQL>
- SQL> execute sdept_or_grade.print_sdept(\'0201\');
- cs
-
- PL/SQL 过程已成功完成。
-
- SQL>
- SQL> execute sdept_or_grade.print_grade(\'0201\');
- 89
- 64
- 50
- 50
-
- PL/SQL 过程已成功完成。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26435490/viewspace-1078206/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26435490/viewspace-1078206/