Oracle PL/SQL Collections(Index-by Table)

Collections(Index-by Table)進行資料處理

前言

Collections是一種資料的集合,如同其他程式語言一般,可以透過Collections協助進行資料處理,並提供集合相關操作方法,提升開發者的便利性。

於PL/SQL當中Collections可以分為以下三種:

  • 索引式表格(Index-by Table)
  • 巢狀式表格(Nested Table)
  • Variable-Size Array(Varrays)

Index-by Table又可稱為Associative Array,是一種以Key-Value的方式存放資料的Collection。

實作

使用語法如下

1
2
3
4
-- 宣告 Collection 型態
TYPE 型態名稱 IS TABLE OF 元素型態 [NOT NULL] INDEX BY 索引型態;
-- 宣告 Collection 變數
COLLECTION 變數名稱 Collections 型態;

以下進行相關示範

 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
DECLARE
    -- 宣告 I 變數 (尋訪時存放 KEY 值)
    I ARTICLE.ID%TYPE;
    -- 宣告 Collection 型態
    TYPE ARTICLE_COLLETION IS TABLE OF ARTICLE.TITLE%TYPE INDEX BY ARTICLE.ID%TYPE;
    -- 宣告 Collection 變數
    ARTICLE_ARRAY ARTICLE_COLLETION;
    -- 宣告 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;
BEGIN
    -- 開啟游標
    OPEN C_ARTICLE;
    -- 提取資料
    FETCH C_ARTICLE INTO R_ARTICLE;

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

    -- 判斷是否有讀取到資料,並將資料存放置 Collection 變數
    WHILE C_ARTICLE%FOUND LOOP
        ARTICLE_ARRAY(R_ARTICLE.ID) := R_ARTICLE.TITLE;        
        -- 提取資料
        FETCH C_ARTICLE INTO R_ARTICLE;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE('尋訪 COLLECTION');

    -- 將 KEY 存放至 I 變數
    I := ARTICLE_ARRAY.FIRST;

    -- 進行 COLLECTION 尋訪
     WHILE I IS NOT NULL LOOP
         DBMS_OUTPUT.PUT_LINE('INDEX: ' || I || ', VALUE: ' || ARTICLE_ARRAY(I));
         -- 取得 I 的下一個元素
         I := ARTICLE_ARRAY.NEXT(I);
     END LOOP;
END;

執行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
存放元素至 COLLECTION
尋訪 COLLECTION
INDEX: 7C5E3A5AD847F0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - 我的第一篇 PL/SQL 筆記
INDEX: 7C5E3A5AD848F0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - 我的 JAVA 學習歷程
INDEX: 7C5E3A5AD849F0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - C# 程式架構
INDEX: 7C5E3A5AD84AF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - Eclipse 程式碼提示設定
INDEX: 7C5E3A5AD84BF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - TightVNC 檔案傳輸
INDEX: 7C5E3A5AD84CF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - Apache Struts 2 檔案上傳
INDEX: 7C5E3A5AD84DF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - Apache Struts 2 表單驗證 (驗證框架)
INDEX: 7C5E3A5AD84EF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - Apache Struts 2 攔截器設定與使用
INDEX: 7C5E3A5AD84FF0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - MySQL 外部 IP 連線 (Ubuntu Server)
INDEX: 7C5E3A5AD850F0D3E050A8C0FD894690, VALUE: 楊藝的洋溢生活 - CentOS 切換 root 免密碼設定