データ・タイプ間のキャスト

特定のデータ・タイプの値を別のデータ・タイプへキャストする必要や、データ・タイプは同じでも長さ、精度、または位取りの異なるデータ・タイプへキャスト する必要が生じることがよくあります。

データ・タイプのプロモーションは、 あるデータ・タイプから別のデータ・タイプへのプロモーションにおいて、 値を新しいデータ・タイプへキャストすることが必要になる 1 つの例です。 別のデータ・タイプへキャストできるデータ・タイプは、 ソース・データ・タイプから宛先データ・タイプへキャスト可能 であるといいます。

あるデータ・タイプから別のデータ・タイプへのキャストは、暗黙的に行われることもあれば、明示的に行うこともできます。 関係するデータ・タイプによっては、cast 関数、CAST 仕様、または XMLCAST 仕様を使用して、データ・タイプを明示的に変更することができます。 さらに、ソース関数から派生するユーザー定義関数を作成するときは、ソース関数のパラメーターのデータ・タイプが、作成しようとしている関数のデータ・タイプにキャスト可能でなければなりません。

組み込みデータ・タイプ間でサポートされるキャストを 表 1に示します。 第 1 列がキャスト・オペランドのデータ・タイプ (ソース・データ・タイプ) を表し、ヘッダー行に並べた各データ・タイプがキャスト操作のターゲット・データ・タイプを表します。 Y は、ソースとターゲットのデータ・タイプの組み合わせに対して CAST 仕様を使用できることを示します。 XMLCAST 仕様のみを使用できるケースでは、その旨注記されています。

データ・タイプが、文字または GRAPHIC データ・タイプにキャストされるときに切り捨てが行われる場合、非ブランク文字が切り捨てられると警告が戻されます。 この切り捨て動作は、非ブランク文字が切り捨てられる場合にエラーが起こるときの、文字または GRAPHIC データ・タイプへの割り当てとは異なります。

Unicode データベースでは、文字ストリングとグラフィック・ストリングのソース値を異なるストリング単位間でキャストできます。 切り捨ては、ターゲット・データ・タイプのストリング単位に応じて適用されます。

厳密に型付けされた特殊タイプに関する以下のキャストがサポートされています。(他に注意書きがなければ、CAST 仕様を使用しています。)

  • 特殊タイプ DT から、 そのソース・データ・タイプ S へのキャスト
  • 特殊タイプ DT のソース・データ・タイプ S から、 特殊タイプ DT へのキャスト
  • 特殊タイプ DT から、 それと同じ特殊タイプ DT へのキャスト
  • データ・タイプ A から、 特殊タイプ DT へのキャスト。ただし、 A は特殊タイプ DT のソース・データ・タイプ S へプロモート可能なもの
  • INTEGER から、 ソース・データ・タイプが SMALLINT である特殊タイプ DT へのキャスト
  • DOUBLE から、 ソース・データ・タイプが REAL である特殊タイプ DT へのキャスト
  • DECFLOAT から、 ソース・データ・タイプが CHAR である特殊タイプ DT へのキャスト
  • VARBINARY から、 ソース・データ・タイプが BINARY である特殊タイプ DT へのキャスト
  • VARCHAR から、 ソース・データ・タイプが CHAR である特殊タイプ DT へのキャスト
  • VARGRAPHIC から、 ソース・データ・タイプが GRAPHIC である特殊タイプ DT へのキャスト
  • Unicode データベースの場合、VARCHAR または VARGRAPHIC から、 ソース・データ・タイプが CHAR または GRAPHIC である特殊タイプ DT へのキャスト
  • ソース・データ・タイプが S である特殊タイプ DT から XML への、XMLCAST 仕様を使用したキャスト
  • XML から、任意の組み込みデータ・タイプのソース・データ・タイプをもった特殊タイプ DT への、XMLCAST 仕様を使用したキャスト (XML 値の XML スキーマ・データ・タイプによる)

緩やかに型付けされた特殊タイプがターゲットとして関係するキャストの場合、データ・タイプから緩やかに型付けされた特殊タイプのソース・タイプへキャスト可能でなければならず、値のデータ・タイプ制約が真または不明と評価されなければなりません。 データ・タイプが緩やかに型付けされた特殊タイプであるターゲットにソース・オペランドが割り当てられている場合にのみ、オペランドは緩やかに型付けされた特殊タイプに暗黙的にキャストされます。

FOR BIT DATA 文字タイプを CLOB にキャストすることはできません。

