В Oracle, как зациклить соединение all_tables, используя table_name - PullRequest
0 голосов
/ 10 мая 2018

У меня есть несколько таблиц, каждая из которых имеет столбец LOADED_TIMESTAMP. Я хочу использовать ALL_TABLE.TABLE_NAME, чтобы получить MAX(LOADED_TIMESTAMP) из всех таблиц 'F_', чтобы результат запроса, например,

tablename1   2018-05-10 17:33

tablename2   2018-05-04 00:13

tablename3   2018-03-23 08:44
...

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

Я гуглил / искал переполнение стека, но просто получаю ошибки (или «процедура PL / SQL успешно завершена», но безрезультатно!), Когда я пытаюсь выполнить код в SQL Developer ...

Начинаем ходить кругами; Любая помощь приветствуется. Вот SQL, который у меня есть на данный момент.

DECLARE 
  my_sql VARCHAR(1000); 
BEGIN 
  FOR t IN 
  ( 
         SELECT t.table_name, 
                t.owner 
         FROM   all_tables t 
         WHERE  owner = 'ME' 
         AND    Substr(t.table_name,1,2) IN ('A_', 
                                             'F_' , 
                                             'P_') ) 
  LOOP 
    my_sql := 'select max(dw_loaded_timestamp) as last_loaded from ' 
    || t.owner 
    || '.' 
    || t.table_name ; 
    EXECUTE IMMEDIATE my_sql; 
  END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
  dbms_output.Put_line('ERROR!! -- ' 
  || SQLCODE 
  || '-- ' 
  || SQLERRM 
  || ' --' ); 
END;
/

1 Ответ

0 голосов
/ 10 мая 2018

Если мы можем предположить, что это разовая вещь ... Мы можем использовать SQL для написания SQL, а затем выполнить результирующий набор после быстрого удаления всех последних объединений ..

SELECT 'SELECT max(LOADED_TIMESTAMP) as maxLoadedTimeStamp, ' 
       || chr(39) || TABLE_NAME || chr(39) || ' as srcTable '
       || 'FROM '|| table_Name || ' UNION ALL '
FROM all_tables 
WHERE owner = 'yourSchemaOwner' 
  and table_Name like 'F/_%';

Тогдаскопируйте / вставьте результаты и удалите последний UNION ALL из последнего оператора и выполните его.В приведенном выше / / перед _ это избежать;в противном случае это просто «любой символ», когда я предполагаю, что вы имеете в виду таблицы с именем «F_XXXX». YourschmeaOwner просто так ограничивает запрос вашей вашей схемы.

Предоставляя нам что-то вроде ...

SELECT max(LOADED_TIMESTAMP) as maxLoadedTimeStamp, 'F_xxx0' as srcTable FROM F_xxx0 UNION ALL 
SELECT max(LOADED_TIMESTAMP) as maxLoadedTimeStamp, 'F_xxx1' as srcTable FROM F_xxx1 UNION ALL 
SELECT max(LOADED_TIMESTAMP) as maxLoadedTimeStamp, 'F_xxx2' as srcTable FROM F_xxx2

и тогда ваши результаты будут:

F_xxx1 2018-05-10 17:33
F_xxx2 2018-05-04 00:13
F_xxx3 2018-03-23 08:44 ...

Если нет;сделать это через динамический SQL и выполнить его в процедуре.

...