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メソッドに関する詳細は、以下を参照してください: