Если между таблицами, в которые вы вставляете таблицы, нет внешних ключей, это можно сделать одним оператором insert all
. (Оператор insert all
может завершиться ошибкой из-за нарушения ограничений внешнего ключа, поскольку он не гарантирует порядок таблиц, в которые он будет вставлен.)
Во-первых, вы можете записать свои операторы select в один запрос, например:
WITH t1 AS (SELECT 'a' col1, 'b' col2, 'c' col3, 10 col10, 11 col11, 12 col12 FROM dual UNION ALL
SELECT 'aa' col1, 'bb' col2, 'cc' col3, 20 col10, 21 col11, 22 col12 FROM dual UNION ALL
SELECT 'aaa' col1, 'b' col2, 'cc' col3, 30 col10, 31 col11, 42 col12 FROM dual),
t2 AS (SELECT 'a' col1, 'b' col2, 'c' col3, 100 col10, 111 col11, 122 col12 FROM dual UNION ALL
SELECT 'a' col1, 'bb' col2, 'cc' col3, 200 col10, 211 col11, 222 col12 FROM dual UNION ALL
SELECT 'a' col1, 'b' col2, 'cc' col3, 300 col10, 311 col11, 422 col12 FROM dual),
a AS (SELECT 't1' table_name, col1, col2, col3, col10, col11, col12 FROM t1
UNION ALL
SELECT 't2' table_name, col1, col2, col3, col10, col11, col12 FROM t2),
dummy AS (SELECT LEVEL id
FROM dual
CONNECT BY LEVEL <= 3)
SELECT table_name,
CASE WHEN d.id = 1 THEN 'col1'
WHEN d.id = 2 THEN 'col2'
WHEN d.id = 3 THEN 'col3'
END main_col,
CASE WHEN d.id = 1 THEN col1
WHEN d.id = 2 THEN col2
WHEN d.id = 3 THEN col3
END main_col_vals,
SUM(CASE WHEN d.id = 1 THEN col10
WHEN d.id = 2 THEN col11
WHEN d.id = 3 THEN col12
END) sum_vals
FROM a
CROSS JOIN dummy d
GROUP BY table_name,
CASE WHEN d.id = 1 THEN 'col1'
WHEN d.id = 2 THEN 'col2'
WHEN d.id = 3 THEN 'col3'
END,
CASE WHEN d.id = 1 THEN col1
WHEN d.id = 2 THEN col2
WHEN d.id = 3 THEN col3
END
ORDER BY table_name,
main_col,
main_col_vals;
При этом используется метод поворота старого стиля для поворота всех значений из всех таблиц в один go, помечая строки соответствующим именем таблицы.
Тогда это просто вопрос добавления этого в оператор вставки всех, например:
insert all
when table_name = 't1' then into
another_t1 (cola, val) values (main_col_vals, sum_vals)
when table_name = 't2' then into
another_t2 (cola, val) values (main_col_vals, sum_vals)
WITH a AS (SELECT 't1' table_name, col1, col2, col3, col10, col11, col12 FROM t1
UNION ALL
SELECT 't2' table_name, col1, col2, col3, col10, col11, col12 FROM t2),
dummy AS (SELECT LEVEL id
FROM dual
CONNECT BY LEVEL <= 3)
SELECT table_name,
CASE WHEN d.id = 1 THEN 'col1'
WHEN d.id = 2 THEN 'col2'
WHEN d.id = 3 THEN 'col3'
END main_col,
CASE WHEN d.id = 1 THEN col1
WHEN d.id = 2 THEN col2
WHEN d.id = 3 THEN col3
END main_col_vals,
SUM(CASE WHEN d.id = 1 THEN col10
WHEN d.id = 2 THEN col11
WHEN d.id = 3 THEN col12
END) sum_vals
FROM a
CROSS JOIN dummy d
GROUP BY table_name,
CASE WHEN d.id = 1 THEN 'col1'
WHEN d.id = 2 THEN 'col2'
WHEN d.id = 3 THEN 'col3'
END,
CASE WHEN d.id = 1 THEN col1
WHEN d.id = 2 THEN col2
WHEN d.id = 3 THEN col3
END;
Вот контрольный пример .