查找具有特定条件的表 - Oracle 12c
Find tables with specific criteria - 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
任何人都可以帮助实现这个目标吗?
我没有你的 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
如何在架构中查找以 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
任何人都可以帮助实现这个目标吗?
我没有你的 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