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

时间:2019-12-27 06:51:05

标签: oracle oracle12c

如何在以 NUM _ 开头的数据超过0条记录的模式中查找表。

例如: 考虑我是几个模式

  1. Schema1
  2. Schema2
  3. Schema3

Schema1具有表

  • NUM_table11(有0条记录)
  • NUM_table12(有20条记录)
  • DummyTable1(有10条记录)

Schema2具有表

  • NUM_table21(有0条记录)
  • NUM_table22(有20条记录)
  • DummyTable2(有10条记录)

Schema3具有表

  • NUM_table31(有0条记录)
  • NUM_table32(有20条记录)
  • DummyTable3(有10条记录)

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

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

2 个答案:

答案 0 :(得分:0)

我没有您的表(也不希望创建任何表),因此我将在另一个示例中进行展示-在整个数据库中查找EMP表。

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

然后编写一个查看DBA_TABLES的PL / SQL块,搜索名称以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进行搜索;在这种情况下,以schema2连接并使用user_tables(或all_tables)执行相同的工作会更简单(因此您不必以特权用户身份进行连接)。

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

and owner = 'SCHEMA2'

答案 1 :(得分:0)

Littlefoot的答案会起作用,但可能需要更长的时间。假设已收集统计信息,则以下SQL应该可以为您提供所需的信息,并且速度更快。如果统计数据不是最新的,那么可能会给出错误的结果。

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