前言
套裝程式是一群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.
|