如何在以 NUM _ 开头的数据超过0条记录的模式中查找表。
例如: 考虑我是几个模式
Schema1具有表:
Schema2具有表:
Schema3具有表:
我只想获取Schema2表,其名称以 NUM _ 开头,并且有0条以上的记录。 即在这种情况下 NUM_table22
任何人都可以帮助实现这一目标吗?
答案 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