Sql 动态查询以查找oracle所有表中的所有表DML活动
嗨,我需要搜索模式中指定表列表的DML活动 单一查询Sql 动态查询以查找oracle所有表中的所有表DML活动,sql,oracle,plsql,dynamic-sql,dml,Sql,Oracle,Plsql,Dynamic Sql,Dml,嗨,我需要搜索模式中指定表列表的DML活动 单一查询 select max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM 'TABLE_NAME' 由于运行单个查询非常耗时且困难,因此我尝试准备一个动态sql,从所有表中获取max(ora_rowscn)、SCN_to_TIMESTAMP(max(ora_rowscn)),以便使用过滤器并选择一组表 查询模板 select 'with tmp(table_name, row_number)
select max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM 'TABLE_NAME'
由于运行单个查询非常耗时且困难,因此我尝试准备一个动态sql,从所有表中获取max(ora_rowscn)、SCN_to_TIMESTAMP(max(ora_rowscn)),以便使用过滤器并选择一组表
查询模板
select 'with tmp(table_name, row_number) as (' from dual
union all
select 'select '''||table_name||''',count(*) from '||table_name||' union ' from USER_TABLES
union all
select 'select '''',0 from dual) select table_name,row_number from tmp order by row_number desc ;' from dual;
如何对所有表使用max(ora_rowscn)、SCN_TO_时间戳(max(ora_rowscn))
有没有关于更正查询语法的建议?以下是我的建议。我不建议对所有表使用
SCN_TO_TIMESTAMP
,因为它会抛出很多ORA-01405
select 'with tmp(table_name, max_rscn, ct) as (' from dual
union all
select 'select '''||table_name||''',max(ora_rowscn), count(*) from '||table_name||' union ' from USER_TABLES
union all
select 'select '''',0,0 from dual) select table_name, max_rscn from tmp;' from dual;
您可以使用这样一个包含
executeimmediate
的PLSQL代码,以便通过动态SQL获得所需的值
SET SERVEROUTPUT ON
DECLARE
v_rowscn NUMBER;
v_tmstp TIMESTAMP;
BEGIN
FOR c IN
(SELECT t.table_name FROM user_tables t)
LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM '||
c.table_name INTO v_rowscn, v_tmstp;
DBMS_OUTPUT.PUT_LINE( c.table_name||' - max_scn : '|| v_rowscn||
' - max_scn_timestamp : '|| v_tmstp );
EXCEPTION WHEN others THEN DBMS_OUTPUT.PUT_LINE( sqlerrm );
END;
END LOOP;
END;
/
只要每个表都没有出现任何异常。@Kinfinity我需要从这两列中获取数据max(ora_rowscn)、SCN_to_TIMESTAMP(max(ora_rowscn)),非常感谢,但是如果我需要筛选模式和表列表,我不知道您的筛选规则,但只需添加WHERE条件来替换查询,例如
。。。如果表名像“R%”
为了只显示以字母R
@rakesh开头的表,为了进行测试,我已经对架构和表进行了筛选,匿名块也完成了,但是如何查看结果?在调用DBMS\u OUTPUT之前,您是否发出了打开了设置服务器输出。请将行@rakesh?oops i忘了说它现在可以工作了,一个问题是如何获得时间戳值?