Oracle PL/SQL RECORD(Cursor-Based Records)

使用Cursor-Based Records進行資料處理

前言

基於CURSOR的RECORD在先前例子楊藝用了幾次,不過因為不是探討RECORD因此沒有說明相關應用,基於資料表的RECORD使用上有許多限制,如無法使用彙總函數以及無法直接對JOIN的資料表進行資料參考,因此需要透過VIEW來做中間媒介使用,而基於CURSOR的RECORD則沒有這方面的問題。

實作

使用語法如下

1
2
3
4
5
6
DECLARE
    CURSOR CURSOR 變數 IS SELECT 敘述;
    RECORD 變數 CURSOR 變數%ROWTYPE;
BEGIN
    FETCH CURSOR 變數 INTO RECORD 變數;
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
DECLARE
    -- 宣告 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;
    DBMS_OUTPUT.PUT_LINE('開啟游標');
    -- 提取資料
    FETCH C_ARTICLE INTO R_ARTICLE;

    -- 判斷是否有讀取到資料
    WHILE C_ARTICLE%FOUND LOOP
        -- 顯示資料
        DBMS_OUTPUT.PUT_LINE('ID: ' || R_ARTICLE.ID);
        DBMS_OUTPUT.PUT_LINE('TITLE: ' || R_ARTICLE.TITLE);
        DBMS_OUTPUT.PUT_LINE('CREATE_DATE: ' || R_ARTICLE.CREATE_DATE);
        DBMS_OUTPUT.PUT_LINE('MODIFY_DATE: ' || R_ARTICLE.MODIFY_DATE);
        DBMS_OUTPUT.PUT_LINE('----------------------------------');

        -- 提取資料
        FETCH C_ARTICLE INTO R_ARTICLE;
    END LOOP;

    -- 關閉游標
    DBMS_OUTPUT.PUT_LINE('關閉游標');
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
開啟游標
ID: 7C5E3A5AD847F0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - 我的第一篇 PL/SQL 筆記
CREATE_DATE: 2018/12/07 10:59
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD848F0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - 我的 JAVA 學習歷程
CREATE_DATE: 2018/12/07 12:13
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD849F0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - C# 程式架構
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84AF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - Eclipse 程式碼提示設定
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84BF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - TightVNC 檔案傳輸
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84CF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - Apache Struts 2 檔案上傳
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84DF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - Apache Struts 2 表單驗證 (驗證框架)
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84EF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - Apache Struts 2 攔截器設定與使用
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD84FF0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - MySQL 外部 IP 連線 (Ubuntu Server)
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
ID: 7C5E3A5AD850F0D3E050A8C0FD894690
TITLE: 楊藝的洋溢生活 - CentOS 切換 root 免密碼設定
CREATE_DATE: 2018/12/07 12:16
MODIFY_DATE: 2018/12/08 12:39
----------------------------------
關閉游標