1.14.3 SQL/XML スカラ関数
- 〈この項の構成〉
(1) XMLQUERY
(a) 機能
XQueryを評価し,その結果のXML型の値を生成します。
(b) 形式
XMLQUERY ( XQuery問合せ PASSING BY VALUE XML問合せ引数 〔,XML問合せ引数 〕… 〔 RETURNING SEQUENCE 〔 BY VALUE 〕〕 EMPTY ON EMPTY ) XQuery問合せ ::= 文字列定数 XML問合せ引数 ::= {XML問合せ文脈項目 | XML問合せ変数} XML問合せ文脈項目 ::= 値式 〔 BY VALUE 〕 XML問合せ変数 ::= 値式 AS XQuery変数識別子 〔 BY VALUE 〕
(c) オペランド
-
XQuery問合せ ::= 文字列定数
評価するXQueryを文字列定数で指定します。XQueryの指定方法については,「XQuery」を参照してください。
-
XML問合せ引数 ::= { XML問合せ文脈項目 | XML問合せ変数 }
XQueryに渡す引数を指定します。
XML問合せ引数としてXQueryに渡す,XQueryシーケンスに含まれるXQuery項目の親プロパティは空になります。また,異なるXML問合せ引数に指定したXQueryシーケンスに,同じXML型の値の同じ部分を表すノードが含まれていた場合でも,XQueryの評価ではそれらを異なるノードとして扱います。
-
XML問合せ文脈項目 ::= 値式 〔 BY VALUE 〕
XQueryの評価対象である文脈項目を指定します。
指定しない場合は,XQueryの評価対象の文脈項目は設定しないで,XQuery問合せに指定したXQueryを一度評価します。
なお,この項目はPASSING句中に一つしか指定できません。
- 値式
-
結果がXML型の値となる値式を指定します。
この値式の結果である,XML型の値のXQueryシーケンスを構成する各XQuery項目が,XQueryの評価対象の文脈項目となります。
値式の結果がナル値の場合は,XMLQUERY関数の結果はナル値になります。
指定できるものを次に示します。
-
列指定
-
列指定によって導出した名前付き導出表の列
-
- BY VALUE
-
指定の有無によって,XML問合せ文脈項目に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。
-
XML問合せ変数::= 値式 AS XQuery変数識別子〔 BY VALUE 〕
XQuery問合せに指定された,XQuery中のXQuery変数に値を渡す場合に指定します。
- 値式
-
XQuery問合せに指定された,XQuery中のXQuery変数に渡す値式を指定します。
値式の結果がXML型でない場合は,XML型の値であるXQueryシーケンスに変換して渡します。
指定できるデータ型と,変換後の形式を次の表に示します。
表1‒39 XQuery変数に渡す値のデータ型と,変換後のXML型の値の形式 データ型
変換後の形式
INTEGER
xs:int型の値※
SMALLINT
xs:int型の値※
DECIMAL
xs:decimal型の値※
FLOAT
xs:double型の値※
SMALLFLT
xs:double型の値※
CHAR
xs:string型の値※
VARCHAR
xs:string型の値※
MCHAR
xs:string型の値※
MVARCHAR
xs:string型の値※
DATE
xs:date型の値※
TIME
xs:time型の値※
TIMESTAMP
xs:dateTime型の値※
XML
変換しません
(値式に指定したXML型の値と同じ形式になります)
XQueryシーケンスに変換できない場合は,エラーとなります。
また,値式の結果がナル値の場合は,空のXQueryシーケンスである値をXQuery変数に渡します。
値式に指定できるものを次に示します。
-
定数
-
USER値関数,CURRENT_DATE値関数,CURRENT_TIME値関数,CURRENT_TIMESTAMP値関数
-
列指定
-
SQL変数又はSQLパラメタ
-
四則演算,日付演算,時刻演算又は連結演算
-
集合関数
-
スカラ関数
-
関数呼出し
-
CASE式
-
CAST指定
-
埋込み変数又は?パラメタ
-
スカラ副問合せ
-
上記のどれかの値式によって導出した名前付き導出表の列
-
- AS XQuery変数識別子
-
値を渡すXQuery変数の識別子を指定します。
XQuery変数識別子には,XQuery問合せ中に指定したXQuery変数名を指定します。指定方法については,「名前の指定」を参照してください。
ここで指定したXQuery変数識別子のXML名前空間は,XQuery問合せでの既定のXML名前空間となります。
ここで指定したXQuery変数識別子に対応するXQuery変数は,XQuery問合せで指定したXQuery全体が有効範囲になります。
同じPASSING句中のほかのXML問合せ変数で指定したXQuery変数識別子は指定できません。
- BY VALUE
-
指定の有無によって,XML問合せ変数に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。
値式の結果がXML型となる場合だけ指定してください。値式の結果がXML型でない場合に指定すると,エラーとなります。
- RETURNING SEQUENCE 〔 BY VALUE 〕
-
指定の有無によって,XQueryの評価結果の値の形式及び返却方法は変わりません。ISO規格との互換のためにサポートしています。
(d) 規則
-
結果はXML型の値でXQueryシーケンスとなります。また,結果の値であるXQueryシーケンスを構成するXQuery項目の親プロパティは,空となります。
-
この関数は,関数呼出しが指定できる箇所にだけ指定できます。
-
INSERT文で,この関数の結果又は結果を基にしたXML型の値を,列に格納することはできません。
-
UPDATE文で,この関数の結果を列に格納する場合,次の条件をすべて満たす必要があります。
-
XML問合せ文脈項目を指定している。
-
XQuery問合せ中のXQuery式がXQuery変換式である。
-
(e) 使用例
書籍管理表の書籍情報列から,埋込み変数(category)で指定されたカテゴリの書籍のタイトルを取得します。
SELECT XMLSERIALIZE( XMLQUERY(‘/書籍情報[カテゴリ=$CATEGORY]/タイトル’ PASSING BY VALUE 書籍情報, :category AS CATEGORY RETURNING SEQUENCE BY VALUE EMPTY ON EMPTY) AS VARCHAR(32000)) FROM 書籍管理表
(2) XMLSERIALIZE
(a) 機能
XML型の値を直列化(文字列に変換)した,VARCHAR型又はBINARY型の値を生成します。
(b) 形式
XMLSERIALIZE ( 〔 CONTENT 〕 値式 AS データ型 〔 VERSION ‘1.0’ 〕 〔{ INCLUDING XMLDECLARATION |EXCLUDING XMLDECLARATION }〕)
(c) オペランド
-
CONTENT
指定の有無によって,結果の形式は変わりません。ISO規格との互換のためにサポートしています。
結果の形式は,整形式XML文書の形式である必要はありません。
-
値式
VARCHAR型又はBINARY型の値を生成するXML型の値を指定します。
指定できるものを次に示します。
-
列指定
-
XMLQUERY関数
-
XMLAGG集合関数
-
列指定によって導出した名前付き導出表の列
-
AS データ型
結果のデータ型を指定します。
指定できるデータ型を次に示します。
-
VARCHAR型(文字集合指定は指定できません)
-
BINARY型
結果が指定したデータ型の最大長に格納できない場合は,エラーとなります。
-
〔 VERSION ‘1.0’ 〕
結果のXMLのバージョンを指定します。省略した場合は,’1.0’を仮定します。
-
〔{ INCLUDING XMLDECLARATION | EXCLUDING XMLDECLARATION }〕
結果のXMLにXML宣言(例:’<?xml version=”1.0” encoding=”UTF-8”?>’)を含めるかどうかを指定します。省略した場合は, EXCLUDING XMLDECLARATIONを仮定します。
- INCLUDING XMLDECLARATION
-
結果のXMLにXML宣言を含める場合に指定します。
- EXCLUDING XMLDECLARATION
-
結果のXMLにXML宣言を含めない場合に指定します。
(d) 規則
-
値式がナル値の場合は,結果もナル値になります。
-
結果の文字コードは,pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で指定した文字コードになります。
-
直列化した結果は,値式が示すXQueryシーケンス中の各XQuery項目を,次に示す規則に従って変換した結果を連結した文字列になります。ただし,隣接する基本単位値は,空白1文字を入れて連結します。
-
文書ノードを直列化した結果は,その子ノードを直列化した結果を連結した文字列になります。
-
要素ノードを直列化した結果は,次に示す要素ノードの文字列表現になります。子ノードを持つ要素ノードの場合は,開始タグから始まる文字列が直列化した結果になります。子ノードを持たない要素ノードの場合は,空要素タグが直列化した結果になります。
要素ノードの文字列表現 ::= { 開始タグ 子ノードの文字列表現 終了タグ | 空要素タグ } 子ノードの文字列表現 ::= { 要素ノードの文字列表現 | 処理命令ノードの文字列表現 | コメントノードの文字列表現 | テキストノードの文字列表現 } 開始タグ ::= < 修飾名 〔 空白 XML名前空間の文字列表現 〕… 〔 空白 属性ノードの文字列表現 〕… > 終了タグ ::= </ 修飾名 > 空要素タグ ::= < 修飾名 〔 空白 XML名前空間の文字列表現 〕… 〔 空白 属性ノードの文字列表現 〕… />
XML名前空間の文字列表現
要素ノード以下で有効なXML名前空間のうち,祖先の要素ノードで指定されていないXML名前空間を表すXML属性を,属性ノードの文字列表現で表した文字列になります。
-
属性ノードを直列化した結果は,次に示す属性ノードの文字列表現になります。
属性ノードの文字列表現 ::= 修飾名 等号演算子 “属性値“
属性値
属性ノードの文字列値に対して,次の文字を対応する文字列に置き換えた文字列になります。
置き換える文字
対応する文字列
&(アンパーサンド)
&
< (小なり演算子)
<
> (大なり演算子)
>
“(引用符)
"
‘ (アポストロフィ)
'
-
処理命令ノードを直列化した結果は,次に示す処理命令ノードの文字列表現になります。
処理命令ノードの文字列表現::= <? 処理命令ターゲット 空白 〔 処理命令ノードの内容 〕?>
-
コメントノードを直列化した結果は,次に示すコメントノードの文字列表現になります。
コメントノードの文字列表現::= <!-- コメントノードの内容 -->
-
テキストノードを直列化した結果は,次に示すテキストノードの文字列表現になります。
テキストノードの文字列表現::= テキスト値
テキスト値
テキストノードの内容に対して,次の文字を対応する文字列に置き換えた文字列になります。
置き換える文字
対応する文字列
&(アンパーサンド)
&
< (小なり演算子)
<
> (大なり演算子)
>
-
基本単位値を直列化した結果は,xs:string型の基本単位値に変換した文字列に対して,次の文字を対応する文字列に置き換えた文字列になります。
置き換える文字
対応する文字列
& (アンパーサンド)
&
< (小なり演算子)
<
> (大なり演算子)
>
-
-
この関数は,関数呼出しが指定可能な箇所にだけ指定できます。
(e) 使用例
書籍管理表の書籍情報列の値を,VARCHAR型の値として取得します。
SELECT XMLSERIALIZE(書籍情報 AS VARCHAR(32000) INCLUDING XMLDECLARATION) FROM 書籍管理表
(3) XMLPARSE
(a) 機能
XML文書からXML型の値を生成します。
(b) 形式
XMLPARSE( DOCUMENT 値式 〔 AS データ型 〕 〔 WHITESPACE指定 〕 ) WHITESPACE指定 ::= { PRESERVE | STRIP }WHITESPACE
(c) オペランド
値式に指定したXML文書が,整形式XML文書であることを表します。このオペランドを省略することはできません。
XML型の値を生成する整形式XML文書を指定します。指定できるデータ型を次に示します。
-
CHAR型(文字集合指定は指定できません)
-
VARCHAR型(文字集合指定は指定できません)
-
MCHAR型
-
MVARCHAR型
-
BINARY型
値式のデータ型を指定します。値式に埋込み変数又は?パラメタを指定する場合は,ASデータ型を必ず指定してください。ASデータ型を指定した場合は,値式に埋込み変数及び?パラメタ以外を指定できません。
XML文書に含まれる空白類の取り扱い方を指定します。空白類は,空白(X’20’),水平タブ(X’09’),改行(X’0A’),及び復帰(X’0D’)です。省略時は,STRIP WHITESPACEを仮定します。
なお,WHITESPACE指定に関係なく,復帰(X’0D’)及び復帰改行(X’0D0A’)は,改行(X’0A’)に置き換えます。続いて,WHITESPACE指定に従った処理を行います。
(d) 規則
-
値式がナル値の場合は,結果もナル値になります。
-
この関数は,関数呼出しが指定できる箇所にだけ指定できます。
-
DTD,XMLスキーマ,コメント,及び処理命令が記述されていても無視し,記述されていないものとして処理します。値式に指定したXML文書の妥当性は,検証しません。
-
使用できる実体は,定義済み実体(< > & ' &quat;)だけです。これ以外の内部実体及び外部実体は使用できません。使用した場合は文字として扱います。
-
XML宣言のencoding属性に指定できる文字コード種別を,次の表に示します。省略時は,UTF-8が仮定されます。
XML文書のencoding属性
HiRDBの文字コード
sjis
(シフトjis漢字)
ujis
(EUC日本語漢字)
utf-8
(Unicode(UTF-8))
Shift_JIS
○
×
×
EUC-JP
×
○
×
UTF-8
×
×
○
US-ASCII
○
○
○
上記以外
×
×
×
-
値式には5メガバイト以内のXML文書を指定してください。
-
要素名及び属性名は,4,096バイト以内で記述してください。
-
要素のネスト数は,100以内で記述してください。
-
接頭辞が記述されている場合,HiRDB XML Extensionのバージョンによって規則が異なります。
-
HiRDB XML Extensionのバージョンが08-05より前の場合
接頭辞が記述されていても,接頭辞が指定されていないものとして処理し,すべての要素及び属性は既定のXML名前空間として扱います。
-
HiRDB XML Extensionのバージョンが08-05以降の場合
XML ExtensionのXMLデータ型プラグインの環境設定(XMLPARSE名前空間処理指定)に従います。XMLデータ型プラグインの環境設定については,マニュアル「HiRDB XML拡張機能 HiRDB XML Extension」を参照してください。
-
(e) 使用例
書籍管理表にBINARY型の埋込み変数(bookxml)に格納されたXML文書を挿入します。
INSERT INTO 書籍管理表 VALUES(310494321, XMLPARSE(DOCUMENT :bookxml AS BINARY(32000)))
(f) 留意事項
-
この関数を使用するには,バージョンが08-04以降のHiRDB XML Extensionが必要です。
-
HiRDBサーバとHiRDBクライアントで文字コードが異なる場合は,値式のデータ型をBINARY型にしてください。