查找具有特定条件的表 - Oracle 12c

Find tables with specific criteria - Oracle 12c

如何在架构中查找以 NUM_ 开头且数据超过 0 条记录的表。

例如: 考虑我是几个模式

  1. 架构 1
  2. 架构 2
  3. 架构 3

Schema1 有表:

Schema2 有表:

Schema3 有表:

我只想获取 Schema2 表,其名称以 NUM_ 开头并且有超过 0 条记录。 即,在这种情况下 NUM_table22

任何人都可以帮助实现这个目标吗?

我没有你的 table(我也不想创建),所以我会在另一个例子中展示它 - 寻找 EMP tables 遍及我的数据库。

以特权用户身份连接,该用户有权访问 DBA_TABLES(因为您想搜索 所有 用户,对吗?)。其中之一是 SYS,如果您没有其他的话。

然后编写一个 PL/SQL 块来查看 DBA_TABLES,搜索名称以 EMP 开头的 table。动态 SQL(即 execute immediate)计算那些 table 中的行,并且 - 如果它是一个正数 - returns 即 table 作为输出。

SQL> show user
USER is "SYS"
SQL> set serveroutput on
SQL>
SQL> declare
  2    l_cnt number;
  3  begin
  4    for cur_r in (select owner, table_name
  5                  from dba_tables
  6                  where table_name like 'EMP%'
  7                 )
  8    loop
  9      execute immediate 'select count(*) from ' || cur_r.owner ||'.'||
 10                         cur_r.table_name into l_cnt;
 11      if l_cnt > 0 then
 12         dbms_output.put_line(cur_r.owner ||'.'|| cur_r.table_name ||' = ' || l_cnt);
 13      end if;
 14    end loop;
 15  end;
 16  /
HR.EMPLOYEES = 107
SCOTT.EMP = 14

PL/SQL procedure successfully completed.

SQL>

在我的数据库中,有两个这样的 tables:

  • 一个归 HR 所有,它的名字是 EMPLOYEES 并且包含 107 行
  • 另一个归 SCOTT 所有,它的名字是 EMP 并且包含 14 行

我相信您在根据需要调整该代码时应该没有任何问题。

我不确定您为什么只想通过 schema2 进行搜索;在这种情况下,以 schema2 身份连接并使用 user_tables(或 all_tables)完成相同的工作会更简单(因此您不必以特权用户身份连接)。

或者,如果您想在该代码中选择用户,您需要在 where 子句(第 6 行)中添加另一个条件:

and owner = 'SCHEMA2'

Littlefoot 的回答可能有效,但可能需要更长的时间。假设已经收集了以下 SQL 的统计数据,应该可以更快地满足您的需求。如果统计数据不新鲜,则可能会给出错误的结果。

select * from DBA_TABLES where TABLE_NAME like 'NUM_%' and NUM_ROWS > 0