Oracle PL/SQL Collections(Variable-Size Array)

Collections(Variable-Size Array)進行資料處理

前言

Variable-Size Array概念上與一般程式語言的Array相似,使用前必須宣告最大使用空間,之所以稱為Variable-Size Array在於宣告進行初始化之後,會取得一個空陣列,要儲存新元素之前必須透過EXTEND方法進行陣列拓展,不過不可擴展超過宣告的最大使用空間。

實作

使用語法如下

1
2
3
4
-- 宣告 Collection 型態
TYPE 型態名稱 IS {VARRAY | VARYING ARRAY} (最大使用空間) OF 元素型態 [NOT NULL];
-- 宣告 Collection 變數並初始化
COLLECTION 變數名稱 Collections 型態 ([元素1, 元素2, 元素3, ...]) := Collections 型態 ([元素1, 元素2, 元素3, ...]);

以下進行相關示範

 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
DECLARE
    -- 宣告 I 變數
    I INT := 1;
    -- 宣告 CURSOR 變數
    CURSOR C_ARTICLE IS SELECT ID, TITLE, TO_CHAR(CREATE_DATE, 'YYYY/MM/DD HH24:MI') AS CREATE_DATE, TO_CHAR(MODIFY_DATE, 'YYYY/MM/DD HH24:MI') AS MODIFY_DATE FROM ARTICLE;
    -- 宣告 RECORD 變數
    R_ARTICLE C_ARTICLE%ROWTYPE;
    -- 宣告 Collection 型態
    TYPE ARTICLE_COLLETION IS VARRAY(100) OF C_ARTICLE%ROWTYPE;
    -- 宣告 Collection 變數
    ARTICLE_ARRAY ARTICLE_COLLETION := ARTICLE_COLLETION();
BEGIN
    -- 開啟游標
    OPEN C_ARTICLE;
    -- 提取資料
    FETCH C_ARTICLE INTO R_ARTICLE;

    DBMS_OUTPUT.PUT_LINE('存放元素至 COLLECTION');

    -- 判斷是否有讀取到資料,並將資料存放置 Collection 變數
    WHILE C_ARTICLE%FOUND LOOP
        -- 拓展 Collection 變數
        ARTICLE_ARRAY.EXTEND;
        -- 將值設定給 Collection
        ARTICLE_ARRAY(I) := R_ARTICLE;
        -- 索引值遞增
        I := I+1;
        -- 提取資料
        FETCH C_ARTICLE INTO R_ARTICLE;
    END LOOP;

    -- 關閉游標
    CLOSE C_ARTICLE;

    DBMS_OUTPUT.PUT_LINE('尋訪 COLLECTION');

    -- 進行 COLLECTION 尋訪
    FOR I IN ARTICLE_ARRAY.FIRST .. ARTICLE_ARRAY.LAST LOOP
        DBMS_OUTPUT.PUT_LINE('INDEX: ' || I || ', ID: ' || ARTICLE_ARRAY(I).ID || ', TITLE: ' ||  ARTICLE_ARRAY(I).TITLE || ',CREATE_DATE: ' ||  ARTICLE_ARRAY(I).CREATE_DATE || 'MODIFY_DATE: ' || ARTICLE_ARRAY(I).MODIFY_DATE);
    END LOOP;
END;

執行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
存放元素至 COLLECTION
尋訪 COLLECTION
INDEX: 1, ID: 7C5E3A5AD847F0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - 我的第一篇 PL/SQL 筆記,CREATE_DATE: 2018/12/07 10:59MODIFY_DATE: 2018/12/08 12:39
INDEX: 2, ID: 7C5E3A5AD848F0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - 我的 JAVA 學習歷程,CREATE_DATE: 2018/12/07 12:13MODIFY_DATE: 2018/12/08 12:39
INDEX: 3, ID: 7C5E3A5AD849F0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - C# 程式架構,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 4, ID: 7C5E3A5AD84AF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - Eclipse 程式碼提示設定,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 5, ID: 7C5E3A5AD84BF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - TightVNC 檔案傳輸,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 6, ID: 7C5E3A5AD84CF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - Apache Struts 2 檔案上傳,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 7, ID: 7C5E3A5AD84DF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - Apache Struts 2 表單驗證 (驗證框架),CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 8, ID: 7C5E3A5AD84EF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - Apache Struts 2 攔截器設定與使用,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 9, ID: 7C5E3A5AD84FF0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - MySQL 外部 IP 連線 (Ubuntu Server),CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39
INDEX: 10, ID: 7C5E3A5AD850F0D3E050A8C0FD894690, TITLE: 四處跑龍套的軟體工程師 - CentOS 切換 root 免密碼設定,CREATE_DATE: 2018/12/07 12:16MODIFY_DATE: 2018/12/08 12:39