기존의 테이블에 새로운 필드를 추가하고, 이 필드에 값을 넣어야 할 필요가 있습니다. 상황은 지적도가 저장된 테이블의 PNU 필드를 파싱해서 번지값을 만들어 저장해야 합니다. 예를 들어서 PNU가 ‘2911011200200470001’라면 ’47-1산’으로 만들어야 한다는 것입니다.
사용하는 데이터베이스가 PostgreSQL이므로 pl/pgsql을 이용하였는데요. cursor를 이용하는 방식과 cursor를 이용하지 않는 방식이 있는데.. 먼저 cursor를 이용하지 않는 방식은 아래와 같습니다.
DO $$ DECLARE r RECORD; n1 INTEGER; n2 INTEGER; s TEXT; v TEXT; BEGIN FOR r IN SELECT * FROM ecl_cadastral LOOP n1 = substr(r.pnu, 12, 4)::INTEGER; n2 = substr(r.pnu, 16, 4)::INTEGER; s = substr(r.pnu, 11, 1); IF n2 = 0 THEN v = n1; ELSE v = n1 || '-' || n2; END IF; IF s = '2' THEN v = v || '산'; END IF; UPDATE ecl_cadastral SET label = v WHERE fid = r.fid; END LOOP; END; $$ LANGUAGE plpgsql;
동일한 기능으로 cursor를 이용하는 방식은 아래와 같습니다.
DO $$ DECLARE c CURSOR FOR SELECT * FROM ecl_cadastral; r RECORD; n1 INTEGER; n2 INTEGER; s TEXT; v TEXT; BEGIN FOR r IN c LOOP n1 = substr(r.pnu, 12, 4)::INTEGER; n2 = substr(r.pnu, 16, 4)::INTEGER; s = substr(r.pnu, 11, 1); IF n2 = 0 THEN v = n1; ELSE v = n1 || '-' || n2; END IF; IF s = '2' THEN v = v || '산'; END IF; UPDATE ecl_cadastral SET label = v WHERE CURRENT OF c; END LOOP; END; $$ LANGUAGE plpgsql;
속도는 cursor를 이용하는 방식이 약 20% 정도 빨랐습니다.