본문 바로가기

SQL

oracle XMLELEMENT,XMLAGG,XMLFOREST,XMLATTRIBUTES 함수

1. xlmelement함수

-> 조회된 결과에 테그를 붙여 결과를 xml형태의 자료로 만든다.

예) select a.deptcd,

XMLELEMENT(dept, a.deptcd) xdept

from m_dept a

결과) dept xdept

012345 <dept>012345</dept>

123231 <dept>123231</dept>

,

,

2. xmlagg함수

-> XMLELEMENT에 의해 XML태그를 한줄로 만들어주는 문장

예) select XMLAGG(XMLELEMENT(dept, a.deptcd)) xdept

from m_dept a

결과) xdept

<dept>012345</dept><dept>123231</dept>,,,,,,

 

응용)

-> XMLELEMENT함수로 조회된 행을 XML태그로 만들고 XMLAGG로 한줄로 만들어서 REPALCE같은 함수로 태그를 적절히 없애주면 끝.. XMLELEMENT함수에는 ORDER BY 절을 사용할 수 있고 XMLAGG는 GROUP BY절과 함께 사용할 수있다.

SYS_CONNECT_BY_PATH함수를 써서 구했는데 속도가 많이 느리다. XMLELEMENT

 

주의) XMLAGG함수는 CPU사용율이 높고 많은 데이터처리는 되지 않는다.

 출처 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0URLY&articleno=23&_bloghome_menu=recenttext

 

 ----------------------------------------------------------------------------------------------

==> XMLELEMENT 예제

WITH T AS
(
SELECT 1 AS COL1, 'A' COL2 FROM DUAL UNION ALL
SELECT 1 AS COL1, 'B' COL2 FROM DUAL UNION ALL
SELECT 1 AS COL1, 'C' COL2 FROM DUAL
)
SELECT COL1
, XMLAGG(XMLELEMENT("NM", COL2, '^') ORDER BY ROWNUM).EXTRACT('//text()').GETSTRINGVAL() AS COL2
, XMLAGG(XMLELEMENT("NM", '^', COL2) ORDER BY ROWNUM).EXTRACT('//text()').GETSTRINGVAL() AS COL3
FROM T
GROUP BY COL1

결과)

1 1 A^B^C^ ^A^B^C


==> 다른 XMLELEMENT 예제
WITH TAB AS
(
SELECT 'X' GBN,'A01' ITEM_CD FROM DUAL UNION ALL
SELECT 'X' GBN,'A02' ITEM_CD FROM DUAL UNION ALL
SELECT 'X' GBN,'B02' ITEM_CD FROM DUAL UNION ALL
SELECT 'Y' GBN,'B01' ITEM_CD FROM DUAL UNION ALL
SELECT 'Y' GBN,'B02' ITEM_CD FROM DUAL UNION ALL
SELECT 'Z' GBN,'G01' ITEM_CD FROM DUAL UNION ALL
SELECT 'Z' GBN,'A02' ITEM_CD FROM DUAL UNION ALL
SELECT 'Z' GBN,'B02' ITEM_CD FROM DUAL
)
/*select gbn, max(decode(rn,1,item_cd)) || max(decode(rn,2,item_cd)) || max(decode(rn,3,item_cd)) as item_cd
from (SELECT tab.*, row_number() OVER(PARTITION BY gbn ORDER BY ROWNUM) AS rn
FROM tab)
group by gbn*/

SELECT GBN
--, xmlagg(XMLELEMENT(ITEM_CD,','||ITEM_CD ) order by gbn)
, SUBSTR(XMLAGG( XMLELEMENT(ITEM_CD,','||ITEM_CD ) ORDER BY GBN ).EXTRACT('//text()').GetStringVal(), 2) as a
FROM TAB
GROUP BY GBN

 

출처 : http://synergy-textcube.blogspot.kr/2010/02/oracle-xmlelement-%EC%98%88%EC%A0%9C-%EB%B0%8F-%EC%84%A4%EB%AA%85.html

----------------------------------------------------------------------------------------------

 

