我想得到许多模式的所有表,每个表包含它包含的行数。我想要这样的东西:
SELECT OWNER, TABLE_NAME, COUNT(TABLE_NAME)
FROM DBA_USERS
WHERE OWNER IN ('TOTO', 'TITI');
我必须使用“/ as sysdba”来执行请求,这就是我尝试使用dba_users表的原因。 你知道为什么我能这样做吗?
感谢您的帮助,
史蒂夫
答案 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');
请注意,如果您的架构包含许多包含大量数据的表,则此查询可能需要一些时间才能执行。