Итак, результатом этой операции будет 3 новые таблицы? T_A_AGGREGATE
, T_B_AGGREGATE
и T_C_AGGREGATE
?
Я думаю, что самый быстрый способ - написать 3 отдельных оператора CREATE TABLE
, например.
create table t_a_aggregate as
select id, sum(factor * amount) suma
from t_a
where some_condition
group by id;
create table t_b_aggregate as
select id, sum(factor * amount) suma
from t_b
where some_condition
group by id;
create table t_c_aggregate as
select id, sum(factor * amount) suma
from t_c
where some_condition
group by id;
ХОРОШО; Я понимаю, что запросы не такие уж простые, но особо ничего не меняется - только имена таблиц в CREATE
и FROM
(возможно, где-то еще, но это более-менее). Возможности поиска/замены любого приличного текстового редактора должны быть в состоянии сделать это быстро.
Если вы хотите сделать это динамически в цикле (читай: PL/SQL), вы можете, но динамический SQL не масштабируется, его сложно поддерживать и сложно отлаживать. Поэтому, если вы делаете это только один раз, рассмотрите возможность запуска 3 отдельных инструкций.
Как это сделать динамически?
Вам нужно будет создать строку (мы обычно помещаем их в локально объявленную переменную), содержащую весь оператор DDL. Почему? Потому что иначе вы не сможете выполнить DDL из PL/SQL.
Если задействовано несколько таблиц и/или столбцов, вам придется объединить фиксированные части оператора (например, create table
, select
, from
, order by
) с динамическими частями, такими как имена столбцов. Обратите внимание, что между ними вы должны соединить запятые в качестве разделителей. Обратите внимание на использование нескольких одинарных кавычек, так как вам нужно экранировать их (или использовать механизм q-цитирования).
Кроме того, для нескольких столбцов вам, вероятно, придется делать это в цикле, объединяя каждый новый столбец с ранее составленной строкой.
Это (оператор, хранящийся в переменной) выполняется EXECUTE IMMEDIATE
. Если правильно написать, то получится. В противном случае произойдет сбой, но он не сообщит вам, почему сбой (именно поэтому я сказал о сложной отладке).
Поэтому вместо выполнения мы обычно отображаем эту строку (используя dbms_output.put_line
), чтобы увидеть, как она выглядит, и — используя копирование/вставку — пытаемся выполнить ее.
По сути, он может быть довольно сложным и, как я уже сказал, трудным в обслуживании и отладке.
person
Littlefoot
schedule
28.09.2020