首页 > 解决方案 > 查找具有特定条件的表 - Oracle 12c

问题描述

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

例如:考虑我是几个模式

  1. 架构1
  2. 模式2
  3. 架构3

Schema1 有表

Schema2 有表

Schema3 有表

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

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

标签: oracleoracle12c

解决方案


我没有您的表格(也不想创建表格),所以我将在另一个示例中展示它 -EMP在我的数据库中查找表格。

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

然后编写一个 PL/SQL 块,该块查看DBA_TABLES,搜索名称以 . 开头的表EMP。动态 SQL(即execute immediate)计算这些表中的行数,如果是正数,则将该表作为输出返回。

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>

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

  • 一个由 拥有HR,它的名字是EMPLOYEES并且包含 107 行
  • 另一个由 拥有SCOTT,其名称为EMP并且包含 14 行

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

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

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

and owner = 'SCHEMA2'

推荐阅读