oracle 基礎溫習8 包

starive發表於2014-02-08

包的介紹:

      一 包的組成:

    • 包頭(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章