在 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 一次性抓取,效能更佳。