ターゲットとして配列タイプが関係するキャストの場合、ソース配列値のエレメントのデータ・タイプは、ターゲット配列データのエレメントのデータ・タイプに対してキャスト可能でなければなりません (SQLSTATE 42846)。 ターゲット配列タイプが通常配列の場合、ソース配列値は通常配列でなければならず (SQLSTATE 42821)、ソース配列値のカーディナリティーはターゲット配列データ・タイプの最大カーディナリティー以下でなければなりません (SQLSTATE 2202F)。 ターゲット配列タイプが連想配列の場合、ソース配列値の索引のデータ・タイプは、ターゲット配列タイプの索引のデータ・タイプにキャスト可能でなければなりません。 ユーザー定義配列タイプ値をキャストできるのは、同じユーザー定義配列タイプに対してのみです (SQLSTATE 42846)。

カーソル・タイプは、パラメーター・マーカーをカーソル・タイプにキャストする場合を除き、CAST 仕様のソース・データ・タイプにもターゲット・データ・タイプにもできません。

ターゲットとして行タイプが関係するキャストの場合、ソース行の値式の度合いとターゲット行タイプの度合いが一致し、ソース行の値式の各フィールドを対応するターゲット・フィールドにキャストできなければなりません。 ユーザー定義行タイプ値をキャストできるのは、名前が同じ別のユーザー定義行タイプに対してのみです (SQLSTATE 42846)。

構造化タイプの値を何か別のものにキャストすることはできません。 ST のスーパータイプに対するすべてのメソッドは、 ST に当てはまるので、構造化タイプ ST を、 そのスーパータイプのいずれかにキャストすべきではありません。 必要な操作が ST のサブタイプだけに当てはまる場合、 サブタイプ処理式を使用して、ST をサブタイプの 1 つとして扱います。

キャストに関与したユーザー定義データ・タイプがスキーマ名によって修飾されていない場合、 SQL パス が、 ユーザー定義データ・タイプを組み入れられた最初のスキーマをその名前で検出するために使用されます。

参照タイプに関して、以下のキャストがサポートされています。
  • 参照タイプ RT から、表記データ・タイプ S へのキャスト
  • 参照タイプ RT の表記データ・タイプ S から、 参照タイプ RT へのキャスト
  • ターゲット・タイプが T である参照タイプ RT から、 ターゲット・タイプが S である参照タイプ RS へのキャスト (ST のスーパータイプ)
  • データ・タイプ A から、 参照タイプ RT へのキャスト (ただし A は、 参照タイプ RT の表記データ・タイプ S へプロモート可能なもの)

キャストに関与した参照データ・タイプのターゲット・タイプがスキーマ名によって修飾されていない場合、 SQL パス が、 ユーザー定義データ・タイプを組み入れられた最初のスキーマをその名前で検出するために使用されます。

表 1. 組み込みデータ・タイプ間のサポートされるキャスト
ソース・データ・タイプ ターゲット・データ・タイプ  
S
M
A
L
L
I
N
T

N
T
E
G
E
R
B
I
G
I
N
T (B)
D
E
C
I
M
A
L
R
E
A
L
D
O
U
B
L
E
D
E
C
F
L
O
A
T
C
H
A
R
C
H
A
R

F
B
D2
V
A
R
C
H
A
R
V
A
R
C
H
A
R

