Oracle XMLTYPEを個人的にまとめてみる
XMLTYPEをカラムに持つテーブルのCREATE
CREATE TABLE TEST_TABLE ( ID VARCHAR2(10) NOT NULL PRIMARY KEY, XMLDATA SYS.XMLTYPE, INS DATE, UPD DATE );
"XMLDATA SYS.XMLTYPE"という部分がXMLTYPEとして作成され、"XMLDATA"というXMLTYPE型のカラムを持った"TEST_TABLE"というテーブルができあがる。
SQL> desc TEST_TABLE 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- ID NOT NULL VARCHAR2(10) XMLDATA SYS.XMLTYPE INS DATE UPD DATE
テーブルへのINSERT, UPDATE
INSERT
DECLARE test_xml SYS.XMLTYPE; test_doc CLOB; BEGIN test_doc := '<test><a><c>test</c></a><b>xmlxml</b></test>'; test_xml := sys.xmltype.createXML(test_doc); INSERT INTO TEST_TABLE(ID, XMLDATA, INS, UPD) VALUES('1', test_xml, SYSDATE, SYSDATE); END;
UPDATE
DECLARE test_xml SYS.XMLTYPE; test_doc CLOB; BEGIN test_doc := '<test><a><c>test</c></a><b>xmlxml</b></test>'; test_xml := sys.xmltype.createXML(test_doc); UPDATE TEST_TABLE SET XMLDATA = test_xml, UPD = SYSDATE WHERE ID = 1; END;
特定の要素をUPDATE
UPDATE TEST_TABLE SET XMLDATA = updateXML( XMLDATA, '/test/b', XMLType.createXML('<b>xmlxmlxml</b>') ) WHERE ID = 1;
DELETEは普通のDELETE文でレコードを削除できます。
XML全体から取得する場合
SELECT XML_TABLE.XMLDATA.extract('/').getClobVal() AS TEST_GET FROM TEST_TABLE XML_TABLE WHERE ID = 1;
TEST_GET
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
特定の要素を取得する場合
SELECT XML_TABLE.XMLDATA.extract('/test/a/c').getClobVal() AS TEST_GET FROM TEST_TABLE XML_TABLE WHERE ID = 1;
TEST_GET
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
特定の要素のテキストを取得する場合
SELECT XML_TABLE.XMLDATA.extract('/test/a/c/text()').getClobVal() AS TEST_GET FROM TEST_TABLE XML_TABLE WHERE ID = 1;
TEST_GET
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
XML Path Language (XPath)に関しては例を書き出していくとキリがないので、XML Path Language (XPath)を参照してください。
Oracle10gにて動作検証。