DEV Community

Query Filter
Query Filter

Posted on

report

-- One-time script – just paste and run in SQL*Plus (or SQL Developer)
SET LINESIZE 200
SET PAGESIZE 1000
SET SERVEROUTPUT ON

COLUMN table_name       FORMAT A40
COLUMN rows_last_45     FORMAT 99999999999
COLUMN total_rows       FORMAT 99999999999
COLUMN pct              FORMAT 990.99

BEGIN
    DBMS_OUTPUT.PUT_LINE( RPAD('TABLE_NAME',41) ||
                          RPAD('ROWS_LAST_45_DAYS',20) ||
                          RPAD('TOTAL_ROWS (approx)',22) ||
                          '% OF TOTAL' );
    DBMS_OUTPUT.PUT_LINE( LPAD('-',110,'-') );

    FOR r IN (
        SELECT table_name
        FROM   user_tab_columns
        WHERE  column_name = 'INTERNTIMESTAMP'
          AND  data_type LIKE 'TIMESTAMP%'
        ORDER BY table_name
    )
    LOOP
        DECLARE
            v_cnt     NUMBER := 0;
            v_total   NUMBER := 0;
        BEGIN
            -- Exact count of rows from the last 45 days
            EXECUTE IMMEDIATE
                'SELECT COUNT(*) FROM ' || r.table_name ||
                ' WHERE INTERNTIMESTAMP >= SYSDATE - 45'
                INTO v_cnt;

            -- Approximate total rows from statistics (very fast)
            SELECT num_rows INTO v_total
            FROM   user_tables
            WHERE  table_name = r.table_name;

            -- Print result
            DBMS_OUTPUT.PUT_LINE(
                RPAD(r.table_name, 40) ||
                TO_CHAR(v_cnt, '999,999,999,999') || '   ' ||
                TO_CHAR(NVL(v_total,0), '999,999,999,999') || '   ' ||
                TO_CHAR(ROUND(v_cnt / GREATEST(v_total,1) * 100, 2), '9990.99') || '%'
            );
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(r.table_name || ' → error: ' || SQLERRM);
        END;
    END LOOP;
END;
/
Enter fullscreen mode Exit fullscreen mode

Top comments (0)