PL / SQL Oracle Выбор таблиц в базе данных по заданному диапазону дат c - PullRequest
1 голос
/ 03 апреля 2020

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

Точнее, таблицы в базе данных имеют одинаковые столбцы под названием MODIFY_DATE. Во-первых, я должен выяснить последние MODIFY_DATE каждой таблицы среди всех записей и посмотреть, будет ли это MODIFY_DATE в течение 60 дней с сегодняшнего дня.

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

Мой ожидаемый результат такой же, как .

Кто-нибудь знает заявление PL / SQL, чтобы сделать это?

Большое вам спасибо!

1 Ответ

4 голосов
/ 03 апреля 2020

Вам не нужно использовать динамический запрос c в блоке PL / SQL. Это можно сделать с помощью XMLQUERY следующим образом:

SELECT * FROM
(select table_name, DATE'1900-01-01' + 
  TO_NUMBER(xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml(
      'select max(' || column_name || ' - DATE''1900-01-01'') as c '
      || 'from "' || table_name || '" WHERE MODIFY_DATE >= trunc(SYSDATE) - 60')) -- name of the column here
  returning content)) as modify_date
from user_tab_columns
where column_name = 'MODIFY_DATE') -- name of the column here
WHERE modify_date IS NOT NULL;

Я проверил код в своей локальной БД, используя START_DATE в качестве имени столбца и 1000 дней в качестве ограничения, чтобы показать пример.

SQL> SELECT * FROM
  2  (select table_name, DATE'1900-01-01' +
  3    TO_NUMBER(xmlquery('/ROWSET/ROW/C/text()'
  4      passing xmltype(dbms_xmlgen.getxml(
  5        'select max(' || column_name || ' - DATE''1900-01-01'') as c '
  6        || 'from "' || table_name || '" WHERE START_DATE >= trunc(SYSDATE) - 1000'))
  7    returning content)) as modify_date
  8  from user_tab_columns
  9  where column_name = 'START_DATE')
 10  WHERE modify_date IS NOT NULL;

TABLE_NAME      MODIFY_DA
--------------- ---------
ACTIVE_USERS    21-NOV-19
YOUR_TABLE      03-JAN-20

SQL>
...