문자열로 아이템 목록을 전달하여 테이블에 저정해야 하는 상황이 종종 있습니다.

,(콤마) 나 |(파이프문자)로 구분된 문자열을 던져  While 안에서 instr + left 의 조합으로 파싱하여 

테이블에 insert 하는 방법이 있지만 구닥다리 에 성능도 좋지 않다.


mssql 이나 oracle 에서는 xml 문자열을 파싱할 수 있는 함수가 있는데 이를 이용하면 손쉽게 테이블에 insert 할 수 있다.

* xml을 사용하면 태그 문자가 붙어 문자열이 길어져 성능상 안좋다고 하는 사람들이 있을 수 있는데. 그런 사람들은 꼭~ 피해 다니길 당부 드린다.


먼저 아이템 목록이 담긴 xml 문자열 입니다.

"<items>  

<item><id>M4A1</id><price>500</price></item>

<item><id>AK47</id><price>600</price></item>

<item><id>9A-91</id><price>700</price></item>

<item><id>M4</id><price>700</price></item>  

</items>"


Oracle SP 입니다.

  PROCEDURE SP_XML_SAVE

  (

    i_xml VARCHAR2 

  )

  IS

  BEGIN

         

    INSERT INTO T_ITEMS(ID,PRICE)

    SELECT 

        EXTRACTVALUE ( column_value, '/item/id' ) id                                                       --item 하위 id 속성의 값을 가져옴 

        ,to_number(EXTRACTVALUE ( column_value, '/item/price' )) price                         --값 추출 후 숫자형으로 변환

    FROM TABLE ( XMLSEQUENCE ( EXTRACT ( xmltype ( i_xml ), '/items/item' ) ) ) p;  --items 하위 item 목록 집합을 추출  

    

  END SP_XML_SAVE; 


SP 테스트 입니다.

DECLARE

  I_XML VARCHAR2(2000);

BEGIN

  I_XML := '<items> <item><id>M4A1</id><price>500</price></item>

                    <item><id>AK47</id><price>600</price></item>

                    <item><id>9A-91</id><price>700</price></item> </items>';


  PKG_SUB.SP_XML_SAVE(I_XML => I_XML);

END;


결과:



xml 문자열로 입력받은 아이템 목록이 테이블에 잘 저장되어 있습니다.

위 내용은 ORACLE SQL Developer 에서 작성 및 테스트 되었습니다.


기타 궁금한 사항, 논의해 보고 싶으신 사항은 댓글 남겨 주세요. 언제나 환영 합니다.


+ Recent posts