我有一堆表,每个表都有一个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;
/
答案 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执行上述操作并在过程中执行它。