Oracle按日期统计指定用户下所有表的符合条件记录数
解决方案
要实现按日期过滤统计所有者匹配%noob%的表中,APPL_REC_LAST_UPD_DT在指定日期当天或之前的记录数,核心是动态遍历符合条件的表并执行带日期过滤的统计,以下分主流数据库场景给出具体实现:
1. Oracle 数据库实现
方式一:PL/SQL批量统计输出
DECLARE v_target_date DATE := TO_DATE('2023-12-20', 'YYYY-MM-DD'); v_table_name VARCHAR2(128); v_count NUMBER; BEGIN -- 筛选所有者匹配%noob%且包含目标列的表 FOR rec IN ( SELECT t.table_name FROM all_tables t JOIN all_tab_columns c ON t.owner = c.owner AND t.table_name = c.table_name WHERE t.owner LIKE '%NOOB%' AND c.column_name = 'APPL_REC_LAST_UPD_DT' ORDER BY t.table_name ) LOOP -- 动态执行带日期过滤的统计 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || rec.table_name || ' WHERE APPL_REC_LAST_UPD_DT <= :1' INTO v_count USING v_target_date; -- 输出单表统计结果 DBMS_OUTPUT.PUT_LINE('表 ' || rec.table_name || ' 符合条件的记录数:' || v_count); END LOOP; END; /
方式二:生成静态UNION ALL查询一次性执行
如果需要直接获取所有表的统计明细集合,可先生成拼接好的查询语句:
SELECT 'SELECT ''' || table_name || ''' AS table_name, COUNT(*) AS qualified_rows FROM ' || table_name || ' WHERE APPL_REC_LAST_UPD_DT <= DATE ''2023-12-20''' || CASE WHEN ROWNUM != (SELECT COUNT(*) FROM ( SELECT t.table_name FROM all_tables t JOIN all_tab_columns c ON t.owner = c.owner AND t.table_name = c.table_name WHERE t.owner LIKE '%NOOB%' AND c.column_name = 'APPL_REC_LAST_UPD_DT' )) THEN ' UNION ALL ' ELSE '' END FROM ( SELECT t.table_name FROM all_tables t JOIN all_tab_columns c ON t.owner = c.owner AND t.table_name = c.table_name WHERE t.owner LIKE '%NOOB%' AND c.column_name = 'APPL_REC_LAST_UPD_DT' )
将上述查询的结果复制执行,即可得到所有目标表的统计明细。
2. PostgreSQL 数据库实现
DO $$ DECLARE v_target_date DATE := '2023-12-20'::DATE; v_rec RECORD; v_count INTEGER; BEGIN FOR v_rec IN ( SELECT table_name FROM information_schema.tables t JOIN information_schema.columns c ON t.table_schema = c.table_schema AND t.table_name = c.table_name WHERE t.table_schema LIKE '%noob%' AND c.column_name = 'APPL_REC_LAST_UPD_DT' ) LOOP EXECUTE format('SELECT COUNT(*) FROM %I WHERE APPL_REC_LAST_UPD_DT <= $1', v_rec.table_name) INTO v_count USING v_target_date; RAISE NOTICE '表 % 符合条件的记录数:%', v_rec.table_name, v_count; END LOOP; END $$;
关键注意事项
- 安全与兼容:使用绑定变量(如
USING子句、$1占位符)避免SQL注入,同时保证日期格式与数据库兼容。 - 权限检查:确保当前用户有权限访问目标所有者的表,以及数据字典视图(如
ALL_TABLES、information_schema)。 - 空数据处理:若表中无符合条件的记录,统计结果会显示
0,无需额外逻辑处理。
内容的提问来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