F
B
D 2
C
L
O
B (英語)
G
R
A
P
H
I
C
V
A
R
G
R
A
P
H
I
C
D
B
C
L
O
B
B
I
N
A
R
Y (R)
V
A
R
B
I
N
A
R
Y
B
L
O
B (B)
D
A
T
E (E)
T
I
M
E (M)
T
I
M
E
S
T
A
M
P
X
M
L (M)
B
O
O
L
E
A
N
SMALLINT Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 Y
INTEGER Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 Y
BIGINT Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 Y
DECIMAL Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 -
REAL Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 -
DOUBLE Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - Y3 -
DECFLOAT Y Y Y Y Y Y Y Y Y Y Y - Y1 Y1 - - - - - - - - -
CHAR Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y1 Y Y Y Y Y Y Y4 Y
CHAR FOR BIT DATA Y Y Y Y Y Y Y Y Y Y Y - - - - Y Y Y Y Y Y Y3 -
VARCHAR Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y1 Y Y Y Y Y Y Y4 Y
VARCHAR FOR BIT DATA Y Y Y Y Y Y Y Y Y Y Y - - - - Y Y Y Y Y Y Y3 -
CLOB - - - - - - - Y - Y - Y Y1 Y1 Y1 Y Y Y - - - Y4 -
GRAPHIC Y1 Y1 Y1 Y1 Y1 Y1 Y1 Y1 - Y1 - Y1 Y Y Y Y Y Y Y1 Y1 Y1 Y3 Y1
VARGRAPHIC Y1 Y1 Y1 Y1 Y1 Y1 Y1 Y1 - Y1 - Y1 Y Y Y Y Y Y Y1 Y1 Y1 Y3 Y1
DBCLOB - - - - - - - Y1 - Y1 - Y1 Y Y Y Y Y Y - - - Y3 -
BINARY - - - - - - - - Y - Y - - - - Y Y Y - - - - -
VARBINARY - - - - - - - - Y - Y - - - - Y Y Y - - - - -
BLOB - - - - - - - - Y - Y - - - - Y Y Y - - - Y4 -
日数 - Y Y Y - - - Y Y Y Y - Y1 Y1 - - - - Y - Y Y3 -
時刻 - Y Y Y - - - Y Y Y Y - Y1 Y1 - - - - - Y - Y3 -
TIMESTAMP - - Y Y - - - Y Y Y Y - Y1 Y1 - - - - Y Y Y Y3 -
XML Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 Y5 - - Y5 Y5 Y5 Y5 Y -
BOOLEAN Y Y Y - - - - Y - Y - - Y1 Y1 - - - - - - - - Y
注記
  • ユーザー定義タイプおよび参照タイプに関してサポートされているキャストについては、 この表の前にある説明を参照してください。
  • 構造化タイプの値を何か別のものにキャストすることはできません。
  • データ・タイプ LONG VARCHAR と LONG VARGRAPHIC は、引き続きサポートされていますが、非推奨になっており、将来のリリースで除去される可能性があります。

1 キャストは、Unicode データベースの場合にのみサポートされます。

2 FOR BIT DATA

3 キャストは XMLCAST を使用しないと実行できません。

4 ストリングを XML 列に割り当てる (INSERT または UPDATE) ときに、XMLPARSE 関数が暗黙的に処理されて、ストリングを XML に変換します。 割り当てを正常に完了するには、そのストリングが整形式 XML 文書でなければなりません。

5 キャストは XMLCAST を使用しないと実行できず、XML 値の基礎となる XML スキーマ・データ・タイプに依存します。 詳しくは、XMLCAST を参照してください。

6 カーソル・タイプは、パラメーター・マーカーをカーソル・タイプにキャストする場合を除き、CAST 仕様のソース・データ・タイプにもターゲット・データ・タイプにもできません。

表 2 は、識別されたターゲット・データ・タイプにキャストする際に適用される規則に関する情報の入手先を示しています。

表 2. データ・タイプへのキャストに関する規則
ターゲット・データ・タイプ ルール
SMALLINT SMALLINT スカラー関数
INTEGER INTEGER スカラー関数
BIGINT BIGINT スカラー関数
DECIMAL DECIMAL または DEC スカラー関数
NUMERIC DECIMAL または DEC スカラー関数
REAL REAL スカラー関数
DOUBLE DOUBLE_PRECISION または DOUBLE スカラー関数
DECFLOAT DECFLOAT スカラー関数
CHAR CHAR スカラー関数
VARCHAR VARCHAR スカラー関数
CLOB CLOB スカラー関数
GRAPHIC GRAPHIC スカラー関数
VARGRAPHIC VARGRAPHIC スカラー関数
DBCLOB DBCLOB スカラー関数
BINARY BINARY スカラー関数
VARBINARY VARBINARY スカラー関数
BLOB BLOB スカラー関数
日数 DATE スカラー関数
時刻 TIME スカラー関数
TIMESTAMP ソース・タイプが文字ストリングの場合は、1 つのオペランドが指定されている TIMESTAMP スカラー関数を参照してください。 ソース・データ・タイプが DATE の場合、タイム・スタンプは指定された日付と時刻 00:00:00 から構成されます。
BOOLEAN BOOLEAN スカラー関数

XML 以外の値から XML 値へのキャスト

表 3. XML 以外の値から XML 値への、サポートされているキャスト
ソース・データ・タイプ ターゲット・データ・タイプ
XML 結果の XML スキーマ型
SMALLINT Y xs:short
INTEGER Y xs:int
BIGINT Y xs:long
DECIMAL または NUMERIC Y xs:decimal
REAL Y xs:float
DOUBLE Y xs:double
DECFLOAT N -
CHAR Y xs:string
VARCHAR Y xs:string
CLOB Y xs:string
GRAPHIC Y xs:string
VARGRAPHIC Y xs:string
DBCLOB Y xs:string
日数 Y xs:date
時刻 Y xs:time
TIMESTAMP Y xs:dateTime1
BLOB Y xs:base64Binary
BOOLEAN Y xs:boolean
文字タイプ FOR BIT DATA Y xs:base64Binary
特殊タイプ   この図表は、特殊タイプのソース・タイプで使用してください。
注記

