2016年7月24日 星期日

學習初級Oracle PL/SQL (三)

Packages

在練習中, 你很少創建一個獨立的存儲functionprocedure. 相反,你會使用package. 什麼是package? Package是組織相關的functionprocedure包含在一起, 就像創建一個圖書館, 但在PL/SQL術語中稱為package. 當你建立ProcedureFunction後會保存OracleProcedureFunction目錄裡, 如果我有一個Procedure功能與已存在的Procedure類似, 但又有點不一樣, Oracle又不允許在Procedure目錄下建立相同名稱的Procedure, 這時候就要靠Package來把相同名稱的Procedure分開. Package也有分類的意思, 將相關功能模組封裝在同一個Package內可提高聚合性.

PL/SQL Package有兩部分:
1. Package specification
2. Package body

Package Specification定義了此Package內所有的成員, 例如:ProcedureFunction, 這裡定義的ProcedureFunction只要擺定義即可不需要放實作的內容, Specification的成員都是對外公開Public.
Package Body為放置成員Spec的詳細實作區, 在建立Package時要先有Specification才可以有Body, 你可以將SpecBody分成兩個檔案撰寫也可以撰寫在同一個檔案裡.

Package Specification 語法:
CREATE [OR REPLACE] PACKAGE <package_name> AS
-- one or more: constant, cursor, function, procedure, or variable declarations
END <package_name>;
/



Create package spec.
以下Package spec例子, 包含了5functions, 但只有declare並沒有運行code, code package body.
create or replace package date_ as
d_max      constant date := to_date('99991231','YYYYMMDD');
d_min       constant date := to_date('19900101','YYYYMMDD');
-- 常數關鍵字constant. 它需要一個初始值,並且不允許被改變該值.

function end_of_day( input1 in date) return date;

function get_max return date;

function get_min return date;

function random(
starting_year in number, ending_year in number )
return date;

function start_of_day( input2 in date) return date;

end date_;
/

Create package body:
create or replace package body date_ as

function end_of_day(input1 in date) return date as
begin
 return to_date(to_char(input1, 'YYYYMMDD')||'235959','SYYYYMMDDHH24MISS');
end end_of_day;

function get_max return date as
begin
 return d_max;
end get_max;

function get_min return date as
begin
 return d_min;
end get_min;

function random(starting_year in number, ending_year in number)
return date as
        d_random         date;
        n_day               number;
        n_month           number;
        n_year              number;
        begin
         n_year := round(dbms_random.value(starting_year,ending_year),0);
         n_month := round(dbms_random.value(1,12),0);
         n_day := round(dbms_random.value(1,31),0);
         d_random := to_date(lpad(to_char(n_year),4,'0')||
                                        lpad(to_char(n_month),2,'0')||
                                        lpad(to_char(n_day),2,'0'),'YYYYMMDD');
        exception when others then pl(SQLERRM);
        end;
return d_random;
end random;

function start_of_day(input2 in date) return date as
begin
 return trunc(input2);
 end start_of_day;
 end date_;
 /
執行效果:

SQL> alter session set nls_date_format='YYYYMMDDHH24MISS';

Session altered.

SQL> select date_.end_of_day(sysdate) from dual;

DATE_.END_OF_D
--------------
20160725235959

SQL> select date_.get_max from dual;

GET_MAX
--------------
99991231000000

SQL> select date_.get_min from dual;

GET_MIN
--------------
19900101000000

SQL> select date_.random(1994,2014) from dual;

DATE_.RANDOM(1
--------------
19960809000000

SQL> select date_.start_of_day('20160101235959') from dual;

DATE_.START_OF
--------------
20160101000000



It’s Your turn to Create a package
還記得較早前創建的to_number2 function? 用它來創建你的package. 條款如下:
1.     Package 名稱 NUMBER_
2.     select 來測試 package.



PL/SQL BLOCK 語法比較
ANONYMOUS
[DECLARE]
CREATE
FUNCTION
CREATE
PROCEDURE
CREATE
PACKAGE
CREATE
PACKAGE BODY
-
[parameters]
[parameters]
-
-
-
RETURN
-
-
-
[declaration section]
[declaration section]
[declaration section]
[declaration section]
[declaration section]
BEGIN
BEGIN
BEGIN
-
BEGIN
executable
section
executable
section
executable
section
-
executable
section
[EXCEPTION]
[EXCEPTION]
[EXCEPTION]
-
[EXCEPTION]
[exception handling]
[exception handling]
[exception handling]
-
[exception handling]
END;
END;
END;
END;
END;
/
/
/
/
/


學習初級Oracle PL/SQL (四)
學習初級Oracle PL/SQL (二)

沒有留言:

張貼留言