1. 程式人生 > >Oracle package包頭和package body包體例子

Oracle package包頭和package body包體例子

本文系轉載,原文地址:http://blog.itpub.net/26435490/viewspace-1078212/

一 包的組成

    • 包頭(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表的定義:
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

例項:定義一個包,實現如果功能: 輸入學號,分別返回該學生的所在系和相應的選課成績(如果有多門成績,那麼就輸出多門成績)。

定義包頭

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


  2. 程式包已建立。

建立包體

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;
/

程式包體已建立。

獲取結果

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 過程已成功完成。

四  心得體會

從以上例子,和以往在實際應用中額經驗,對包的優點總結如下:

第一  包可以簡化應用程式設計:程式包的說明部分和包體部分可以分別建立各編譯。體現在以下三個方面:

1)        在設計一個應用程式,只建立各編譯程式包的說明部分,然後再編寫引用該程式包的PL/SQL塊。

2)        當完成整個應用程式的整體框架後,再回頭來定義包體部分。只要不改變包的說明部分,就可以單獨除錯、增加或替換包體的內容,這不會影響其他的應用程式。

3)        更新包的說明後必須重新編譯引用包的應用程式,但更新包體,則不需重新編譯引用包的應用程式,以快速進行應用程式的原形開發。

第二   模組化:可將邏輯相關的PL/SQL塊或元素等組織在一起,用名稱來唯一標識程式包。把一個大的功能模組劃分人適當個數小的功能模組,分別完成各自的功能。這樣組織的程式包都易於編寫,易於理解更易於管理。

第三     效率高:程式包在應用程式第一次呼叫程式包中的某個元素時,ORACLE將把整個程式包載入到記憶體中,當再次訪問程式包中的元素時,將直接從內在中讀取,而不需要進行磁碟I/O操作而影響速度,同時位於內在中的程式包可被同一會話期間的其它應用程式共享。因此,程式包增加了重用性並改善了多使用者、多應用程式環境的效率。
最後   還有提到一點: 資訊隱藏。因為包中的元素可以分為公有元素和私有元素。公有元素可被程式包內的過程、函式等的訪問,還可以被包外的PL/SQL訪問。但對於私有元素只能被包內的過程、函式等訪問。對於使用者,只需知道包的說明,不用瞭解包休的具體細節(由於時間關係,明天繼續貼出“資訊隱藏”的相關例子)。

補充說明:包頭和包體可以以java的介面來理解,包頭像java的介面,包體像java介面的實現類。

相關推薦

Oracle package包頭package body例子

本文系轉載,原文地址:http://blog.itpub.net/26435490/viewspace-1078212/ 一 包的組成 包頭(package):包頭部分申明包內資料型別,常量,變數,遊標,子程式和異常錯誤處理,這些元素為包的公有元素。 包主體(pa

package.jsonpackage-lock.json的區別

col install ack ins 最新 怎麽 npm 5.1 根據 自npm 5.0版本發布以來,npm istall的規則發生了三次變化: 1.npm 5.0.x版本,不管package.json怎麽變,npm install時都會根據package-lock.js

關於package.jsonpackage-lock.json的區別

5.0以後的node.js,在安裝專案的時候,會產生package-lock.json檔案。這個package-lock.json檔案,與之前的package.json檔案有什麼區別嗎? 答案: package.json檔案記錄你專案中所需要的所有模組。當你執行npm install的時候,

node中package.jsonpackage-lock.json檔案的作用

npm5以前是不會有package-lock.json這個檔案的。可以單獨升級npm而不升級node.js npm5以後才加入了這個檔案 當你安裝包的時候,npm都會生成或者更新package-lock.json這個檔案。 npm5以後的版本安裝包不需要加–save引數,它會自動儲存依賴資訊

nodejs中package.jsonpackage-lock.json檔案的功能分析

最新版nodejs中,多了一個package-lock.json檔案,剛開始對這個檔案很是疑惑,後來查了一番資料後,通過驗證,終於確定了這兩個檔案的關係。 package.json與package-lock.json檔案的作用 package.json檔案記錄你專案中所需

lua中的package.pathpackage.cpath

