Задача Требуется вставить строки, возвращенные запросом, в несколько таблиц. Например, необходимо вставить строки из таблицы DEPT в таблицы DEPT_EAST, DEPT_WEST и DEPT_MID. Структура всех трех таблиц (количество и типы столбцов) такая же, как и у DEPT, и в настоящий момент они пусты.
Решение Решение – вставить результат запроса в необходимые таблицы. Отличие от «Копирования строк из одной таблицы в другую» состоит в том, что в данном случае имеется несколько таблиц на выходе. Используйте выражения INSERT ALL (вставить во все) или INSERTFIRST (вставить в первую). Синтаксис обоих выражений одинаковый, кроме ключевых слов ALL и FIRST. В следующем примере используется выражение INSERT ALL, что обеспечивает вставку во все возможные таблицы:
insert all when loc in ('NEW YORK','BOSTON') then into dept_east (deptno,dname,loc) values (deptno,dname,loc) when loc = 'CHICAGO' then into dept_mid (deptno,dname,loc) values (deptno,dname,loc) else into dept_west (deptno,dname,loc) values (deptno,dname,loc) select deptno,dname,loc from dept;
В Oracle для вставки данных в несколько таблиц используются блоки WHEN - THEN - ELSE, которые обеспечивают обработку строк, возвращаемых вложенным SELECT, и соответствующую их вставку. В примере данного рецепта выражения INSERT ALL and INSERT FIRST обеспечили бы один и тот же результат, но между ними есть отличие. INSERT FIRST завершит вычисление WHEN - THEN - ELSE, как только условие будет выполнено; INSERT ALL проверит все условия, даже если предыдущие условия выполнены. Таким образом, INSERT ALL может использоваться для вставки одной строки в несколько таблиц.
Источник: Молинаро Э. "SQL. Сборник рецептов"
|