PL/SQL 無原生陣列,但提供 關聯式陣列 (Associative Array,舊稱 Index-by Table) 以 INDEX BY BINARY_INTEGER 實現鍵值映射,配合 RECORD 類型可構建多維結構。
DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
best_employees emp_ssn_array;
worst_employees emp_ssn_array;
BEGIN
best_employees(1) := 123456;
best_employees(2) := 888888;
worst_employees(1) := 222222;
worst_employees(2) := 666666;
FOR i IN 1..best_employees.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('i=' || i ||
', best_employees=' || best_employees(i) ||
', worst_employees=' || worst_employees(i));
END LOOP;
END;
/*
輸出:
i=1, best_employees=123456, worst_employees=222222
i=2, best_employees=888888, worst_employees=666666
*/
DECLARE
TYPE emp_type IS RECORD (
emp_id employee_table.emp_id%TYPE,
emp_name employee_table.emp_name%TYPE,
emp_gender employee_table.emp_gender%TYPE
);
TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;
emp_rec_array emp_type_array;
emp_rec emp_type;
BEGIN
emp_rec.emp_id := 300000000;
emp_rec.emp_name := 'Barbara';
emp_rec.emp_gender := 'Female';
emp_rec_array(1) := emp_rec;
emp_rec.emp_id := 300000008;
emp_rec.emp_name := 'Rick';
emp_rec.emp_gender := 'Male';
emp_rec_array(2) := emp_rec;
FOR i IN 1..emp_rec_array.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('i=' || i ||
', 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;
/*
輸出:
i=1, emp_id=300000000, emp_name=Barbara, emp_gender=Female
i=2, emp_id=300000008, emp_name=Rick, emp_gender=Male
*/
| 屬性/方法 | 說明 |
|---|---|
| .COUNT | 當前元素個數 |
| .FIRST / .LAST | 最小/最大索引值 |
| .PRIOR(n) / .NEXT(n) | 索引 n 的前一個/後一個索引 |
| .EXISTS(n) | 索引 n 是否存在(避免 NO_DATA_FOUND) |
| .DELETE / .DELETE(n) / .DELETE(m,n) | 刪除全部/單個/範圍元素 |
VARRAY(定長)或 NESTED TABLE(變長)作為 Schema 級集合類型,可直接存入表列、跨會話傳遞。