No. 20160
ORACLE 9I 에서 XMLTYPE COLUMN 사용 예제
=================================
PURPOSE
-------
Explanation
-----------
Oracle 9i 에서 새롭게 나온 datatype 인 XMLType 에 대해 column 을 생성하고 drop 하고,
data 를 insert, delete, update 하는 방법을 예제를 통해 알아 봅니다.
1a. XMLType Column 을 생성하는 방법.
1b. XMLType column 을 추가하는 방법.
1c. XMLType column 을 drop 하는 방법.
2. XMLType column 에 data 를 insert 하는 방법.
3. XMLType Column 의 data 를 update 하는 방법.
4. XMLType Column 의 data 를 delete 하는 방법.
5a. XML Data select 하는 방법.
5b. XML Data select 하는 또 다른 예제.
Example
-------
1a. XMLType Column 을 생성하는 방법.
CREATE TABLE po_xml_tab
(
poid number,
poDoc SYS.XMLTYPE
);
1b. XMLType column 을 추가하는 방법.
ALTER TABLE po_xml_tab ADD (custDoc sys.XMLType);
1c. XMLType column 을 drop 하는 방법.
ALTER TABLE po_xml_tab DROP (custDoc );
2. XMLType column 에 data 를 insert 하는 방법.
createXML function 은 XML 이 well-formed 인지 검사하지만
validity 는 검사하지 않습니다.
INSERT INTO po_xml_tab VALUES
(100, sys.XMLType.createXML('<PO pono="1">
<PNAME>Po_1</PNAME>
<CUSTNAME>John</CUSTNAME>
<SHIPADDR><STREET>1033, Main Street</STREET>
<CITY>Sunnyvalue</CITY>
<STATE>CA</STATE>
</SHIPADDR>
</PO>'));
3. XMLType Column 의 data 를 update 하는 방법.
update 는 XML document 전체만을 update 할 수 있습니다.
UPDATE po_xml_tab e
SET e.poDoc = sys.XMLType.createXML(
'<PO pono="2">
<PNAME>Po_2</PNAME>
<CUSTNAME>Nance</CUSTNAME>
<SHIPADDR> <STREET>2 Avocet Drive</STREET>
<CITY>Redwood Shores</CITY>
</SHIPADDR>
</PO>')
WHERE e.poDoc.extract('/PO/@pono').getNumberVal() = 1;
UPDATE po_xml_tab e
SET e.poDoc = sys.XMLType.createXML(
'<PO pono="2">
<PNAME>Po_2</PNAME>
<CUSTNAME>Nance</CUSTNAME>
<SHIPADDR> <STREET>2 Avocet Drive</STREET>
<CITY>Redwood Shores</CITY>
</SHIPADDR>
</PO>')
WHERE e.poDoc.extract('/PO/CUSTNAME/text()').getStringVal()='John';
4. XMLType Column 의 data 를 delete 하는 방법.
Extract 와 ExistsNode function 을 사용해서 delete 할 rows 를
찾을 수 있습니다.
Extract function 은 명시된 XPath 에 의해 document 의 node 나
nodes 의 한 set 을 추출할 수 있습니다.
추출된 nodes 는 elements 이거나 attributes, text nodes 일 수 있습니다.
ExistsNode function 은 주어진 XPath 에 의해 반화되는 XML element 나
text node 가 최소 한개 이상인지 검사합니다.
만일 한개 이상이라면 1 을 반환하고 그렇지 않을 경우에는 0을 반환합니다.
DELETE FROM po_xml_tab e
WHERE e.poDoc.extract('/PO/PNAME/text()').getStringVal()='Po_2';
5a. XML Data select 하는 방법.
Xpath 를 ExistsNode 또는 Extract Function 와 같이 사용해서 select 할 수
있습니다.
SELECT e.poDoc.extract('/PO/@pono').getNumberVal() pono
FROM po_xml_tab e
WHERE e.poDoc.existsnode('/PO/@pono') = 1 AND poid > 1;
위의 query 에서 extract() 는 "PONO" tag 의 내용을 추출합니다.
그리고 "PO" 의 child 로 "PONO" 가 존재하는지 existsnode() 로 확인하고
있습니다.
text() function 은 text nodes 만을 반환합니다.
getNumberVal() function 은 text 값만을 숫자값으로 바꿀 수 있습니다.
5b. XML Data select 하는 또 다른 예제.
SELECT e.poDoc.extract('/PO/PNAME/text()').getStringVal() PNAME
FROM po_xml_tab e
WHERE e.poDoc.existsNode('/PO/SHIPADDR') = 1 AND
e.poDoc.extract('/PO/@pono').getNumberVal() = 1 AND
e.poDoc.extract('/PO/CUSTNAME/text()').getStringVal() LIKE '%John%';
위의 query 에서는 shipping address 가 존재하고
purchase order number 가 2001 이고 고객명에 John 이 포함되어 있는
PO element 로 부터 "PNAME" 을 추출하고 있습니다.
Reference Documents
-------------------
NOTE:177729.1
***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 16:49)