-- 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;
/
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)