PL/SQL 與 SQL 引擎上下文切換是性能瓶頸。BULK COLLECT 批量查詢,FORALL 批量 DML,可將切換次數從 N 次降為 1 次,性能提升數量級。
INDICES OF:處理稀疏數組(含間隙),僅遍歷已定義索引。VALUES OF:指定索引數組,靈活選取子集執行 DML。-- INDICES OF 示例
FORALL indx IN INDICES OF sparse_collection
INSERT INTO my_table VALUES sparse_collection(indx);
-- VALUES OF 示例
FORALL indx IN VALUES OF pointer_array
INSERT INTO my_table VALUES binding_array(indx);
FOR emp_rec IN (SELECT employee_id, salary, hire_date FROM employee WHERE department_id = dept_in) LOOP
IF comp_analysis.is_eligible(emp_rec.employee_id) THEN
UPDATE employee SET salary = newsal WHERE employee_id = emp_rec.employee_id;
ELSE
INSERT INTO employee_history ... VALUES (emp_rec.employee_id, emp_rec.salary, emp_rec.hire_date, 'RAISE DENIED');
END IF;
END LOOP;
employee_id、salary、hire_date 的關聯數組與嵌套表。SELECT ... BULK COLLECT INTO ... 一次性取出符合條件的所有員工信息。is_eligible,將符合/不符合條件的員工分別放入 approved_* 與 denied_* 集合(保持稀疏索引)。FORALL indx IN INDICES OF denied_employee_ids
INSERT INTO employee_history ... VALUES (denied_employee_ids(indx), denied_salaries(indx), denied_hire_dates(indx), 'RAISE DENIED');
FORALL indx IN INDICES OF approved_employee_ids
UPDATE employee SET salary = newsal WHERE employee_id = approved_employee_ids(indx);
%TYPE 或 %ROWTYPE,但 FORALL 不支持記錄集合直接操作,需拆分為標量集合。INDICES OF 避免 ORA-22160 異常。