Цикл по нескольким таблицам для выполнения одного и того же запроса - PullRequest
4 голосов
/ 16 марта 2011

У меня есть база данных, в которой за день создается таблица для регистрации экземпляров процесса. Таблицы помечены MESSAGE_LOG_YYYYMMDD

В настоящее время я хочу последовательно выполнить один и тот же запрос для всех этих таблиц. Я написал PL / SQL ниже, но застрял в строке 10. Как я могу успешно выполнить оператор SQL для всех таблиц здесь?

DECLARE
  CURSOR all_tables IS
    SELECT table_name
            FROM all_tables 
            WHERE TABLE_NAME like 'MESSAGE_LOG_2%' 
            ORDER BY TABLE_NAME ;

BEGIN
  FOR msglog IN all_tables LOOP
    SELECT count(*) FROM TABLE msglog.TABLE_NAME ;
  END LOOP;
END;
/

Ответы [ 4 ]

3 голосов
/ 16 марта 2011

Может быть лучше перестроить таблицу так, чтобы она представляла собой одну таблицу с ключевым столбцом в день для журнала процесса вместо отдельных таблиц.

При этом вы можете использовать динамический SQL:

DECLARE
  CURSOR all_tables IS
    SELECT table_name
            FROM all_tables 
            WHERE TABLE_NAME like 'MESSAGE_LOG_2%' 
            ORDER BY TABLE_NAME ;

  row_count pls_integer;
BEGIN
  FOR msglog IN all_tables LOOP
    EXECUTE IMMEDIATE "SELECT COUNT(*) FROM " || msglog.TABLE_NAME INTO row_count;
  END LOOP;
END;
/
1 голос
/ 16 марта 2011

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

в основном, внутри вашего цикла, создайте строку, представляющую запрос, который вы хотите выполнить, и используйте динамический SQL для его выполнения.

Чтобы сделать что-нибудь полезное, вы, вероятно, захотите вставить записи во временную таблицу, а затем выбрать упорядоченный по убыванию даты.

0 голосов
/ 17 марта 2011

Может быть, вы должны поместить все свои журналы в одну таблицу журналов, добавив один или два столбца, чтобы различать разные дни (возможно, столбец создал_дату или создан_ время_стамп, + любые другие идентификаторы, которые вы пожелаете)Вы можете даже настроить разбиение, если это необходимо.Просто кажется странным (и грязным) способом отслеживать журналы каждый день, создавая новую таблицу для журналов каждого дня.

0 голосов
/ 16 марта 2011

Используйте команду execute немедленно с buld collect в http://www.adp -gmbh.ch / ora / plsql / bc / execute_immediate.html . Объединяя ваши таблицы с union all, Oracle распознает union all для использования параллельных запросов http://www.dba -oracle.com / art_opq1.htm .

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