首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle PL/SQL 二維陣列實作:RECORD + INDEX BY TABLE

     編輯:Oracle 資料庫基礎

需求

在 PL/SQL 中模擬二維陣列,儲存多筆員工資料(編號、姓名、性別/薪資),並能逐筆輸出。

實作範例

CREATE OR REPLACE PROCEDURE varray_test AS
    -- 1. 定義記錄型別(對應一列)
    TYPE emp_type IS RECORD (
        emp_id    NUMBER,
        emp_name  VARCHAR2(100),
        emp_gender VARCHAR2(100)
    );

    -- 2. 定義關聯陣列(INDEX BY BINARY_INTEGER),對應多列
    TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;

    -- 3. 宣告變數
    emp_rec_array emp_type_array;
    emp_rec       emp_type;
    p_data        emp%ROWTYPE;

    -- 4. 反射游標
    TYPE my_cursor IS REF CURSOR;
    p_cc          my_cursor;
    p_count       NUMBER := 1;
BEGIN
    -- 5. 開啟動態游標查詢員工資料
    OPEN p_cc FOR 'SELECT t.id, t.name, t.salary FROM emp t';

    LOOP
        FETCH p_cc INTO p_data;
        EXIT WHEN p_cc%NOTFOUND;

        emp_rec.emp_id    := p_data.id;
        emp_rec.emp_name  := p_data.name;
        emp_rec.emp_gender := p_data.salary;  -- 範例將 salary 存入 gender 欄位

        emp_rec_array(p_count) := emp_rec;
        p_count := p_count + 1;
    END LOOP;

    CLOSE p_cc;

    -- 6. 遍歷陣列輸出
    FOR i IN 1 .. emp_rec_array.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(
            'emp_id = ' || emp_rec_array(i).emp_id ||
            ' emp_name = ' || emp_rec_array(i).emp_name ||
            ' emp_gender = ' || emp_rec_array(i).emp_gender
        );
    END LOOP;
END;
/

關鍵技術點解析

語法說明
TYPE ... IS RECORD 定義結構化記錄,類似 C struct 或 Java Class,可包含多欄位不同型別。
TYPE ... IS TABLE OF ... INDEX BY BINARY_INTEGER 定義關聯陣列(Associative Array),索引為整數,可稀疏存放,不需預先指定大小。
REF CURSOR 弱型別游標指標,支援動態 SQL,執行期決定查詢內容。
%ROWTYPE 自動繼承資料表或游標的列結構,免手動宣告每個欄位。

擴充應用

  • 若需固定大小陣列,可改用 VARRAY(max_size) OF emp_type(Varray)。
  • 若需持久化儲存於資料庫,可建立 CREATE TYPE emp_type_array AS TABLE OF emp_type(Nested Table)。
  • 大量資料處理可搭配 BULK COLLECT INTO emp_rec_array 一次性抓取,效能更佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved