Oracle 获取架构中所有表的计数

Oracle 获取架构中所有表的计数,oracle,plsql,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_tabl

我试图获取模式中所有表的记录计数。我在编写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;
这应该做到:

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;
我从你的代码中删除了各种错误


注意:为了方便其他读者,Oracle不提供名为
STATS\u table
的表,您需要创建它。

这可以通过一条语句和一些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'

您必须使用executeimmediate(动态sql)

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

  • 如果使用
    ESTIMATE\u PERCENT=>DBMS\u STATS.AUTO\u SAMPLE\u SIZE
    (默认值),或在早期版本中使用
    ESTIMATE\u PERCENT=>100,则NUM\u ROWS仅100%准确。请参阅,以了解如何进行的解释
    自动样本大小算法适用于11g
  • 结果是在上次分析时生成的,当前结果可能不同

  • 如果您想要Oracle的简单SQL(例如,让XE没有XmlGen),请执行简单的两步:

    select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;
    

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

    获取模式中所有表的计数,并按desc排序

    select 'with tmp(table_name, row_number) as (' from dual 
    union all 
    select 'select '''||table_name||''',count(*) from '||table_name||' union  ' from USER_TABLES 
    union all
    select 'select '''',0 from dual) select table_name,row_number from tmp order by row_number desc ;' from dual;
    

    复制整个结果并执行

    如果您发布错误,而不是试图让我们猜测,这将非常有用。幸运的是,你已经制作了一些经典的灯笼裤,所以这次游戏很简单。小错误:插入值中的l_count应该是v_count一些变化建议。。。我最近越来越喜欢在隐式游标的selet子句中构造要执行的SQL,因为它允许您运行select并查看生成的语句。还可以将insert语句构造为动态SQL,并将insert和select组合到单个操作中。只有两个选项…ORA-06550:第10行,第21列:PL/SQL:ORA-00942:表或视图不存在ORA-06550:第10行,第9列:PL/SQL:SQL语句ignoredI遇到了与@SherlockSpreadsheets相同的错误。@Benjamin也许您没有像OP那样的名为
    STATS\u table
    的表?这将是一个你自己创建的表格。如果有很多表格,我认为复制结果很耗时。完美答案。谢谢:)请注意,某些表|名称可能区分大小写,因此如果不将其用双引号括起来,内部查询可能会失败,例如,
    “从”| |所有者| |“中选择计数(1)c”。“| |表|名称|”
    可爱的东西。这是在Oracle 9上工作的唯一解决方案。
    select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;
    
    select 'with tmp(table_name, row_number) as (' from dual 
    union all 
    select 'select '''||table_name||''',count(*) from '||table_name||' union  ' from USER_TABLES 
    union all
    select 'select '''',0 from dual) select table_name,row_number from tmp order by row_number desc ;' from dual;