pl/pgsql을 이용한 테이블 업데이트(Update)

기존의 테이블에 새로운 필드를 추가하고, 이 필드에 값을 넣어야 할 필요가 있습니다. 상황은 지적도가 저장된 테이블의 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% 정도 빨랐습니다.

FingerEyes-Xr for HTML5의 레이어 추가시 연결 완료 이벤트

FingerEyes-Xr에서 레이어를 추가하기 위한 매서드는 LayerManager의 add 입니다. 이 add 매서드는 2개의 인자를 받는데요. 첫번째는 추가하고자 하는 Layer 객체이고 두번째는 선택 사항으로 추가하려는 레이어가 네트워크를 통해 성공적으로 연결되었을 때 호출할 callback 함수입니다. 이 callback 함수는 레이어 추가시 개별적으로 세밀한 흐름 제어를 위해 사용됩니다. 이와 관련한 예는 아래와 같습니다.

var baseLyr = new Xr.layers.TileMapLayer(layerName,
    {
        url: "http://localhost/....",
        ext: "jpg"
    }
);

var lm = map.layers();

lm.add(baseLyr, 
    function (lyr) {
        lm.moveToFirst(layerName);
        map.updateLayer(layerName);
    }
);

위의 코드는 배경지도를 새롭게 추가할 때 추가된 레이어를 가장 첫번째 순위로 이동하고 추가된 레이어만을 새롭게 화면상에 업데이트하라는 코드입니다. 이러한 코드는 해당 레이어가 네트워크를 통해 완전히 연결된 이후에 실행되어야 하는 코드이므로 callback 함수의 사용에 적합합니다.