FOR x IN (SELECT * FROM bc2) LOOP -- 10+ 萬
FOR y IN (SELECT * FROM temp) LOOP -- 20+ 萬
FOR z IN (SELECT * FROM disTemp) LOOP -- 20+ 萬
v_num := z.CODE;
END LOOP;
END LOOP;
END LOOP;
-- 複雜度 O(N*M*K) ≈ 10^15 次迴圈,執行數十小時
-- 1. 建立暫存表 (GTT,提交保留資料)
CREATE GLOBAL TEMPORARY TABLE tmp_dis_codes (code NUMBER) ON COMMIT PRESERVE ROWS;
-- 2. 批次載入 disTemp 符合條件的 CODE (單一 SQL)
INSERT INTO tmp_dis_codes
SELECT DISTINCT code FROM disTemp WHERE ...條件...;
-- 3. 建立索引加速 JOIN
CREATE INDEX idx_tmp_code ON tmp_dis_codes(code);
-- 4. 單一 MERGE/UPSERT 完成更新 (無循環)
MERGE INTO bc2 b
USING (
SELECT t.code, t.other_col
FROM tmp_dis_codes t
JOIN temp y ON y.key = t.code
WHERE y.cond = 'X'
) s ON (b.id = s.code)
WHEN MATCHED THEN UPDATE SET b.col = s.other_col;
-- 5. 提交
COMMIT;
DECLARE
TYPE code_arr IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
v_codes code_arr;
BEGIN
-- 批次讀取 (限制 10000 筆/批)
SELECT code BULK COLLECT INTO v_codes FROM disTemp WHERE ...;
FORALL i IN INDICES OF v_codes
UPDATE bc2 SET col = 'Y' WHERE id = v_codes(i);
COMMIT;
END;
遵循上述原則,原本數十小時的作業通常可壓縮至 **秒~分鐘級**。