ITPub博客

首页 > 数据库 > Oracle > oracle 基础温习8 包

oracle 基础温习8 包

原创 Oracle 作者:starive 时间:2014-02-08 19:03:27 0 删除 编辑

包的介绍:

      一 包的组成:

    • 包头(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表的定义:

  1. CREATE TABLE Student
  2.        (Sno CHAR(9) PRIMARY KEY,
  3.         Sname CHAR(20) NOT NULL,
  4.         Ssex CHAR(4),
  5.         Sage SMALLINT,
  6.         Sdept CHAR(20)) tablespace starivespace;


  7. CREATE TABLE SC
  8.          (Sno CHAR(9) NOT NULL,
  9.           Cno CHAR(6) NOT NULL,
  10.           Grade SMALLINT,
  11.           PRIMARY KEY (Sno,Cno),
  12.           constraint f1 FOREIGN KEY (Sno) REFERENCES Student(Sno),
  13.           FOREIGN KEY (Cno) REFERENCES Course(Cno)
  14.       ) tablespace starivespace

定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。
  下面开始定义包头:

  1. create or replace
      package sdept_or_grade as
       procedure print_sdept(psno char);
       procedure print_grade(psno char);
       end;
       /


  2. 程序包已创建。


创建程序包体:
  1. create or replace
  2. package body sdept_or_grade
  3. as
  4. procedure print_sdept(psno char) as
  5.     psdept student.sdept%type;
  6. begin
  7.      select sdept into psdept
  8.     from student
  9.     where sno=psno;
  10.     dbms_output.put_line(psdept);
  11.     exception
  12.     when no_data_found then
  13.         dbms_output.put_line(\'Invalid student number\');
  14. end;
  15. procedure print_grade(psno char) as
  16.     pgrade SC.grade%type;
  17. cursor printgrade is select grade into pgrade
  18.     from sc
  19.     where sno=psno;

  20. begin
  21.     open printgrade;
  22.    loop
  23.     fetch printgrade into pgrade;
  24.         dbms_output.put_line(pgrade);
  25. exit when printgrade%notfound;
  26. end loop;
  27. close printgrade;
  28. exception
  29.     when no_data_found then
  30.         dbms_output.put_line(\'Invalid student number\');
  31. end;
  32. end;
  33. /



程序包体已创建。



现在,执行这2个过程的时候,我们就会获取结果:

  1. SQL> set serveroutput on;
  2. SQL>
  3. SQL> execute sdept_or_grade.print_sdept(\'0201\');
  4. cs

  5. PL/SQL 过程已成功完成。

  6. SQL>
  7. SQL> execute sdept_or_grade.print_grade(\'0201\');
  8. 89
  9. 64
  10. 50
  11. 50

  12. PL/SQL 过程已成功完成。




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26435490/viewspace-1078206/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-01-18

  • 博文量
    143
  • 访问量
    492013