Oracle PL/SQL套裝程式

把東西通通包起來的套裝程式

前言

套裝程式是一群PL/SQL物件的集合,用來封裝如變數、CURSOR、函數以及程序…等內容。一個套裝程式主要分成以下兩個部分。

  • 套裝程式的規格(Package Specification)
  • 套裝程式的主體(Package Body)

套裝程式的規格建立語法如下。

1
2
3
4
CREATE [OR REPLACE] PACKAGE 套裝程式名稱
{IS | AS}
    各種 PL/SQL 物件宣告;
END [套裝程式名稱];

相關物件宣告方法如下,於套裝程式的規格中,只可撰寫程式宣告,不可撰寫程式主體。

程序

1
2
PROCEDURE 程序名稱;
PROCEDURE 程序名稱 [(參數1 型態1, 參數2 型態2, ...)];

函數

1
2
FUNCTION 函數名稱;
FUNCTION 函數名稱 [(參數1 型態1, 參數2 型態2, ...)] RETURN 型態;

變數

1
2
3
變數1 型態 := 1;
變數2 資料表名稱.欄位%TYPE;
變數3 型態;

RECORD

1
2
3
4
TYPE RECORD 型態名稱 IS RECORD (
    屬性1 資料型態1;
    屬性2 資料型態2;
);

於套裝程式的規格建立之後,接著須建立套裝程式的主體,使用語法如下。

1
2
3
4
CREATE [OR REPLACE] PACKAGE BODY 套裝程式名
{IS | AS}
    各種PL/SQL物件宣告與實作主體內容;
END [套裝程式名稱];

實作

以下進行相關示範

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
-- 建立套裝程式規格
CREATE PACKAGE OPENJRY_PKG
 IS
    -- 全域變數宣告
    PACKAGE_WEBSITE_NAME VARCHAR2(20) :=  '楊藝的洋溢生活';

    -- 函數宣告
    FUNCTION TO_MY_DATE_CHAR(IN_DATE IN DATE) RETURN VARCHAR2;

    -- 程序宣告
    PROCEDURE ARTICLE_LIST(OUT_RESULT OUT SYS_REFCURSOR);
    PROCEDURE SAVE_ARTICLE (IN_TITLE IN VARCHAR2, OUT_RESULT OUT VARCHAR2);
END OPENJRY_PKG;

-- 建立套裝程式本體
CREATE PACKAGE BODY OPENJRY_PKG
IS
    -- 函數建立    
    FUNCTION TO_MY_DATE_CHAR(IN_DATE IN DATE) RETURN VARCHAR2
    IS
    BEGIN
        RETURN TO_CHAR(IN_DATE, 'YYYY/MM/DD HH24:MI');
    END TO_MY_DATE_CHAR;

    -- 程序建立
    PROCEDURE ARTICLE_LIST(OUT_RESULT OUT SYS_REFCURSOR)
    IS
    BEGIN
      OPEN OUT_RESULT FOR   SELECT * FROM ARTICLE;
    END ARTICLE_LIST;

    PROCEDURE SAVE_ARTICLE (IN_TITLE IN VARCHAR2, OUT_RESULT OUT VARCHAR2)
    IS
        V_COUNT INT;
    BEGIN
        -- 進行資料是否已存在查詢
        SELECT COUNT(*) INTO V_COUNT FROM ARTICLE WHERE TITLE = IN_TITLE;

        --  判斷資料是否已存在,若以存在將回傳結果設成 FAILED 並終止程序
        IF V_COUNT > 0 THEN
            OUT_RESULT := 'FAILED';
            RETURN;
        END IF;

        -- 新增資料
        INSERT INTO ARTICLE (ID, TITLE, CREATE_DATE) VALUES (SYS_GUID(), IN_TITLE, SYSDATE);
        -- 確認交易
        COMMIT;
        -- 將回傳結果設成 SUCCESS
        OUT_RESULT := 'SUCCESS';
    END SAVE_ARTICLE;
