OceanBaseデータベースでは、以下の方法でXMLTypeデータをクエリできます。
SELECTステートメントを使用して、XMLTypeデータ型の列にアクセスします。- XML関数
XMLSERIALIZE()、またはXMLTypeのGETCLOBVAL()およびGETSTRINGVAL()メソッドを使用してアクセスします。この場合、取得されるXMLテキストのデータ型は、関数またはメソッドによって定義されます(例:VARCHAR2またはCLOB)。 EXTRACT(XML)関数を使用して、XMLテキスト内の有効なフラグメントを取得します。この場合、戻り値の型はXMLTypeです。EXTRACTVALUE()関数を使用して、XMLテキスト内の有効なフラグメントを取得します。現在、戻り値の型としてVARCHAR2のみがサポートされています。
さらに、OceanBaseデータベースでは、XMLType型に対するDML操作に以下のルールが適用されます。
VARCHAR、VARCHAR2、CHARなどのデータ型に対応する有効なXMLデータは、直接XMLType列に挿入できます。XMLPARSE()関数の結果が有効なDOCUMENTの場合、直接XMLType列に挿入できます。XMLPARSE()関数の結果がCONTENTの場合、その内容が有効なXMLDOCUMENTと見なせるかどうか(つまり、XMLType 1.0の構文に従い、唯一のルート要素があるかどうか)にかかわらず、XMLType列には挿入できません。- XMLTypeコンストラクタの結果が有効な場合、直接XMLType列に挿入できます。
XMLTypeデータ型のクエリと関連するDML操作の例を以下に示します。
# INSERT操作の実行
obclient> CREATE TABLE tt(c1 XMLType, c2 XMLType);
Query OK, 0 rows affected
obclient> INSERT INTO tt VALUES('<a>abc</a>', '<a>ccc</a>');
Query OK, 1 row affected
obclient> INSERT INTO tt VALUES(XMLType('<b>abc</b>'), XMLPARSE(DOCUMENT '<b>ccc</b>'));
Query OK, 1 row affected
# SELECTを直接使用したクエリ
obclient> SELECT c1 FROM tt;
+-------------+
| C1 |
+-------------+
| <a>abc</a>
|
| <b>abc</b>
|
+-------------+
2 rows in set
# XML関数またはPLメソッドを使用したクエリ。この方法で列にアクセスする場合、テーブルのエイリアスを使用する必要があります。
obclient> SELECT a.c1.GETCLOBVAL() FROM tt a;
+-------------------+
| A.C1.GETCLOBVAL() |
+-------------------+
| <a>abc</a>
|
| <b>abc</b>
|
+-------------------+
2 rows in set
obclient> SELECT a.c1.GETSTRINGVAL() FROM tt a;
+---------------------+
| A.C1.GETSTRINGVAL() |
+---------------------+
| <a>abc</a>
|
| <b>abc</b>
|
+---------------------+
2 rows in set
# XMLSERIALIZE() 関数を使用したクエリ
obclient> SELECT XMLSERIALIZE(DOCUMENT c1) FROM tt;
+--------------------------+
| XMLSERIALIZE(DOCUMENTC1) |
+--------------------------+
| <a>abc</a>
|
| <b>abc</b>
|
+--------------------------+
2 rows in set
# INSERT + SELECTシナリオ
obclient> CREATE TABLE test_xml1(
c1 NUMBER, c2 BINARY_FLOAT, c3 BINARY_DOUBLE,
c4 DATE, c5 VARCHAR(100), c6 CHAR(100),
c7 CLOB, c8 BLOB, c9 TIMESTAMP, c10 TIMESTAMP WITH TIME ZONE,
c11 TIMESTAMP WITH LOCAL TIME ZONE, c12 RAW(100),
c13 INTERVAL YEAR TO MONTH,
c14 INTERVAL DAY TO SECOND, c15 NVARCHAR2(100),
c16 NCHAR(100), c17 VARCHAR2(20), c18 XMLType);
Query OK, 0 rows affected
obclient> CREATE TABLE test_xml2(c1 INT, c2 XMLType);
Query OK, 0 rows affected
obclient> INSERT INTO test_xml2 SELECT 5, c5 FROM test_xml1;
Query OK, 0 rows affected
# UPDATEシナリオ
obclient> CREATE TABLE test_xml3(c1 NUMBER, c2 XMLType);
Query OK, 0 rows affected
obclient> UPDATE test_xml3 SET c2='<a>abc</a>';
Query OK, 0 rows affected
Rows matched: 0 Changed: 0 Warnings: 0
obclient> UPDATE test_xml3 SET c2=XMLPARSE(DOCUMENT '<a>ccc</a>');
Query OK, 0 rows affected
obclient> UPDATE test_xml3 SET c2=(SELECT c2 FROM tt);
OBE-01427: single-row subquery returns more than one row
関連ドキュメント
その他のXML関数およびPLメソッドに関する詳細は、以下を参照してください: