oracle 基础温习8 包

包的介绍:

      一 包的组成:

    • 包头(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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26435490/viewspace-1078206/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值