どちらがよりパフォーマンスが高いか。
バージョン 1の使用Cursor For Loop
DECLARE
total_val number(6);
CURSOR c1 IS
SELECT * FROM emp
;
BEGIN
total_val := 0;
FOR emp_rec IN c1
LOOP
total_val := total_val + emp_rec.sal;
END LOOP;
DBMS_OUTPUT.PUT_LINE('TOTAL SALARIES: ' || total_val);
END;
バージョン 2では、最初Bulk Collect
にすべての行を PLSQL コレクションに取得し、それを反復処理します。
DECLARE
total_val number(6);
CURSOR c1 IS
SELECT * FROM emp
;
TYPE emp_recs_type IS TABLE OF emp%ROWTYPE;
emp_recs emp_recs_type;
BEGIN
total_val := 0;
OPEN c1;
FETCH c1 BULK COLLECT INTO emp_recs;
CLOSE c1;
FOR l_index IN emp_recs.FIRST..emp_recs.LAST
LOOP
total_val := total_val + emp_recs(l_index).sal;
END LOOP;
DBMS_OUTPUT.PUT_LINE('TOTAL SALARIES: ' || total_val);
END;
Cursor
は多くの行を返す可能性があり、数万行以上になる可能性があると想定してください。