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
                                                                                                                                                              • -
<test> <a> <c>test</c> </a> <b>xmlxmlxml</b> </test>

特定の要素を取得する場合

SELECT XML_TABLE.XMLDATA.extract('/test/a/c').getClobVal() AS TEST_GET
  FROM TEST_TABLE XML_TABLE WHERE ID = 1;
TEST_GET
                                                                                                                                                              • -
<c>test</c>

特定の要素のテキストを取得する場合

SELECT XML_TABLE.XMLDATA.extract('/test/a/c/text()').getClobVal() AS TEST_GET
  FROM TEST_TABLE XML_TABLE WHERE ID = 1;
TEST_GET
                                                                                                                                                              • -
test

XML Path Language (XPath)に関しては例を書き出していくとキリがないので、XML Path Language (XPath)を参照してください。
Oracle10gにて動作検証。