ORACLE 包

ORACLE             

包的作用:

包可以將任何出現在塊聲明的語句 ( 過程 , 函數 , 遊標 , 遊標 , 類型 , 變量 ) 放於包中 , 相當於一個容器 . 將聲明語句放入包中的好處是 : 用戶可以從其他 PL/SQL 塊中對其進行引用 , 因此包爲PL/SQL 提供了全程變量 .
包分爲兩部分 : 包頭和包體 .

如何創建包 

1) 包頭 :
  語法格式 :
  CREATE OR REPLACE PACKAGE package_name /* 包頭名稱 */
  IS|AS pl/sql_package_spec                     /* 定義過程 , 函數以及返回類型 , 變量 , 常量及數據類型定義 */
  定義包頭應當遵循以下原則 :
  1) 包元素位置可以任意安排 . 然而在聲明部分 , 對象必須在引用前進行聲明 .
  2) 包頭可以不對任何類型的元素進行說明 . 例如 , 包頭可以只帶過程和函數說明語句 , 而不聲明任何異常和類型 .
  3) 對過程和函數的任何聲明都必須只對子程序和其參數進行描述 , 不能有任何代碼的說明 , 代碼的實現只能在包體中出現 . 它不同於塊聲明 , 在塊聲明中 , 過程和函數的代碼可同時出現在聲明部分 .
2. 包體 :
  語法格式 :
  CREATE OR REPLACE PACKAGE BODY package_name/* 包名必須與包頭的包名一致 */
  IS | AS pl/sql_package_body                    /* 遊標 , 函數 , 過程的具體定義 */
包體是與包頭相互獨立的 , 包體只能在包頭完成編譯後才能進行編譯 . 包體中帶有包頭中描述的子程序的具體實現的代碼段 . 除此之外 , 包體還可以包括具有包體人全句屬性的附加聲明部分 , 但這些附加聲明對於包頭是不見的 .
EG: 定義一個包頭
 
CREATE OR REPLACE PACKAGE select_table
IS
TYPE tab_02 IS RECORD
  (
  itnum_1 varchar2(1),
  itnum_2 varchar2(1)
);
TYPE tab_03 IS RECORD
(
  itnum_1 varchar2(1),
  itnum_2 varchar2(1),
  itnum_3 varchar2(1)
);
TYPE tab_04 IS RECORD
(
  itnum_1 varchar2(1),
  itnum_2 varchar2(1),
  itnum_3 varchar2(1),
  itnum_4 varchar2(1)
);
TYPE tab_05 IS RECORD
(
  itnum_1 varchar2(1),
  itnum_2 varchar2(1),
  itnum_3 varchar2(1),
  itnum_4 varchar2(1),
itnum_5 varchar2(1)
);
TYPE tab_06 IS RECORD
(
  itnum_1 varchar2(1),
  itnum_2 varchar2(1),
  itnum_3 varchar2(1),
  itnum_4 varchar2(1),
itnum_5 varchar2(1),
itnum_6 varchar2(1)
);
TYPE cur_02 IS REF CURSOR RETURN tab_02;
TYPE cur_03 IS REF CURSOR RETURN tab_03;
TYPE cur_04 IS REF CURSOR RETURN tab_04;
TYPE cur_05 IS REF CURSOR RETURN tab_05;
TYPE cur_06 IS REF CURSOR RETURN tab_06;
END select_tab;
 
 
EG:
CREATE OR REPLACE PACKAGE test_package
IS
FUNCTION average
(cnum IN char)
RETURN NUMBER;
PRODURE student_grade
(CUR OUT select_table.cur_04);--CUR 的數據類型是 select_table 包中 cur_o4
END test_package;
 
包體 :
CREATE OR REPLACE PACKAGE BODY test_package
IS
/* 函數實現開始 */
FUNCTION average                        
(cnum IN char)
RETURN NUMBER;
AS
avger NUMBER;
BEGIN
SELECT AVG(CJ) INTO avger FROM XS_KC WHERE KCH=cnum GROUP BY KCH;
RETURN(avger);
END average;
/* 函數實現結束 */
/* 過程實現開始 */
PRODURE student_grade
(CUR OUT select_table.cur_04);
AS
OPEN CUR FOR
SELECT XS.XH ,XS.XM,KC.KCM,XS_KC.CJ
FROM XS ,XS_KC,KC
WHERE XS.XH =XS_KC.XH AND XS_KC.KCH=KC.KCH;
END student_grade;
/* 過程實現結束 */
END test_package;

重載 :

包中的函數和過程可以重載
以下條件不能重載 :
1. 如果兩個子程序的參數僅在名稱和類型上不同 , 這兩個程序不能重載 .
PROCEDURE overloadME(p_theparameter IN number);
PROCEDURE overloadME(p_theparameter OUT number);
IN ,OUT 爲參數類型 ,number 爲數據類型 . 兩個過程僅在類型上不同時不能重載 .
2. 不能根據兩個函數的返回類型對其重載
 :
FUNCTION overloadMeEToo RETURN DATE;
FUNCTION overloadMeEToo RETURN NUMER;
3. 重載子程序的參數的類族必須不同 , 例如 , 由於 CHAR  VARCHAR2 屬性同一類族 , 所以不能重載.
PROCEDURE overloadME(p_theparameter IN char);
PROCEDURE overloadME(p_theparameter IN varchar2);
4. 打包子程序也可以重載
 
5. 包的初始化 .
當第一次調用打包子程序時 , 該包將進行初始化 . 也就是說 , 將該包從硬盤中讀入到內存 , 並啓用調用的子程序的編譯代碼 . 這時 , 系統爲該包中定義的所有變量分配內存單元 . 每個會話都有打其打開包變量的副本 , 以確保執行同一個包子程序的兩個會話使用不同的內存單元 .
在大多數情況下 , 初始化代碼要在包第一次初始化時運行 . 爲了實現這一功能 , 可以在包體中的所有對象之後加入一個初始化代碼 .
語法格式 :
CREATE OR REPLACE PACKAGE BODY package_name
IS|AS
............
BEGIN
Initialization_code;-- 要運行的初始化代碼
 
END ;
 
 

ORACLE 內置包

1.DBMS_ALERT  : 用於數據庫報警 , 允許會話間通信
2.DBMS_JOB: 用於任務調度服務
3.DBMS_LOB: 用於處理大對象操作
4.DBMS_PIPE  : 用於數據庫管道 , 允許會話間通信
5.DBMS_SQL  : 用於執行動態 SQL
6.UTL_FILE  : 用於文件的輸入輸出
除了 UTL_FILE 包存儲在服務器和客戶端外 , 其他的包均存儲在服務器中 .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章