1 ソース・データ・タイプの TIMESTAMP では、0 から 12 までのタイム・スタンプの精度をサポートします。 xs:dateTime の秒の小数部の最大精度は 6 です。 TIMESTAMP ソース・データ・タイプのタイム・スタンプ精度が 6 を超えている場合、xs:dateTime にキャストすると値が切り捨てられます。

データ・タイプ LONG VARCHAR と LONG VARGRAPHIC は、引き続きサポートされていますが、非推奨になっており、将来のリリースで除去される可能性があります。

文字ストリング値を XML 値にキャストする場合、その結果の xs:string アトミック値に、不正な XML 文字が入っていてはなりません (SQLSTATE 0N002)。 入力文字ストリングが Unicode でない場合、入力文字は Unicode に変換されます。

SQL バイナリー形式へキャストすると、その結果は、タイプが xs:base64Binary の XQuery アトミック値になります。

XML 値から XML 以外の値へのキャスト

XML 値から XML 以外の値への XMLCAST は、2 つのキャストに分かれます。つまり、ソースの XML 値を、SQL ターゲット・タイプに対応する XQuery タイプに変換する XQuery キャストと、その後に続く、対応する XQuery タイプから実際の SQL タイプへのキャストです。

XMLCAST がサポートされるのは、ターゲット・タイプに対応する、サポートされた XQuery ターゲット・タイプがあり、かつソース値のタイプから対応する XQuery ターゲット・タイプへの、サポートされた XQuery キャストがある場合です。 XQuery キャストで使用されるターゲット・タイプは、対応する XQuery ターゲット・タイプを基にしたものであり、さらに別の制約事項を伴う場合があります。

以下の表は、そのような変換の結果の XQuery タイプを一覧で示しています。

表 4. XML 値から XML 以外の値への、サポートされているキャスト
ターゲット・データ・タイプ ソース・データ・タイプ
XML 対応する XQuery ターゲット・タイプ
SMALLINT Y xs:short
INTEGER Y xs:int
BIGINT Y xs:long
DECIMAL または NUMERIC Y xs:decimal
REAL Y xs:float
DOUBLE Y xs:double
DECFLOAT Y 一致するタイプがありません1
CHAR Y xs:string
VARCHAR Y xs:string
CLOB Y xs:string
GRAPHIC Y xs:string
VARGRAPHIC Y xs:string
DBCLOB Y xs:string
日数 Y xs:date
TIME (時間帯なし) Y xs:time
TIMESTAMP (時間帯なし) Y xs:dateTime2
BLOB Y xs:base64Binary
BOOLEAN Y xs:boolean
CHAR FOR BIT DATA N キャスト不能
VARCHAR FOR BIT DATA Y xs:base64Binary
特殊タイプ   この図表は、特殊タイプのソース・タイプで使用してください。
行、参照、構造化されたデータ・タイプまたは抽象データ・タイプ (ADT)、その他 N キャスト不能
注記
1 XML スキーマ 1.0 がサポートされますが、これは DECFLOAT に一致する XML スキーマ・タイプを提供していません。 XMLCAST の XQuery キャストの手順の処理は、以下のように処理されます。
  • ソース値が XML スキーマの数値タイプで入力される場合、その数値タイプを使用します。
  • ソース値が XML スキーマ・タイプ xs:boolean で入力される場合、xs:double を使用します。
  • それ以外の場合、有効な数値形式の追加検査をして、xs:string を使用します。

2 xs:dateTime の秒の小数部の最大精度は 6 です。 ソース・データ・タイプの TIMESTAMP は、0 から 12 のタイム・スタンプの精度をサポートします。 TIMESTAMP のターゲット・データ・タイプのタイム・スタンプの精度が 6 より小さい場合、xs:dateTime からキャストすると値は切り捨てられます。 TIMESTAMP のターゲット・データ・タイプのタイム・スタンプの精度が 6 を超える場合、xs:dateTime からキャストすると値にはゼロが埋め込まれます。

