OGG revidoval tento gist . Přejít na revizi
1 file changed, 4 insertions
\354\230\244\353\245\230\353\241\234 \352\262\200\354\266\234\353\220\234 \355\225\204\354\247\200\353\212\224 \353\224\260\353\241\234 \354\262\230\353\246\254.sql" (vytvořil soubor)
| @@ -0,0 +1,4 @@ | |||
| 1 | + | UPDATE lsmd_cont_ldreg t | |
| 2 | + | SET geom = ST_Multi(ST_CollectionExtract(ST_Buffer(t.geom, 0.0), 3)) | |
| 3 | + | FROM lsmd_cont_ldreg_err_log log | |
| 4 | + | WHERE t.gid = log.bad_gid; | |
OGG revidoval tento gist . Přejít na revizi
1 file changed, 15 insertions, 18 deletions
\354\227\260\354\206\215\354\247\200\354\240\201\353\217\204 \354\230\244\353\245\230\355\225\204\354\247\200 \353\263\264\354\240\225.sql"
| @@ -4,37 +4,34 @@ DECLARE | |||
| 4 | 4 | r RECORD; | |
| 5 | 5 | v_err_count INT := 0; | |
| 6 | 6 | v_succ_count INT := 0; | |
| 7 | + | v_skip_count INT := 0; | |
| 7 | 8 | BEGIN | |
| 8 | - | -- 1. 건너뛴 필지를 기록할 로그 테이블이 없으면 자동으로 생성 | |
| 9 | - | CREATE TABLE IF NOT EXISTS lsmd_cont_ldreg_err_log ( | |
| 10 | - | log_time TIMESTAMP DEFAULT NOW(), | |
| 11 | - | bad_gid INT, | |
| 12 | - | err_msg TEXT | |
| 13 | - | ); | |
| 14 | 9 | ||
| 15 | - | -- 2. lsmd_cont_ldreg 테이블의 모든 데이터를 gid 기준으로 순회 | |
| 10 | + | -- 테이블(lsmd_cont_ldreg)의 모든 데이터를 gid 기준으로 순회 | |
| 16 | 11 | FOR r IN SELECT gid, geom FROM lsmd_cont_ldreg WHERE geom IS NOT NULL LOOP | |
| 17 | 12 | BEGIN | |
| 18 | - | -- ST_SnapToGrid 없이 바로 ST_MakeValid 및 추출 수행 | |
| 19 | - | UPDATE lsmd_cont_ldreg | |
| 20 | - | SET geom = ST_Multi(ST_CollectionExtract(ST_MakeValid(r.geom), 3)) | |
| 21 | - | WHERE gid = r.gid; | |
| 22 | - | ||
| 23 | - | v_succ_count := v_succ_count + 1; | |
| 13 | + | -- [조건 추가] 기하 구조가 유효하지 않은(FALSE) 오류 데이터만 조준해서 업데이트 | |
| 14 | + | IF ST_IsValid(r.geom) = FALSE THEN | |
| 15 | + | UPDATE lsmd_cont_ldreg | |
| 16 | + | SET geom = ST_Multi(ST_CollectionExtract(ST_MakeValid(r.geom), 3)) | |
| 17 | + | WHERE gid = r.gid; | |
| 18 | + | ||
| 19 | + | v_succ_count := v_succ_count + 1; | |
| 20 | + | ELSE | |
| 21 | + | -- 이미 정상인 데이터는 아무 작업 없이 그냥 넘어감 (속도 향상의 핵심) | |
| 22 | + | v_skip_count := v_skip_count + 1; | |
| 23 | + | END IF; | |
| 24 | 24 | ||
| 25 | 25 | EXCEPTION WHEN OTHERS THEN | |
| 26 | - | -- GEOS 에러 등이 발생하면 로그 테이블에 해당 gid와 에러 원인 기록 후 패스 | |
| 26 | + | -- ST_IsValid 검사나 UPDATE 도중 GEOS 에러가 터지면 로그를 남기고 패스 | |
| 27 | 27 | INSERT INTO lsmd_cont_ldreg_err_log (bad_gid, err_msg) | |
| 28 | 28 | VALUES (r.gid, SQLERRM); | |
| 29 | 29 | ||
| 30 | 30 | v_err_count := v_err_count + 1; | |
| 31 | - | ||
| 32 | - | -- 루프 내부에서 즉시 로그가 기록되도록 개별 커밋 허용 관리 (PostgreSQL 환경에 따라 자동 처리) | |
| 33 | - | COMMIT; | |
| 34 | 31 | END; | |
| 35 | 32 | END LOOP; | |
| 36 | 33 | ||
| 37 | 34 | -- 최종 결과를 텍스트로 반환 | |
| 38 | - | RETURN '업데이트 완료! (성공: ' || v_succ_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건) * lsmd_cont_ldreg_err_log 테이블에서 누락 ID 확인 가능'; | |
| 35 | + | RETURN '업데이트 완료! (수정성공: ' || v_succ_count || '건 / 정상패스: ' || v_skip_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건)'; | |
| 39 | 36 | END; | |
| 40 | 37 | $$ LANGUAGE plpgsql; | |
OGG revidoval tento gist . Přejít na revizi
1 file changed, 9 insertions
에러로그테이블.sql(vytvořil soubor)
| @@ -0,0 +1,9 @@ | |||
| 1 | + | CREATE TABLE lsmd_cont_ldreg_err_log ( | |
| 2 | + | log_seq SERIAL PRIMARY KEY, -- 로그 일련번호 (자동 증가 PK) | |
| 3 | + | log_time TIMESTAMP DEFAULT NOW(), -- 에러 기록 시간 (기본값 현재시간) | |
| 4 | + | bad_gid INT NOT NULL, -- 에러가 발생한 연속지적도의 gid | |
| 5 | + | err_msg TEXT -- GEOS 엔진 등이 뱉은 구체적인 에러 메시지 | |
| 6 | + | ); | |
| 7 | + | ||
| 8 | + | -- 추후 로그 분석 속도를 높이기 위한 인덱스 추가 (선택사항) | |
| 9 | + | CREATE INDEX idx_lsmd_cont_ldreg_err_log_gid ON lsmd_cont_ldreg_err_log(bad_gid); | |
OGG revidoval tento gist . Přejít na revizi
1 file changed, 40 insertions
\354\227\260\354\206\215\354\247\200\354\240\201\353\217\204 \354\230\244\353\245\230\355\225\204\354\247\200 \353\263\264\354\240\225.sql" (vytvořil soubor)
| @@ -0,0 +1,40 @@ | |||
| 1 | + | CREATE OR REPLACE FUNCTION update_valid_ldreg() | |
| 2 | + | RETURNS TEXT AS $$ | |
| 3 | + | DECLARE | |
| 4 | + | r RECORD; | |
| 5 | + | v_err_count INT := 0; | |
| 6 | + | v_succ_count INT := 0; | |
| 7 | + | BEGIN | |
| 8 | + | -- 1. 건너뛴 필지를 기록할 로그 테이블이 없으면 자동으로 생성 | |
| 9 | + | CREATE TABLE IF NOT EXISTS lsmd_cont_ldreg_err_log ( | |
| 10 | + | log_time TIMESTAMP DEFAULT NOW(), | |
| 11 | + | bad_gid INT, | |
| 12 | + | err_msg TEXT | |
| 13 | + | ); | |
| 14 | + | ||
| 15 | + | -- 2. lsmd_cont_ldreg 테이블의 모든 데이터를 gid 기준으로 순회 | |
| 16 | + | FOR r IN SELECT gid, geom FROM lsmd_cont_ldreg WHERE geom IS NOT NULL LOOP | |
| 17 | + | BEGIN | |
| 18 | + | -- ST_SnapToGrid 없이 바로 ST_MakeValid 및 추출 수행 | |
| 19 | + | UPDATE lsmd_cont_ldreg | |
| 20 | + | SET geom = ST_Multi(ST_CollectionExtract(ST_MakeValid(r.geom), 3)) | |
| 21 | + | WHERE gid = r.gid; | |
| 22 | + | ||
| 23 | + | v_succ_count := v_succ_count + 1; | |
| 24 | + | ||
| 25 | + | EXCEPTION WHEN OTHERS THEN | |
| 26 | + | -- GEOS 에러 등이 발생하면 로그 테이블에 해당 gid와 에러 원인 기록 후 패스 | |
| 27 | + | INSERT INTO lsmd_cont_ldreg_err_log (bad_gid, err_msg) | |
| 28 | + | VALUES (r.gid, SQLERRM); | |
| 29 | + | ||
| 30 | + | v_err_count := v_err_count + 1; | |
| 31 | + | ||
| 32 | + | -- 루프 내부에서 즉시 로그가 기록되도록 개별 커밋 허용 관리 (PostgreSQL 환경에 따라 자동 처리) | |
| 33 | + | COMMIT; | |
| 34 | + | END; | |
| 35 | + | END LOOP; | |
| 36 | + | ||
| 37 | + | -- 최종 결과를 텍스트로 반환 | |
| 38 | + | RETURN '업데이트 완료! (성공: ' || v_succ_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건) * lsmd_cont_ldreg_err_log 테이블에서 누락 ID 확인 가능'; | |
| 39 | + | END; | |
| 40 | + | $$ LANGUAGE plpgsql; | |