CREATE OR REPLACE PROCEDURE SHRINK_TABLE_AND_REPORT(p_table_name IN VARCHAR2) IS v_pre_size_mb NUMBER; v_post_size_mb NUMBER; v_saved_mb NUMBER; BEGIN -- 리로그 전 사이즈 측정 SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2) INTO v_pre_size_mb FROM USER_SEGMENTS WHERE SEGMENT_NAME = UPPER(p_table_name) AND SEGMENT_TYPE = 'TABLE'; DBMS_OUTPUT.PUT_LINE('리로그 전 사이즈: ' || v_pre_size_mb || ' MB'); -- 행 이동 허용 설정 EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ENABLE ROW MOVEMENT'; -- SHRINK SPACE 실행 EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' SHRINK SPACE'; -- 행 이동 설정 복구 EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' DISABLE ROW MOVEMENT'; -- 리로그 후 사이즈 측정 SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2) INTO v_post_size_mb FROM USER_SEGMENTS WHERE SEGMENT_NAME = UPPER(p_table_name) AND SEGMENT_TYPE = 'TABLE'; DBMS_OUTPUT.PUT_LINE('📉 리로그 후 사이즈: ' || v_post_size_mb || ' MB'); -- 절감된 공간 계산 v_saved_mb := v_pre_size_mb - v_post_size_mb; DBMS_OUTPUT.PUT_LINE('절감된 공간: ' || ROUND(v_saved_mb, 2) || ' MB'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('오류 발생: ' || SQLERRM); END; /