以下の制約の場合、制約から派生する XML スキーマ・データ・タイプが、XQuery キャストのターゲット・データ・タイプとして効果的に使用されます。
  • CHAR および VARCHAR 以外のストリング・タイプに変換される XML 値は、文字またはバイトの切り捨てなしに、それらのデータ・タイプの長さ制限に収まらなければなりません。 派生する XML スキーマ・タイプに使用される名前は、大文字の SQL タイプ名の後に、下線文字とストリングの最大長が続いたものになります。例えば、XMLCAST ターゲット・データ・タイプが CLOB(1M) の場合は CLOB_1048576 となります。

    XML 値が CHAR または VARCHAR いずれかのタイプに変換されるときに、そのタイプの最大長が短くてすべてのデータを入れることができない場合、指定データ・タイプに収まるようにデータが切り捨てられます。このとき、エラーは返されません。 非ブランク文字が切り捨てされる場合、警告 (SQLSTATE 01004) が返されます。 値の切り捨てによってマルチバイト文字が切り捨てられることになる場合、マルチバイト文字全体が除去されます。 そのため、切り捨てによって生成されるストリングは、予想より短くなる場合もあります。 例えば文字 ñ は、UTF-8 では「C3B1」という 2 バイトで表されます。この文字が VARCHAR (1) としてキャストされて「C3 B1」が 1 バイトに切り捨てられると、文字の「C3」の部分が残ります。 この文字の一部となる「C3」も除去されるため、最終結果は空ストリングになります。

  • DECIMAL 値に変換される XML 値には、小数点の前 (左側) に (precision - scale) を超える桁数を含めることはできません。scale (位取り) を超える小数点以下の余分の桁は切り捨てられます。 派生する XML スキーマ・タイプに使用される名前は、DECIMAL_precision_scale となります。ただし、precision は、ターゲットの SQL データ・タイプの精度であり、scale は、ターゲットの SQL データ・タイプの位取りです。例えば、XMLCAST ターゲット・データ・タイプが DECIMAL(9,2) の場合は、DECIMAL_9_2 となります。
  • TIME 値に変換される XML 値内には、小数点以降にゼロ以外の数字をもった秒コンポーネントを置くことはできません。 派生する XML スキーマ・タイプに使用される名前は、TIME です。

派生した XML スキーマ・タイプ名がメッセージ中に現れるのは、XML 値が、制約事項のいずれかに合致しない場合だけです。 このタイプ名はエラー・メッセージの理解に役立ちますが、定義済みのどの XQuery タイプにも対応しません。 入力値が、派生した XML スキーマ・タイプ (対応する XQuery ターゲット・タイプ) の基本タイプに準拠しない場合、エラー・メッセージには、そのタイプが代わりに示されることがあります。 このような、派生した XML スキーマ・タイプ名のフォーマットは、将来変更される可能性があるので、プログラミング・インターフェースとして使用しないでください。

XQuery キャストでの XML 値の処理の前に、シーケンス中のすべての文書ノードは除去され、除去された文書ノードの直接の子はそれぞれ、そのシーケンス中の項目になります。 文書ノードが複数の直接下位ノードをもっていた場合、改訂後のシーケンスの項目数は、元のシーケンスより多くなります。 次に、XQuery fn:data 関数を使用して、文書ノードのない XML 値が原子化されます。 その結果として生じる原子化シーケンス値は XQuery キャストで使用されます。 原子化シーケンス値が空のシーケンスである場合、 それ以上の処理を行うことなく、キャストから NULL 値が戻されます。 原子化シーケンス値に複数の項目があると、エラーが戻されます (SQLSTATE 10507)。

XMLCAST のターゲット・タイプが SQL データ・タイプの DATE、TIME、または TIMESTAMP である場合、XQuery キャストの結果の XML 値も UTC に調整され、その値の時間帯コンポーネントは除去されます。

対応する XQuery ターゲット・タイプ値から SQL ターゲット・タイプへの変換時には、xs:base64Binary や xs:hexBinary などのバイナリーの XML データ・タイプは、文字フォームから実際のバイナリー・データに変換されます。

INF、-INF、または NaN の xs:double または xs:float 値を SQL データ・タイプ DOUBLE または REAL 値にキャストする (XMLCAST を使用して) と、エラーが戻されます (SQLSTATE 22003)。 -0 の xs:double または xs:float 値は、+0 に変換されます。

ソース・オペランドがユーザー定義特殊タイプでない場合、ターゲット・タイプはユーザー定義特殊タイプであっても構いません。 そのような場合、XMLCAST 仕様を使用してソース値がユーザー定義特殊タイプ (つまり、ターゲット・タイプ) のソース・タイプにキャストされた後、CAST 仕様を使用してこの値がユーザー定義特殊タイプにキャストされます。

非 Unicode データベースでは、XML 値から XML 以外のターゲット・タイプへのキャストに、内部の UTF-8 形式からデータベース・コード・ページへのコード・ページ変換が含まれます。 この変換は、XML 値のコード・ポイントがデータベース・コード・ページに存在しない場合に、置換文字を導入する結果になります。