Dernière activité 1783921378

OGG a révisé ce gist 1783921377. Aller à la révision

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" (fichier créé)

@@ -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 a révisé ce gist 1783920567. Aller à la révision

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 a révisé ce gist 1783920304. Aller à la révision

1 file changed, 9 insertions

에러로그테이블.sql(fichier créé)

@@ -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 a révisé ce gist 1783920149. Aller à la révision

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" (fichier créé)

@@ -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;
Plus récent Plus ancien