我正在尝试获取架构中所有表的记录计数。我在编写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;
答案 0 :(得分:50)
这可以通过单个语句和一些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'
答案 1 :(得分:23)
这应该这样做:
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;
我从您的代码中删除了各种错误。
答案 2 :(得分:7)
select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;
这是检索行数的最快方法,但有一些重要的注意事项:
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE
(默认值)收集11g及以上的统计信息,或者使用ESTIMATE_PERCENT => 100
的早期版本收集统计信息,则NUM_ROWS仅100%准确。有关如何解释,请参阅this post
AUTO_SAMPLE_SIZE算法适用于11g。LAST_ANALYZED
生成,目前的结果可能不同。答案 3 :(得分:5)
如果您想要简单的Oracle for Oracle(例如,让XE没有XmlGen),那就去做一个简单的两步:
select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;
复制整个结果并用分号(';')替换最后一个UNION。然后在第二步执行生成的SQL。
答案 4 :(得分:1)
你必须使用execute immediate(动态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;
loop
fetch get_tables into v_table_name,v_owner;
EXIT WHEN get_tables%NOTFOUND;
execute immediate '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;
end loop;
CLOSE get_tables;
END;
答案 5 :(得分:0)
通过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;
复制整个结果并执行