CREATE OR REPLACE FUNCTION update_valid_ldreg()
RETURNS TEXT AS $$
DECLARE
    r RECORD;
    v_err_count INT := 0;
    v_succ_count INT := 0;
BEGIN
    -- 1. 건너뛴 필지를 기록할 로그 테이블이 없으면 자동으로 생성
    CREATE TABLE IF NOT EXISTS lsmd_cont_ldreg_err_log (
        log_time TIMESTAMP DEFAULT NOW(),
        bad_gid INT,
        err_msg TEXT
    );

    -- 2. lsmd_cont_ldreg 테이블의 모든 데이터를 gid 기준으로 순회
    FOR r IN SELECT gid, geom FROM lsmd_cont_ldreg WHERE geom IS NOT NULL LOOP
        BEGIN
            -- ST_SnapToGrid 없이 바로 ST_MakeValid 및 추출 수행
            UPDATE lsmd_cont_ldreg
            SET geom = ST_Multi(ST_CollectionExtract(ST_MakeValid(r.geom), 3))
            WHERE gid = r.gid;
            
            v_succ_count := v_succ_count + 1;
            
        EXCEPTION WHEN OTHERS THEN
            -- GEOS 에러 등이 발생하면 로그 테이블에 해당 gid와 에러 원인 기록 후 패스
            INSERT INTO lsmd_cont_ldreg_err_log (bad_gid, err_msg) 
            VALUES (r.gid, SQLERRM);
            
            v_err_count := v_err_count + 1;
            
            -- 루프 내부에서 즉시 로그가 기록되도록 개별 커밋 허용 관리 (PostgreSQL 환경에 따라 자동 처리)
            COMMIT;
        END;
    END LOOP;
    
    -- 최종 결과를 텍스트로 반환
    RETURN '업데이트 완료! (성공: ' || v_succ_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건) * lsmd_cont_ldreg_err_log 테이블에서 누락 ID 확인 가능';
END;
$$ LANGUAGE plpgsql;