xmlagg, xmlelement함수 -> 여러 로우를 한줄로 표현해보자!

 

1. xlmelement함수

-> 조회된 결과에 테그를 붙여 결과를 xml형태의 자료로 만든다.

예) select a.deptcd,

XMLELEMENT(dept, a.deptcd) xdept

from m_dept a

결과) dept              xdept

      012345       <dept>012345</dept>

      123231       <dept>123231</dept>

,

,

2. xmlagg함수

-> XMLELEMENT에 의해 XML태그를 한줄로 만들어주는 문장

예) select XMLAGG(XMLELEMENT(dept, a.deptcd)) xdept

from m_dept a

결과) xdept

<dept>012345</dept><dept>123231</dept>,,,,,,

 

응용)

-> XMLELEMENT함수로 조회된 행을 XML태그로 만들고 XMLAGG로 한줄로 만들어서 REPALCE같은 함수로 태그를 적절히 없애주면 끝.. XMLELEMENT함수에는 ORDER BY 절을 사용할 수 있고 XMLAGG는 GROUP BY절과 함께 사용할 수있다.

SYS_CONNECT_BY_PATH함수를 써서 구했는데 속도가 많이 느리다. XMLELEMENT

 

주의) XMLAGG함수는 CPU사용율이 높고 많은 데이터처리는 되지 않는다.

 

출처 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0URLY&articleno=23&_bloghome_menu=recenttext#ajax_history_home

----------------------------------------------------------------------------------------------

-- 예제 
SELECT XMLELEMENT(
           "Data"
          ,XMLELEMENT(
               "Data2"
              ,XMLFOREST(NVL('test', '') AS "CallNumber"
                        ,NVL('testurl', '') AS "TwitterUrl"
                        ,NVL('testurl1', '') AS "FacebookUrl"
                        ,NVL('ok', '') AS "EnableRemoteSvc")
           )
       )
           AS TEST
  FROM DUAL
 

XMLForest함수는 각 인수의 파라미터를 XML로 변환하고, 변환된 인수를 연결한 XML 단편(fragment)을 반환한다.
만약  value_expr이 스칼라 표현이라면, AS구문은 생략할수 있고, 오라클 데이터베이스는 요소명으로써 열명을 사용한다.
만약  value_expr이 오브젝터 형 또는 콜렉션이라면, AS 구문은 필수적이고, 오라클 데이터 베이스는 tag로 둘러쌓인 지정된 c_alias를 이용한다.
만약  value_expr이 Null이라면, value_expr에 대한 요소는 생성되지 않는다.
 

다음 예제는 종업원의 부분집합에 대하여 EMP요소를 생성한다. EMP항목으로써 중첩된 employee_id,last_name,salary 요소를 가진다.
 SELECT XMLELEMENT("Emp",
   XMLFOREST(e.employee_id, e.last_name, e.salary))
   "Emp Element"
   FROM employees e WHERE employee_id = 204;

Emp Element
----------------------------------------------------------------
<Emp>
  <EMPLOYEE_ID>204</EMPLOYEE_ID>
  <LAST_NAME>Baer</LAST_NAME>
  <SALARY>10000</SALARY>
</Emp>

출처 : http://www.statwith.pe.kr/ORACLE/functions204.htm 

-------------------------------------------------------------------------------------------------------

설명없음요~~~예제만

SELECT XMLELEMENT("Collection", XMLATTRIBUTES('TEST-ATTRIBUTE' AS "type"), XMLELEMENT("ContentsType", 'P'), XMLELEMENT("ContentsSequence", '12345')) FROM DUAL

--<Collection type="LED-PTN"><ContentsType>P</ContentsType><ContentsSeq>12345</ContentsSeq></Collection>

 

 

'SQL' 카테고리의 다른 글

REGEXP_REPLACE 정규식 표현을 이용한 행변환  (0) 2013.09.05
oracle xmltype  (0) 2013.07.04
oracle xml  (0) 2013.07.04
ORACLE 행을 열로 , 열을 행으로  (0) 2013.01.29
oracle exists vs in  (0) 2013.01.29