CREATE OR REPLACE FUNCTION update_valid_ldreg()
RETURNS TEXT AS $$
DECLARE
    r RECORD;
    v_err_count INT := 0;
    v_succ_count INT := 0;
    v_skip_count INT := 0;
BEGIN

    -- 테이블(lsmd_cont_ldreg)의 모든 데이터를 gid 기준으로 순회
    FOR r IN SELECT gid, geom FROM lsmd_cont_ldreg WHERE geom IS NOT NULL LOOP
        BEGIN
            -- [조건 추가] 기하 구조가 유효하지 않은(FALSE) 오류 데이터만 조준해서 업데이트
            IF ST_IsValid(r.geom) = FALSE THEN
                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;
            ELSE
                -- 이미 정상인 데이터는 아무 작업 없이 그냥 넘어감 (속도 향상의 핵심)
                v_skip_count := v_skip_count + 1;
            END IF;
            
        EXCEPTION WHEN OTHERS THEN
            -- ST_IsValid 검사나 UPDATE 도중 GEOS 에러가 터지면 로그를 남기고 패스
            INSERT INTO lsmd_cont_ldreg_err_log (bad_gid, err_msg) 
            VALUES (r.gid, SQLERRM);
            
            v_err_count := v_err_count + 1;
        END;
    END LOOP;
    
    -- 최종 결과를 텍스트로 반환
    RETURN '업데이트 완료! (수정성공: ' || v_succ_count || '건 / 정상패스: ' || v_skip_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건)';
END;
$$ LANGUAGE plpgsql;