包頭(Package)與包體(Package body)的學習與應用

abraham_dba_2013發表於2014-01-16
包由包規範和包體兩部分組成。
特點:

1.將有聯絡的物件打成包,方便使用;
2.包中物件包括儲存過程、函式、遊標、自定義型別和變數,可以在PL_SQL塊中應用這些物件。

定義包頭:
----------------------------------------------------------------------------------------------

create_package ::=

create_package
----------------------------------------------------------------------------------------------

定義包體:
----------------------------------------------------------------------------------------------

create_package_body ::=

create_package_body

----------------------------------------------------------------------------------------------
只有當包頭編輯成功後才能編輯包體,其中的函式名與過程名須和包頭中的函式過程一樣。

包應用的一個例子:  
包的作用: 根據出生年月返回年齡function Getage,返回工資function Getsalary
--建立環境
Create Table T_PsnSalary  --工資表
(
Fpsncode varchar(4) default '',  --個人程式碼
Fpsndesc varchar(20) default '',  --描述
FpsnBirth varchar(20) default '', --生日
FpsnSalary number(8,2)            --工資
);

--新增資料
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','張三','1986.01.10',1100);
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);
commit;

--建立包頭
create or replace package A_GetData is
  function Getage(birthst varchar,birthend varchar) return integer;
  function Getsalary(VFpsncode varchar) return number;
end A_Getdata;

--建立包體
create or replace package body A_GETDATA is
  function Getage(birthst varchar,birthend varchar) return integer --得到年齡函式
  is
     V_birth integer;
     ToDateEnd Date;
     Toyear number(4);
     Tomonth number(4);
     Fromyear number(4);
     Frommonth number(4);
  begin
    if (birthend='') or (birthend is null) then
    select sysdate into ToDateEnd from dual; --得到系統時間
    end if;
    Toyear := to_number(to_char(ToDateEnd,'YYYY')); --得到最後年月
    Tomonth := to_number(to_char(ToDateEnd,'MM'));
    Fromyear := to_number(substr(birthst,1,4));--計算的年月
    Frommonth := to_number(substr(birthst,6,2));
    if Tomonth-Frommonth>0 then V_birth:=Toyear-fromyear;
    else V_birth:=Toyear-fromyear-1;
    end if;
    return(V_birth);
  end Getage;
  function getSalary(VFpsncode varchar) return number--返回工資情況
  is
    V_psnSalary number(8,2);
  begin
    Select FpsnSalary into V_psnSalary from T_PsnSalary  where Fpsncode=VFpsncode;
    return(V_psnSalary);
  end getSalary;
  
end A_GETDATA;

--測試
select a.*,A_getdata.Getage(Fpsnbirth,'')age from T_psnsalary a;  --呼叫包得到年齡功能
select A_getdata.Getsalary('C001') from dual;                     --程式碼得到工資
參考:
1、http://blog.csdn.net/moonzhang520/article/details/4036210
2、http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_package_body.htm#LNPLS01372

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29439655/viewspace-1071317/,如需轉載,請註明出處,否則將追究法律責任。

相關文章