Как объединить две или более неизвестных таблицы в одну таблицу в Oracle - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь объединить x одинаковых таблиц в одну таблицу.Причина, по которой мы это сделали, заключается в том, что мы хотим иметь, например, 50 столбцов на таблицу в базе данных.Таблицы создаются внешне с помощью программного обеспечения SCADA под названием Ignition.

Каждый раз, когда в базе данных создается таблица, мы хотим рассматривать данные как одну, независимо от того, из скольких таблиц получены данные, при условии, что все таблицы будут одинаковыми.например, первые три буквы: Table_1, Table_2, Table_3 .... и т. д.

Запрос / процедура, которую мы хотим получить, выглядит следующим образом: шаг 1: поскольку таблицы неизвестны, мы не можем сделать это с помощьюпростое объединение, вставка слиянием и т. д., поэтому мы должны найти все имя_таблицы с префиксом «Таблица».

ВЫБРАТЬ имя_таблицы ОТ всех_таблиц, где имя_таблицы похоже на «Таблица%»

шаг 2: это гдемагия начинается, она должна запросить один за другим каждое перечисленное имя таблицы в первом шаге, затем собрать все данные и объединить их в одну таблицу или представление.

Я пробовал много способов, используя PL / SQL, но не знаю, какперейдите к шагу 2. Есть ли способ получить то, чего мы хотим достичь?любые возможные решения будут великолепны!:)

Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Предполагая, что вы выбираете только общие столбцы из всех таблиц, вы можете создать динамическое представление, которое выполняет UNION ALL всех таблиц, начинающихся с префикса "Table".

DECLARE
     v_select   CLOB;
BEGIN
     SELECT
          LISTAGG('SELECT col1,col2,col3 FROM ' || table_name,
                  ' UNION ALL ' || CHR(10) ) WITHIN GROUP
          (
               ORDER BY table_name
          )
     INTO v_select
     FROM user_tables WHERE table_name LIKE 'TABLE_%';
     IF
          v_select IS NOT NULL
     THEN
          EXECUTE IMMEDIATE ' CREATE OR REPLACE VIEW v_all_tabs as ' || v_select;
     END IF;
END;
/

Затем выберите в представлении выполнение вышеуказанного блока (или вставьте его в процедуру) каждый раз, когда добавляется новая таблица.

select * from v_all_tabs;

Если существует вероятность того, что строка SQL превысит 4000 символов вместоодин LISTAGG, вы можете добавить каждый выбор с помощью простого присваивания в PL / SQL в цикле курсора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...