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

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

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

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

Кто-нибудь знает инструкцию PL/SQL для этого?

Спасибо огромное!

1
Sunny 3 Апр 2020 в 06:01
Возможно, вам придется использовать системные таблицы и динамический SQL для достижения результатов, которые я думаю
 – 
Avi
3 Апр 2020 в 06:04
Не могли бы вы объяснить больше? Самое сложное, с чем я сталкиваюсь, это то, что имя таблицы не совпадает с записью таблицы в запросе. Спасибо
 – 
Sunny
3 Апр 2020 в 06:12
Вы говорите, что в таблице базы данных PPL_ID есть столбец с именем MODIFY_DATE?
 – 
Abra
3 Апр 2020 в 06:15
Да, во всех таблицах базы данных есть столбец с именем MODIFY_DATE.
 – 
Sunny
3 Апр 2020 в 06:23
1
Avi – это комментарий. отвечать. Используйте динамический SQL для запроса каждой таблицы и получения имен таблиц. из словаря данных Oracle
 – 
Abra
3 Апр 2020 в 06:34

1 ответ

Вам не нужно использовать динамический запрос в блоке 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>
4
Popeye 3 Апр 2020 в 06:52
1
Здорово, это здорово. Я не знал об этом xml в оракуле.
 – 
Avi
3 Апр 2020 в 07:01
Спасибо, Теджаш! Я попробовал ваш код, он работает, но ожидаемого результата нет. Я думаю, это потому, что эти таблицы не принадлежат мне, но я могу получить к ним доступ. Я попытался изменить user_tab_columns на all_tab_columns, и это показывает сообщение об ошибке. Ты знаешь почему?
 – 
Sunny
3 Апр 2020 в 08:22
Хорошо, тогда вам нужно использовать таблицу all_tab_columns, а также || 'from "' || table_name || '" WHERE следует заменить на || 'from "' || owner || '"."' || table_name || '" WHERE
 – 
Popeye
3 Апр 2020 в 08:52
Это выглядит идеально, но я все еще не могу получить ожидаемый результат, я даже пытался включить OWNER='HR', чтобы убедиться, что он работает, но появилось следующее сообщение: ORA-01722: недопустимый номер 01722. 00000 - "недопустимый номер" * Причина: Указанный номер недействителен. *Действие: Укажите действительный номер.
 – 
Sunny
3 Апр 2020 в 09:09
Не могли бы вы поделиться точным запросом, который вы выполняете?
 – 
Popeye
3 Апр 2020 в 09:31