提取每个 table 中的记录数

Extracting number of records in each table

我想编写一个查询来检索特定所有者下存在的每个表中的行。我不太擅长编写查询,所以我无法在互联网上找到解决方案。我正在写的查询是:

SELECT TABLE_NAME, COUNT(*) FROM DBA_TABLES WHERE TABLE_NAME IN 
(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='ABC');

我知道查询是完全错误的,但我只是给出它让我知道我到底想要什么。我希望它有所帮助。我得到的错误是:

ORA-00937: not a single-group group function

请帮助我写出相同的确切查询。谢谢!

当您使用分组函数(计数)时,您必须将所有出现在 SELECT 而不是出现在分组函数中的列放在 GROUP BY 部分

SELECT TABLE_NAME, COUNT(*) 
FROM DBA_TABLES 
WHERE  OWNER='ABC'
GROUP BY TABLE_NAME;

但是这个查询 return 不会让您感兴趣。它不是行数。它是该架构中的表数。

Extracting number of records in each table

那你查询DBA_TABLES的方向就完全错了。它将为您提供用户拥有的 table 的计数,但不是每个 table.

中的行数

三种方式:

  • 在纯 SQL 中,table 名称必须是静态的。也就是说,您必须明确列出 table 个名称并获取计数。
SELECT COUNT(*) FROM table_1;
SELECT COUNT(*) FROM table_2;
SELECT COUNT(*) FROM table_3;
...
and so on...

使用好的文本编辑器,您可以快速完成。

  • 如果收集的统计数据是最新的,那么您可以依赖 NUM_ROWS in DBA_TABLES .无论如何,最好先使用 DBMS_STATS.
  • 收集统计信息
SQL> SELECT table_name, num_rows FROM dba_tables WHERE owner='SCOTT';

TABLE_NAME   NUM_ROWS
---------- ----------
CLASS               0
SALGRADE            5
BONUS               0
DEPT                4
EMP                14
  • 在 PL/SQL 中,遍历所有 table 名称,创建动态 sql 并使用 EXECUTE IMMEDIATE 执行 (ab)。

获取所有 table 的行数,可以使用一点 XML 魔法来完成:

select owner, 
       table_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||table_name||'"')),'/ROWSET/ROW/C')) as count
from dba_tables
where owner = 'ABC' 
  and iot_name is null; 

这会为每个 table 生成一个 select count(*) from ..,然后 "runs" 通过 dbms_xmlgen 并解析生成的 XML 输出以获取实际数字。

dbms_xmlgen documentation