Oracle PL/SQL游標提取資料(使用FOR迴圈)

使用兩種方式透過For迴圈提取游標資料

前言

使用FOR迴圈提取游標資料,使用方式像是許多許多程式語言所提供的FOREACH語法,PL/SQL亦提供類似的語法,與其他迴圈提取資料的方法比較,使用FOR迴圈提取游標資料無須先於DECLARE區塊先行宣告RECORD變數。

游標的FOR迴圈有兩種語法,一種為使用SELECT敘述置於FOR迴圈內,另一種則為先於DECLARE區塊宣告游標,再將游標至於FOR迴圈內。

實作

使用SELECT敘述方式語法如下

1
2
3
FOR RECORD 變數 IN (SELECT .....) LOOP
    .....
END LOOP;

使用游標名稱

1
2
3
FOR RECORD 變數 IN 游標名稱 LOOP
    .....
END LOOP;

使用游標的FOR迴圈提取游標資料,開發者不需自行開啟游標以及關閉游標,Oracle會自動進行處理,以下進行相關示範。

使用 SELECT 敘述方式

1
2
3
4
5
BEGIN
    FOR R_ARTICLE IN (SELECT * FROM ARTICLE) LOOP
        DBMS_OUTPUT.PUT_LINE('ID: ' || R_ARTICLE.ID || ', TITLE: ' || R_ARTICLE.TITLE || ', CREATE_DATE: ' || R_ARTICLE.CREATE_DATE || ', MODIFY_DATE: ' || NVL(TO_CHAR(R_ARTICLE.MODIFY_DATE), '無'));
    END LOOP;
END;

使用游標名稱

1
2
3
4
5
6
7
8
DECLARE
    -- 宣告游標
    CURSOR C_ARTICLE IS SELECT * FROM ARTICLE;
BEGIN
    FOR R_ARTICLE IN C_ARTICLE LOOP
        DBMS_OUTPUT.PUT_LINE('ID: ' || R_ARTICLE.ID || ', TITLE: ' || R_ARTICLE.TITLE || ', CREATE_DATE: ' || R_ARTICLE.CREATE_DATE || ', MODIFY_DATE: ' || NVL(TO_CHAR(R_ARTICLE.MODIFY_DATE), '無'));
    END LOOP;
END;

執行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ID: 7C5E3A5AD847F0D3E050A8C0FD894690, TITLE: 我的第一篇 PL/SQL 筆記, CREATE_DATE: 2018-12-07 10:59:37, MODIFY_DATE: 無
ID: 7C5E3A5AD848F0D3E050A8C0FD894690, TITLE: 我的 JAVA 學習歷程, CREATE_DATE: 2018-12-07 12:13:23, MODIFY_DATE: 無
ID: 7C5E3A5AD849F0D3E050A8C0FD894690, TITLE: C# 程式架構, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84AF0D3E050A8C0FD894690, TITLE: Eclipse 程式碼提示設定, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84BF0D3E050A8C0FD894690, TITLE: TightVNC 檔案傳輸, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84CF0D3E050A8C0FD894690, TITLE: Apache Struts 2 檔案上傳, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84DF0D3E050A8C0FD894690, TITLE: Apache Struts 2 表單驗證 (驗證框架), CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84EF0D3E050A8C0FD894690, TITLE: Apache Struts 2 攔截器設定與使用, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD84FF0D3E050A8C0FD894690, TITLE: MySQL 外部 IP 連線 (Ubuntu Server), CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無
ID: 7C5E3A5AD850F0D3E050A8C0FD894690, TITLE: CentOS 切換 root 免密碼設定, CREATE_DATE: 2018-12-07 12:16:20, MODIFY_DATE: 無