-- 创建全局临时表(只创建一次)
CREATE GLOBAL TEMPORARY TABLE T_SUM (
OWNER VARCHAR(128), --用户名
TAB_NAME VARCHAR(512), --表名
ROW_NUM INT --数据量
) ON COMMIT DELETE ROWS;
-- 下面可重复执行查询表中数据量
COMMIT;
DECLARE
T_SUM INT;
SQL_TEXT VARCHAR(1000);
-- ========== 【关键控制参数】==========
--查询指定某个用户或模式里面的表; 查询多个用户或模式里面表,需要修改下面V_USER条件
V_USER VARCHAR(128):= 'SYSDBA';
-- 可选值: 'ALL' 全部 | 'WITH_LOB' 含大字段 | 'WITHOUT_LOB' 不含大字段
MODE_FLAG VARCHAR(20) := 'WITH_LOB';
-- ===================================
-- 游标类型(用于动态打开不同查询)
TYPE TABLE_CURSOR_TYPE IS REF CURSOR;
TABLE_CUR TABLE_CURSOR_TYPE;
-- 游标返回的记录结构
V_OWNER VARCHAR(128);
V_TAB_NAME VARCHAR(512);
BEGIN
T_SUM := 0;
-- 根据 MODE_FLAG 动态选择要遍历的表集合
IF MODE_FLAG = 'ALL' THEN
OPEN TABLE_CUR FOR
SELECT OWNER, TABLE_NAME
FROM ALL_TABLES
WHERE
OWNER IN V_USER
--OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB')
ORDER BY TABLE_NAME;
ELSIF MODE_FLAG = 'WITH_LOB' THEN
OPEN TABLE_CUR FOR
SELECT DISTINCT ATC.OWNER, ATC.TABLE_NAME
FROM ALL_TAB_COLUMNS ATC
WHERE
ATC.OWNER IN V_USER
--ATC.OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB')
AND ATC.DATA_TYPE IN (
'TEXT', 'CLOB', 'NCLOB', 'BLOB', 'IMAGE', 'LONG',
'LONGVARCHAR','LONGVARBINARY'
)
ORDER BY ATC.TABLE_NAME;
ELSIF MODE_FLAG = 'WITHOUT_LOB' THEN
OPEN TABLE_CUR FOR
SELECT AT.OWNER, AT.TABLE_NAME
FROM ALL_TABLES AT
WHERE
AT.OWNER IN V_USER
--AT.OWNER NOT IN ('SYS','SYSSSO','SYSDBA','SYSJOB')
AND NOT EXISTS (
SELECT 1
FROM ALL_TAB_COLUMNS ATC
WHERE ATC.OWNER = AT.OWNER
AND ATC.TABLE_NAME = AT.TABLE_NAME
AND ATC.DATA_TYPE IN (
'TEXT', 'CLOB', 'NCLOB', 'BLOB', 'IMAGE', 'LONG',
'LONGVARCHAR','LONGVARBINARY'
)
)
ORDER BY AT.TABLE_NAME;
ELSE
RAISE_APPLICATION_ERROR(-20001, 'INVALID MODE_FLAG. USE: ALL / WITH_LOB / WITHOUT_LOB');
END IF;
-- 遍历游标中的每张表
LOOP
FETCH TABLE_CUR INTO V_OWNER, V_TAB_NAME;
EXIT WHEN TABLE_CUR%NOTFOUND;
-- 构造安全的 COUNT 查询(双引号包裹表名)
SQL_TEXT := 'SELECT COUNT(1) FROM "' || V_OWNER || '"."' || V_TAB_NAME || '"';
EXECUTE IMMEDIATE SQL_TEXT INTO T_SUM;
INSERT INTO T_SUM (OWNER, TAB_NAME, ROW_NUM)
VALUES (V_OWNER, V_TAB_NAME, T_SUM);
END LOOP;
CLOSE TABLE_CUR;
END;
/
-- 查询结果
SELECT OWNER AS _USER, SUM(ROW_NUM) AS _ROWS
FROM T_SUM
GROUP BY OWNER ;
SELECT * FROM T_SUM
ORDER BY ROW_NUM DESC,OWNER, TAB_NAME;
文章
阅读量
获赞