END OPENJRY_PKG;

-- 進行測試 (分開執行)
BEGIN
    DBMS_OUTPUT.PUT_LINE('PACKAGE WEBSITE NAME: ' || OPENJRY_PKG.PACKAGE_WEBSITE_NAME);
    DBMS_OUTPUT.PUT_LINE('MY  DATE CHAR: ' || OPENJRY_PKG.TO_MY_DATE_CHAR(SYSDATE));
END;

SET FEEDBACK ON;
SET SERVEROUTPUT ON;
VAR SAVE_RESULT VARCHAR2(10);
EXECUTE OPENJRY_PKG.SAVE_ARTICLE('Ubuntu Server 安裝 OpenJDK', :SAVE_RESULT);
PRINT SAVE_RESULT;

SET FEEDBACK ON;
SET SERVEROUTPUT ON;
VAR DATA_RESULT REFCURSOR;
EXECUTE OPENJRY_PKG.ARTICLE_LIST(:DATA_RESULT);
PRINT DATA_RESULT;

執行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
PACKAGE WEBSITE NAME: 楊藝的洋溢生活
MY  DATE CHAR: 2018/12/10 20:41

已順利完成 PL/SQL 程序.

SAVE_RESULT
--------------------------------------------------------------------------------
SUCCESS

已順利完成 PL/SQL 程序.


ID                               TITLE                                                                                                CREATE_DATE         MODIFY_DATE        
-------------------------------- ---------------------------------------------------------------------------------------------------- ------------------- -------------------
7C5E3A5AD847F0D3E050A8C0FD894690 楊藝的洋溢生活 - 我的第一篇 PL/SQL 筆記                                                               2018-12-07 10:59:37 2018-12-08 12:39:53
7C5E3A5AD851F0D3E050A8C0FD894690 楊藝的洋溢生活 - Oracle PL/SQL 游標鎖定 (FOR UPDATE)                                                  2018-12-10 00:54:25                    
7C5E3A5AD848F0D3E050A8C0FD894690 楊藝的洋溢生活 - 我的 JAVA 學習歷程                                                                   2018-12-07 12:13:23 2018-12-08 12:39:53
7C5E3A5AD849F0D3E050A8C0FD894690 楊藝的洋溢生活 - C# 程式架構                                                                          2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84AF0D3E050A8C0FD894690 楊藝的洋溢生活 - Eclipse 程式碼提示設定                                                               2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84BF0D3E050A8C0FD894690 楊藝的洋溢生活 - TightVNC 檔案傳輸                                                                    2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84CF0D3E050A8C0FD894690 楊藝的洋溢生活 - Apache Struts 2 檔案上傳                                                             2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84DF0D3E050A8C0FD894690 楊藝的洋溢生活 - Apache Struts 2 表單驗證 (驗證框架)                                                  2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84EF0D3E050A8C0FD894690 楊藝的洋溢生活 - Apache Struts 2 攔截器設定與使用                                                     2018-12-07 12:16:20 2018-12-08 12:39:53
7C5E3A5AD84FF0D3E050A8C0FD894690 楊藝的洋溢生活 - MySQL 外部 IP 連線 (Ubuntu Server)                                                   2018-12-07 12:16:20 2018-12-08 12:39:53
7CA41C50E916E0AAE050A8C0FD890E9D PHP 使用 PDO 建立資料庫連線 (使用 MariaDB/MySQL 進行查詢)                                            2018-12-10 12:08:00                    

ID                               TITLE                                                                                                CREATE_DATE         MODIFY_DATE        
-------------------------------- ---------------------------------------------------------------------------------------------------- ------------------- -------------------
7CA41C50E917E0AAE050A8C0FD890E9D CentOS 切換 root 免密碼設定)                                                                         2018-12-10 20:39:02                    
7CA41C50E919E0AAE050A8C0FD890E9D Ubuntu Server 安裝 OpenJDK                                                                           2018-12-10 20:41:06                    

13 rows selected.