[DB2] 문자열 파싱 후 특정 토큰 값 변경하는 함수

Programming/Database 2010.06.23 댓글 Joshua95
 * 특정 컬럼의 문자열을 Delimeter로 파싱하여, 특정 번째 토큰을 변경하는 Function

-- 문자열 파싱 후 특정 토큰 값 변경하는 Function (DB2)

CREATE FUNCTION  fnGetNodeIPObjectBody( IPObjectBody_ VARCHAR(256), NewIPName_ VARCHAR (32), NewPortName_ VARCHAR (32) )
RETURNS  VARCHAR(256)

BEGIN ATOMIC
     DECLARE  SubStr_                  VARGRAPHIC(256) DEFAULT  '';
     DECLARE  Index_                 INT DEFAULT 0;
     DECLARE  FindIndex_        INT DEFAULT 4;        -- 5번째가 포트이므로.
     DECLARE  Delimiter_           VARGRAPHIC(1) DEFAULT '$';
     DECLARE  PreStr_                  VARGRAPHIC(256) DEFAULT  '';
     DECLARE  PostStr_                 VARGRAPHIC(256) DEFAULT  '';
     DECLARE  IpObjectName_ VARGRAPHIC(256) DEFAULT  '';

        IF (IPObjectBody_ IS NULL) THEN
                RETURN NULL;
        END IF;

        -- IP Object format
        -- [Network name] [Type(0/1/2)] [IP Address(ip_addr) or range(b_addr-e_addr)] [Netmask(Bit count)] [Interface Name(absX)|all] [Security Label(0-2)] [Description]
     SET SubStr_ = IpObjectBody_;

        -- name
     SET SubStr_ = substr( SubStr_, locate(Delimiter_, SubStr_) + 1 );
     SET IpObjectName_ = substr(IpObjectBody_, 1, length(IpObjectBody_)-length(SubStr_)-1);

        -- type
     set SubStr_ = substr( SubStr_, locate(Delimiter_, SubStr_) + 1 );

        -- ip address
     set SubStr_ = substr( SubStr_, locate(Delimiter_, SubStr_) + 1 );

        -- mask
     set SubStr_ = substr( SubStr_, locate(Delimiter_, SubStr_) + 1 );


     SET PreStr_ = substr(IpObjectBody_, length(IpObjectName_) + 2, length(IpObjectBody_)-length(SubStr_)-length(IpObjectName_) - 2);

     SET PostStr_ = substr(SubStr_, locate(Delimiter_, SubStr_) + 1 );

     RETURN  NewIPName_ || '$' || PreStr_ || '$' || NewPortName_ || '$'|| PostStr_;--

END;


* 위 함수 사용해서 일관 변환하기

UPDATE TBNODEIPPORT ni
SET ni.BODYTEXT =
(
        SELECT fnGetNodeIPObjectBody(o.BODYTEXT, n.NAME, p.NAME)
        FROM TBIPOBJECT o, TBNODEIPPORT n, TBNETPORTOBJECT p
        WHERE n.NODEIPPORTID = ni.NODEIPPORTID
        AND o.IPOBJECTID = n.IPOBJECTID
        AND n.NETPORTOBJECTID = p.NETPORTOBJECTID
)
WHERE ni.NODEIPPORTID IN
(
        SELECT NODEIPPORTID
        FROM TBIPOBJECT o, TBNODEIPPORT n, TBNETPORTOBJECT p
        WHERE o.IPOBJECTID = ObjectID_
        AND o.IPOBJECTID = n.IPOBJECTID
        AND n.NETPORTOBJECTID = p.NETPORTOBJECTID
);

- 2009/03/11 이전 작성글 이관

댓글