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;
/