我试图获取模式中所有表的记录计数.我在编写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)
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)
我从你的代码中删除了各种错误.
select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;
Run Code Online (Sandbox Code Playgroud)
这是检索行计数的最快方法,但有一些重要的注意事项:
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE(默认值)在11g及更高版本中收集统计信息,或者在早期版本中使用,则NUM_ROWS仅100%准确ESTIMATE_PERCENT => 100.有关AUTO_SAMPLE_SIZE算法如何在11g中工作的解释,请参阅此文章.LAST_ANALYZED,目前的结果可能不同.如果您想要用于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。
| 归档时间: |
|
| 查看次数: |
87105 次 |
| 最近记录: |