Oracle Request选择具有行数的模式的所有表

时间:2014-01-16 15:11:51

标签: sql oracle

我想得到许多模式的所有表,每个表包含它包含的行数。我想要这样的东西:

SELECT OWNER, TABLE_NAME, COUNT(TABLE_NAME)
FROM DBA_USERS
WHERE OWNER IN ('TOTO', 'TITI');

我必须使用“/ as sysdba”来执行请求,这就是我尝试使用dba_users表的原因。 你知道为什么我能这样做吗?

感谢您的帮助,

史蒂夫

1 个答案:

答案 0 :(得分:0)

使用

SELECT OWNER, TABLE_NAME, NUM_ROWS
FROM DBA_TABLES
WHERE OWNER IN ('TOTO', 'TITI');

SYS用户不需要,您只需要SELECT ANY DICTIONARY权限。

注意:列NUM_ROWS不一定显示确切的行数,而只是基于收集的统计信息的数字。为了获得每个表的确切数字,您必须编写动态SQL语句。

<强>更新

对于准确计数,您可以创建一个函数:

CREATE FUNCTION COUNT_ROWS(TABLE_NAME IN VARCHAR2) RETURN NUMBER IS
   res NUMBER;
BEGIN
   EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME INTO res;
   RETURN res;
END COUNT_ROWS;
/

SELECT OWNER, TABLE_NAME, NUM_ROWS, Count_rows(OWNER||'.'||TABLE_NAME) as num_rows_exact
FROM DBA_TABLES
WHERE OWNER IN ('TOTO', 'TITI');

请注意,如果您的架构包含许多包含大量数据的表,则此查询可能需要一些时间才能执行。