2013-08-02

FORALL INDICES OF VALUES OF

DECLARE TYPE tbl IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; t tbl; idx_t tbl; i PLS_INTEGER; BEGIN -- Обычный FORALL работает только с плотными коллекциями. Если мы удалили элемент, то будет ошибка begin t(1) := 1; t(10) := 10; FORALL i IN t.FIRST .. t.last INSERT INTO a VALUES (t(i)); dbms_output.put_line('Обработано строк ' || SQL%ROWCOUNT); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Ошибка ' || SQLCODE || ' ' || SQLERRM); END; -- INDICES OF позволяет работать с sparse коллекциями. Синтаксис немного изменен begin t(1) := 1; t(10) := 10; FORALL i IN INDICES OF t INSERT INTO a VALUES (t(i)); dbms_output.put_line('Обработано строк ' || SQL%ROWCOUNT); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Ошибка ' || SQLCODE || ' ' || SQLERRM); END; -- VALUES OF позволяет бегать по одной коллекции, а работать с другой. При этом коллекция, по которой мы бегаем не должна быть плотной begin t(1) := 1; t(10) := 10; idx_t(1) := 1; idx_t(3) := 10; FORALL i IN VALUES OF idx_t INSERT INTO a VALUES (t(i)); dbms_output.put_line('Обработано строк ' || SQL%ROWCOUNT); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Ошибка ' || SQLCODE || ' ' || SQLERRM); END; END; / 

 Выводы
  1. Обычный FORALL работает только с плотными коллекциями. Если мы удалили элемент, то будет ошибка
  2. INDICES OF позволяет работать с sparse коллекциями. Синтаксис немного изменен
  3. ALUES OF позволяет бегать по одной коллекции, а работать с другой. При этом коллекция, по которой мы бегаем не должна быть плотной 

Комментариев нет: