You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:42:33