EXTENDVARCHAR2/STRING/LONG)%ROWTYPE/記錄類型/物件類型FORALL/BULK COLLECT 批次處理核心依賴關聯陣列NLS_COMP/NLS_SORT)下字串索引需特殊處理-- 形式一
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [NOT NULL]
INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size)];
-- 形式二
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [NOT NULL]
INDEX BY key_type; -- key_type 可為 VARCHAR2/STRING/LONG
PLS_INTEGER/BINARY_INTEGER 為無限制數值類型,對應 C/C++/C#/Java 呼叫規範。VARCHAR2 最大 4000 字元。
將 VARRAY 內容轉移至關聯陣列,FOR i IN month.FIRST..month.LAST 迴圈賦值,calendar(i) := '' 分配空間再賦值。
字串索引時,第二層迴圈計數器 i 為 PLS_INTEGER,無法直接遍歷字串索引。解法:使用集合 API FIRST/NEXT 方法:
current := calendar.FIRST;
element := calendar(current);
-- 後續迴圈
current := calendar.NEXT(current);
element := calendar(current);
-- 批次插入百萬筆
FOR i IN 1..10000 LOOP
number_list(i) := i;
END LOOP;
FORALL i IN 1..number_list.COUNT
INSERT INTO bulk_numbers VALUES (number_list(i));
COMMIT;
-- 批次查回關聯陣列
SELECT number_id BULK COLLECT INTO number_list FROM bulk_numbers;
-- 列印首尾各兩筆驗證
BULK COLLECT 消除行級處理,減少 PL/SQL 與 SQL 引擎上下文切換;FORALL 批次發送 DML。ORDER BY 確保結果有序,否則隨機順序。