oracle查询所有表的准确记录数

本文介绍了一种在Oracle数据库中精确查询所有表行数的方法。通过定义游标遍历所有表并使用analyze语句更新统计信息,再获取每个表的实际行数。

今天oracle里面查询所有表的行数,刚开始用select t.table_name,t.num_rows from user_tables t查询后发现有个表记录数和实际单表查询结果不一致,后来发现
num_rows存储的是上次分析后的值,不准确,要使用该方法,必须分析后才可以试用
直接在查询窗口执行如下语句

declare
v_tName varchar(50);
v_sqlanalyze varchar(500);
v_num number;
v_sql varchar(500);
cursor c1 
is
select table_name from user_tables;
begin
open c1;
loop
fetch c1 into v_tName;
if c1%found then

v_sqlanalyze :='analyze table  '||v_tName||'  estimate statistics';
execute immediate v_sqlanalyze;
v_sql := 'select NUM_ROWS  from user_tables where table_name =upper('''||v_tName||''')';

execute immediate v_sql into  v_num;
dbms_output.put_line('表名: '||v_tName||' 行数: '||v_num);
else
exit;
end if;
end loop;
end;

在结果里成功查到准确的记录数

### 查询 Oracle 数据库中指定用户下所有的记录条数 在 Oracle 数据库中,若需查询某个用户下所有的数据行数统计,可以通过多种方式进行实现。以下是几种常见且有效的查询方法。 #### 使用 `DBA_TABLES` 视图查询行数 Oracle 提供了内置视图 `DBA_TABLES` 和 `USER_ALL_TABLES`,可用于获取的基本信息,包括 `NUM_ROWS` 字段,的大致行数。该字段的值来源于最近一次 `ANALYZE` 操作或自动收集统计信息的结果。 查询指定用户的及其行数: ```sql SELECT TABLE_NAME, NUM_ROWS FROM DBA_TABLES WHERE OWNER = 'USERNAME'; ``` 此语句返回用户名为 `USERNAME` 的用户下所有的名称及对应的行数。需要注意的是,使用 `DBA_TABLES` 需要相应的权限,普通用户可使用 `USER_ALL_TABLES` 替代[^1]。 #### 使用 PL/SQL 动态执行 COUNT 查询 如果需要实时精确地统计每张的行数,可以编写 PL/SQL 脚本动态执行 `COUNT(*)` 查询。以下是一个示例脚本,遍历指定用户下的所有并输出其行数: ```sql SET SERVEROUTPUT ON; DECLARE t_count NUMBER; v_sql VARCHAR2(1000); CURSOR tables_cursor IS SELECT owner || '.' || table_name AS full_name FROM dba_tables WHERE owner = 'USERNAME'; BEGIN FOR t IN tables_cursor LOOP v_sql := 'SELECT COUNT(*) FROM ' || t.full_name; EXECUTE IMMEDIATE v_sql INTO t_count; DBMS_OUTPUT.PUT_LINE(t.full_name || '=' || t_count); END LOOP; END; / ``` 该脚本通过游标遍历指定用户的所有,并对每张执行 `COUNT(*)` 查询,最后将结果打印出来。这种方式适用于需要准确计数的情况,但执行效率较低,尤其在数量较多时应谨慎使用[^2]。 #### 创建函数封装统计逻辑 为了提高复用性,可以创建一个函数来封装统计行数的逻辑。该函数接受名和所属用户作为参数,并返回该的行数: ```sql CREATE OR REPLACE FUNCTION count_rows(table_name IN VARCHAR2, owner IN VARCHAR2 DEFAULT NULL) RETURN NUMBER AUTHID CURRENT_USER IS num_rows NUMBER; stmt VARCHAR2(2000); BEGIN IF owner IS NULL THEN stmt := 'SELECT COUNT(*) FROM "' || table_name || '"'; ELSE stmt := 'SELECT COUNT(*) FROM "' || owner || '"."' || table_name || '"'; END IF; EXECUTE IMMEDIATE stmt INTO num_rows; RETURN num_rows; END; / ``` 使用该函数后,可以直接查询当前用户下所有的行数: ```sql SELECT TABLE_NAME, COUNT_ROWS(TABLE_NAME) AS ROW_COUNT FROM USER_TABLES; ``` 此方法提高了代码的可维护性和灵活性,适合集成到数据库管理工具中[^4]。 #### 使用 `ANALYZE` 更新统计信息后查询 如果只需要近似值而非实时精确值,可以通过 `ANALYZE` 命令更新统计信息后再查询 `USER_TABLES` 中的 `NUM_ROWS` 字段: ```sql DECLARE v_tName VARCHAR2(50); v_num NUMBER; v_sql VARCHAR2(500); CURSOR c1 IS SELECT TABLE_NAME FROM USER_TABLES; BEGIN OPEN c1; LOOP FETCH c1 INTO v_tName; EXIT WHEN c1%NOTFOUND; EXECUTE IMMEDIATE 'ANALYZE TABLE ' || v_tName || ' ESTIMATE STATISTICS'; EXECUTE IMMEDIATE 'SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = ''' || v_tName || '''' INTO v_num; DBMS_OUTPUT.PUT_LINE('名:' || v_tName || ' 行数:' || v_num); END LOOP; CLOSE c1; END; / ``` 此脚本会对每张执行 `ANALYZE` 操作以更新统计信息,然后从 `USER_TABLES` 中读取最新的行数。这种方式适用于定期统计任务,但频繁执行会影响性能[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值