에러로그테이블.sql
· 575 B · MySQL
Surowy
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.6 KiB · MySQL
Surowy
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;
| 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; |