在Oracle中,如何使用table_name循环遍历all_tables

时间:2018-05-10 18:11:00

标签: oracle loops tablename

我有一堆表,每个表都有一个LOADED_TIMESTAMP列。我想使用ALL_TABLE.TABLE_NAME从所有'F_'表中获取MAX(LOADED_TIMESTAMP),以便查询结果如下。

tablename1   2018-05-10 17:33

tablename2   2018-05-04 00:13

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

我想使用ALL_TABLES来执行此操作,以便在添加任何新表时,它们将自动包含在内。 我计划每天使用它将结果写入表中,因此我有每天加载每个表的历史记录

当我尝试在SQL Developer中执行代码时,我已经Google搜索/搜索了Stack Overflow,但我只是得到错误(或'PL / SQL过程已成功完成'但没有结果!)

开始绕圈;任何帮助将非常感激。 这是我目前获得的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 :(得分:0)

如果我们可以假设这是一次性的事情......我们可以使用SQL编写SQL,然后在快速删除最后一个union之后执行结果集..

require 'rspec/rails'

然后复制/粘贴结果并从最后一个语句中删除最后一个UNION ALL并执行它。在上面/之前_是逃避它;否则它只是"任何角色"当我假设你的意思是表名为' F_XXXX' YourschmeaOwner就是这样我们将查询限制在您的架构中。

给我们一些像......

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/_%';

然后您的结果将是:

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

如果没有;通过动态SQL执行上述操作并在过程中执行它。