Oracle如何修改动态查询以同时统计Schema下每张表的行数与列数
修改后可同时返回表行数、列数的Oracle代码
原有逻辑稍作调整即可实现需求,核心通过Oracle系统视图all_tab_columns提前获取每张表的列数,无需额外执行动态SQL统计列数,性能更优。
完整可运行代码
CREATE table stats ( table_name VARCHAR2(128), num_rows NUMBER, num_cols NUMBER ); / DECLARE v_row_cnt integer; BEGIN for i in ( SELECT t.table_name, COUNT(c.column_id) as num_cols FROM all_tables t LEFT JOIN all_tab_columns c ON t.owner = c.owner AND t.table_name = c.table_name WHERE t.owner = 'YOUR_SCHEMA' -- 此处替换为实际要查询的Schema名称,Oracle默认存储为大写 GROUP BY t.table_name ) LOOP -- 动态查询表行数,双引号包裹避免表名含特殊字符、小写时执行报错 EXECUTE IMMEDIATE 'SELECT count(*) FROM "' || 'YOUR_SCHEMA' || '"."' || i.table_name || '"' INTO v_row_cnt; INSERT INTO stats VALUES (i.table_name, v_row_cnt, i.num_cols); END LOOP; COMMIT; END; /
调整说明
- 游标查询关联
all_tab_columns视图,提前统计每张表的列数,避免循环内重复查询系统表 - 原有
stats表已预留num_cols字段,无需修改建表逻辑 - 新增双引号包裹Schema名、表名,解决对象名含特殊字符、小写场景下的执行报错问题
- 新增
COMMIT语句,避免统计完成后数据未持久化到stats表
注意事项
- 代码中两处
YOUR_SCHEMA请统一替换为实际查询的Schema名称,若创建Schema时未特意使用双引号指定小写,请填写大写名称 - 若需处理权限不足无法查询部分表的场景,可在循环内增加异常捕获逻辑跳过报错表
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

