에러로그테이블.sql
· 575 B · MySQL
Ham
CREATE TABLE lsmd_cont_ldreg_err_log (
log_seq SERIAL PRIMARY KEY, -- 로그 일련번호 (자동 증가 PK)
log_time TIMESTAMP DEFAULT NOW(), -- 에러 기록 시간 (기본값 현재시간)
bad_gid INT NOT NULL, -- 에러가 발생한 연속지적도의 gid
err_msg TEXT -- GEOS 엔진 등이 뱉은 구체적인 에러 메시지
);
-- 추후 로그 분석 속도를 높이기 위한 인덱스 추가 (선택사항)
CREATE INDEX idx_lsmd_cont_ldreg_err_log_gid ON lsmd_cont_ldreg_err_log(bad_gid);
| 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); |
연속지적도 오류필지 보정.sql
· 1.5 KiB · MySQL
Ham
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;
| 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 | v_skip_count INT := 0; |
| 8 | BEGIN |
| 9 | |
| 10 | -- 테이블(lsmd_cont_ldreg)의 모든 데이터를 gid 기준으로 순회 |
| 11 | FOR r IN SELECT gid, geom FROM lsmd_cont_ldreg WHERE geom IS NOT NULL LOOP |
| 12 | BEGIN |
| 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 | |
| 25 | EXCEPTION WHEN OTHERS THEN |
| 26 | -- ST_IsValid 검사나 UPDATE 도중 GEOS 에러가 터지면 로그를 남기고 패스 |
| 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 | END; |
| 32 | END LOOP; |
| 33 | |
| 34 | -- 최종 결과를 텍스트로 반환 |
| 35 | RETURN '업데이트 완료! (수정성공: ' || v_succ_count || '건 / 정상패스: ' || v_skip_count || '건 / 에러로 건너뛴 필지: ' || v_err_count || '건)'; |
| 36 | END; |
| 37 | $$ LANGUAGE plpgsql; |
오류로 검출된 필지는 따로 처리.sql
· 153 B · MySQL
Ham
UPDATE lsmd_cont_ldreg t
SET geom = ST_Multi(ST_CollectionExtract(ST_Buffer(t.geom, 0.0), 3))
FROM lsmd_cont_ldreg_err_log log
WHERE t.gid = log.bad_gid;
| 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; |