获取架构中所有表的计数

Ram*_*Ram 35 oracle plsql

我试图获取模式中所有表的记录计数.我在编写PL/SQL时遇到问题.这是我到目前为止所做的,但我遇到了错误.请建议任何更改:

DECLARE
v_owner varchar2(40);
v_table_name varchar2(40);

cursor get_tables is
select distinct table_name,user
from user_tables
where lower(user) = 'SCHEMA_NAME';


begin

open get_tables;
fetch get_tables into v_table_name,v_owner;

    INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
    SELECT v_table_name,v_owner,COUNT(*),TO_DATE(SYSDATE,'DD-MON-YY') FROM         v_table_name;

CLOSE get_tables;

END;
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 54

这可以通过单个语句和一些XML魔术来完成:

select table_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||owner||'.'||table_name)),'/ROWSET/ROW/C')) as count
from all_tables
where owner = 'FOOBAR'
Run Code Online (Sandbox Code Playgroud)

  • 正是我需要的.:)很好的代码. (2认同)

Ton*_*ews 26

这应该这样做:

declare
    v_count integer;
begin

    for r in (select table_name, owner from all_tables
              where owner = 'SCHEMA_NAME') 
    loop
        execute immediate 'select count(*) from ' || r.table_name 
            into v_count;
        INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
        VALUES (r.table_name,r.owner,v_count,SYSDATE);
    end loop;

end;
Run Code Online (Sandbox Code Playgroud)

我从你的代码中删除了各种错误.

  • 建议的几个变体...我最近喜欢构造要在隐式游标的selet子句中执行的SQL,因为它允许您运行select并查看生成的语句.也可以将insert语句构造为动态SQL,并将insert和select组合成单个操作.只是几个选项...... (3认同)

Jon*_*ler 8

select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;
Run Code Online (Sandbox Code Playgroud)

这是检索行计数的最快方法,但有一些重要的注意事项:

  1. 如果使用ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE(默认值)在11g及更高版本中收集统计信息,或者在早期版本中使用,则NUM_ROWS仅100%准确ESTIMATE_PERCENT => 100.有关AUTO_SAMPLE_SIZE算法如何在11g中工作的解释,请参阅此文章.
  2. 结果产生LAST_ANALYZED,目前的结果可能不同.


Jör*_*örg 6

如果您想要用于Oracle的简单SQL(例如,具有不带XmlGen的XE),请执行简单的两步操作:

select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;
Run Code Online (Sandbox Code Playgroud)

复制整个结果,并用分号(';')替换最后一个UNION。然后,作为第二步,执行生成的SQL。