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;
/
Выводы
- Обычный FORALL работает только с плотными коллекциями. Если мы удалили элемент, то будет ошибка
- INDICES OF позволяет работать с sparse коллекциями. Синтаксис немного изменен
- ALUES OF позволяет бегать по одной коллекции, а работать с другой. При этом коллекция, по которой мы бегаем не должна быть плотной
Комментариев нет:
Отправить комментарий