一. package.path用於搜尋自己寫的庫檔案或者第三方的庫檔案 --搜尋指定路徑下,以 .lua結尾的檔案 package.path = "../t/?.lua;../xjnlib/sr

Oracle物件-包頭返回遊標 多引數值

前言    在編寫儲存過程或儲存函式的過程中,你可能會發現,當需要的返回值過多,就需要更多的變數來接受它。是否可能用一個游標來接受返回值?答案當然是可以的。在Oracle資料庫中,可以定義包頭和包體。包頭相當於宣告,而包體則是邏輯實現。例項包頭宣告如下:CREATE OR R

Oracle

create or replace package PKG_TCAS_DEPOT_CORE_CALC is --計提月份 g_commis_month date; /* *分攤計算任務 */ procedure stp_commi

ORACLE建立中函式儲存過程

背景:在Oracle資料庫建立包,在包建立函式Function和儲存過程Procedure。在java專案中呼叫。 建立包,並在下面宣告包含的函式和儲存過程: create or replace p

Nodejs 與 NPM 第三方模組安裝 package.json 以及 CNPM

包與 NPM Nodejs 中除了它自己提供的核心模組外,我們可以自定義模組,也可以使用 第三方的模組。Nodejs 中第三方模組由包組成,可以通過包來對一組具有相互依 賴關係的模組進行統一管理。 完全符合 CommonJs 規範的包目錄一般包含如下

swoole學習筆記(五)網路通訊協議設計 -- EOF結束符協議固定包頭+協議

上2篇筆記講述了TCP伺服器端和TCP客戶端,既然他們之間要互相通訊,必須要制定一套通訊協議。 swoole目前支援2種通訊協議:EOF結束符協議和固定包頭+包體協議 一、EOF結束符協議 EOF協

Python ModulePackage辨析

.html 執行 i++ ide pretty ras 內容 color param Python 基礎學習 說明 這不是最基礎的新手教程,如需了解Python的數據類型、變量等基礎內容,請移步:https://docs.python.org/

PL/SQL 編程(三 )程序,觸發器,視圖,索引

rep upd 索引 itl 數據檢索 一鍵 代碼 dep pl/sql conn scott/tiger; grant insert,update,delete on emp to system; conn system/orcl1234; create or

oracle 調用的函數並返回return值

datarow ret .com rect tex ring catch param finally /// <summary> /// 執行數據庫包體操作,返回結果 /// </summary> /// <param name="cmdTe

npmpackage.json那些不為常人所知的小祕密

此文已由作者黃鍇授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 強大的命令功能 如果你沒使用過script,那你可算是從來沒手動編輯過package.json。script作為package.json裡最強大的功能,它賦予你新增指令碼的能力。特別是從[email prot

Android Studio中的package nameapplication ID

在Eclipse中只有package name的概念,沒有application ID。而在Android Studio 中把package name 拆分為了兩部分package name和application ID。 Android Studio 中的application ID和

package-lock.jsonpackage.json的作用

狀態 保持 可能 管理器 例如 ejs 方式 超過 一個 轉自:https://www.cnblogs.com/cangqinglang/p/8336754.html package-lock.json的作用就是鎖定安裝依賴時包的版本,並且需要上傳到git,以保證其他人np

java中package命名規則,Javapackage)的命名規範

Java的包名都有小寫單片語成,類名首字母大寫;包的路徑符合所開發的 系統模組的 定義,比如生產對生產,物資對物資,基礎類對基礎類。以便看了包名就明白是哪個模組,從而直接到對應包裡找相應的實現。       由於Java面向物件的特性,每名J

Java中許可權控制,import package 關鍵字

概況表: 目錄結構為:我們在com.java17包下建立了兩個class:Demo01、Demo02。 舉例一: Demo01: package com.java17; public class Demo01 {     private Strin

Eclipse中OutlinePackage Explorer中顯示的小圖示的意義

裡面總共分為三種類型: 1. 顏色:紅、黃、綠 2. 形狀:方、菱、圓 3. 內部:實心、空心 其中:紅色方塊 代表 private          黃色菱形 代表 protected          綠色圓形 代表 public          實心