select sum(t.num_rows) from all_tables t where t.owner='111' and t.num_rows > 0这个语句对吗,我执行后明明数据库中有数据,怎么结果是空呢?
如果是对某个用户下的所有的表的话,可以用dbms_stats统计一下整个schema的信息,然后直接select sum(num_rows) from user_tables
select sum(t.num_rows) from all_tables t where t.owner='111' and t.num_rows > 0 -------------------- 上面这个语句需要先对表进行analyze 并且得到的信息为analyze时的数据,也就是非实时的数据。
--用ANALYZE是不好的,如果抽样分析不准确,如果要全部分析,有些大表是很慢的。 --再说了,统计数据是为了基于COST的优化,不是精确统计数据行的哈 --还是写一个函数吧,初步验证没问题哈 CREATE OR REPLACE FUNCTION calcrows(i_schema_name VARCHAR2) RETURN NUMBER IS v_sqlstr VARCHAR2(4000); v_totalrows NUMBER; v_temprows NUMBER; BEGIN v_totalrows := 0; FOR c IN (SELECT t.OBJECT_NAME FROM all_objects t WHERE t.OWNER = upper(i_schema_name) AND t.OBJECT_TYPE = 'TABLE') LOOP v_sqlstr := 'select count(*) from ' || c.object_name; BEGIN EXECUTE IMMEDIATE v_sqlstr INTO v_temprows; EXCEPTION WHEN OTHERS THEN v_temprows := 0; END; v_totalrows := v_totalrows + v_temprows; END LOOP; RETURN v_totalrows; END calcrows;
不需要all_objects,循环遍历all_tables,提取出所有表名(包括你有访问权的、其他用户的表)。
然后使用动态SQL拼凑sqr_str := 'select count(*) from '||table_name;将执行结果放进一个变量。每count一次,累加一次。最后得出总和,K.O!
SQL无法实现,必须借助PL/SQL。
要么all_tables里有num_rows字段,其值有表的行数,但这个只是统计分析的估计值,如果是大表,偏差很大!
from all_tables t where t.owner='111' and t.num_rows > 0这个语句对吗,我执行后明明数据库中有数据,怎么结果是空呢?
from all_tables t where t.owner='111' and t.num_rows > 0
--------------------
上面这个语句需要先对表进行analyze
并且得到的信息为analyze时的数据,也就是非实时的数据。
--再说了,统计数据是为了基于COST的优化,不是精确统计数据行的哈
--还是写一个函数吧,初步验证没问题哈
CREATE OR REPLACE FUNCTION calcrows(i_schema_name VARCHAR2) RETURN NUMBER IS
v_sqlstr VARCHAR2(4000);
v_totalrows NUMBER;
v_temprows NUMBER;
BEGIN
v_totalrows := 0;
FOR c IN (SELECT t.OBJECT_NAME
FROM all_objects t
WHERE t.OWNER = upper(i_schema_name) AND
t.OBJECT_TYPE = 'TABLE') LOOP
v_sqlstr := 'select count(*) from ' || c.object_name;
BEGIN
EXECUTE IMMEDIATE v_sqlstr
INTO v_temprows;
EXCEPTION
WHEN OTHERS THEN
v_temprows := 0;
END;
v_totalrows := v_totalrows + v_temprows;
END LOOP;
RETURN v_totalrows;
END calcrows;