oracle - 查找具有特定条件的表 - Oracle 12c
问题描述
如何在架构中查找以NUM_开头且数据多于 0 条记录的表。
例如:考虑我是几个模式
- 架构1
- 模式2
- 架构3
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
任何人都可以帮助实现这一目标吗?
解决方案
我没有您的表格(也不想创建表格),所以我将在另一个示例中展示它 -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_tables
all_tables
where
或者,如果您想在该代码中选择用户,您可以在子句中添加另一个条件(第 6 行):
and owner = 'SCHEMA2'