PACK スカラー関数
PACK 関数は、データ・タイプ配列が含まれるバイナリー・ストリング値、および NULL 以外の各 expression 引数のパック表記を返します。
スキーマは SYSIBM です。
- CCSID 1208
- 文字ストリング値のエンコードに CCSID 1208 を使用することを指定します。
- CCSID DEFAULT
- 文字ストリングを元のエンコード方式でそのままパックして、CCSID 変換を行わないことを指定します。
- 式
- 結果のストリング内にエンコードする値を返す式。 expression は、DECFLOAT、GRAPHIC、VARGRAPHIC、ROWID、LOB、または XML 以外の組み込みデータ・タイプ、または FOR BIT DATA として指定された文字ストリングでなければなりません。
PACK 関数の結果は、以下の項目から構成されるバイナリー・ストリングです。
- 将来の利用のために予約されているフラグ・バイト
- 結果ストリング内にエンコードされている引数の数を示す 2 バイトの整数値
- エンコードされた引数ごとのデータ・タイプ情報を示すエレメントが格納されたデータ・タイプ配列
- expression 引数のエンコードされた値 (関数呼び出しで指定された順)
結果のバイナリー・ストリングは、以下のフォーマットに設定されます。
| 2 バイト長 | フラグ・バイト | 項目数 | データ・タイプ配列 | エンコードされたデータ値 |
|---|---|---|---|---|
| VARBINARY の長さ | VARBINARY データ | |||
データ・タイプ配列には、expression 引数ごとのエレメントが、関数呼び出しで指定された順と同じ順序で格納されます。 各配列エレメントには、対応する式のデータ・タイプを示す 2 バイトの SQLTYPE 値が含まれます。 SQLTYPE 値が奇数の数値である場合、対応する式は NULL 値を表し、その値は結果のストリング内でエンコードされません。 SQLTYPE 値が偶数の数値である場合、結果のストリングには、データ・タイプに応じてエンコードされた値の表現が含まれます。 以下の表で、データ・タイプについて説明します。
| 式のデータ・タイプ | 結果のストリング内でエンコードされた値の表現の説明 |
|---|---|
| SMALLINT、INTEGER、または BIGINT | データ・タイプによって 16 ビットの符号付き 2 進整数、32 ビットの符号付き 2 進整数、または 64 ビットの符号付き 2 進整数のいずれかで表記された式の値 |
| dec imal( p,s)1 | 1 バイトの精度 p、1 バイトの位取り s、および (p+2)/2 バイトの符号付きパック 10 進数のシーケンス |
| real2 または double3 | 64 ビットの IEEE 浮動小数点フォーマットでの expression の値 |
| CHAR または VARCHAR | ストリング・エンコード方式の 2 バイトの CCSID、その後に 2 バイト長のストリング、次に指定された CCSID エンコード方式の引数データが続くシーケンス |
| BINARY または VARBINARY | 2 バイト長のストリング、その後に引数データが続くシーケンス |
| 日付 | YYYYMMDD 形式の日付を表す 4 バイトの符号なしパック 10 進数表現 |
| 時刻 | HHMMSS 形式の時刻を表す 3 バイトの符号なしパック 10 進数表現 |
| タイムゾーンなしのタイムスタンプ (p ) | 精度 p の 2 バイトの符号なし 2 進整数値、その後に YYYYMMDDHHMMSSNN 形式のタイム・スタンプを表す 7+ (p+1)/2 バイトの符号なしパック 10 進数表現 (ここで、NN は、精度 p に応じた 0 から 6 バイトまでの端数秒) が続くシーケンス |
| TIMESTAMP(p) WITH TIME ZONE | 精度 p の 2 バイトの符号なし 2 進整数値、その後に YYYYMMDDHHMMSSNN 形式のタイム・スタンプを表す 7+ (p+1)/2 バイトの符号なしパック 10 進数表現 (ここで、NN は、精度 p に応じたゼロから 6 バイトまでの端数秒)、タイム・ゾーンを表す 2 バイトの符号なしパック 10 進数表現 (負のタイム・ゾーン値の場合は、最高位ビットが設定されます) が続くシーケンス |
注: 小文字のデータ型は、以下のように定義されています
|
|
すべての数値データはビッグ・エンディアン形式で表現されます。
関数の結果は VARBINARY です。 結果の長さ属性は MIN (32704, ヘッダーの長さ + データ・タイプ配列の長さ + SUM(エンコードされた式の値の最大長) ) です。 結果を null にすることはできません。
例 1: 以下のステートメントは、VARCHAR、DATE、および DOUBLE の値がバイナリー・ストリングにパックされてから、そのストリングがアプリケーションに返されることを示しています。
SELECT PACK(CCSID 1208, 'Alina', DATE'1977-08-01', DOUBLE(0.5))
FROM SYSIBM.SYSDUMMYU;このステートメントは、以下の内容の VARBINARY ストリングを返します (この結果は 16 進形式で表示され、読みやすさのためにスペース区切り文字が入れられています。 実際の結果は 16 進形式ではなく、スペース区切り文字は入りません)。
00 0003 01C4 0180 01E0 04B80005416C696E61 19770801 3FE0000000000000文字ストリング「Alina」は、このストリングの元のエンコード方式に関わらず、UTF-8 (CCSID 1208) 形式です。これは、PACK 呼び出しに CCSID 1208 が指定されているためです。
結果のストリングは VARBINARY(30) です。 長さ属性 30 は、以下のエレメントによって決定されます。
- 1 (フラグ・バイト)
- +2 (項目数のサイズ)
- +2*3 (2 バイトのデータ・タイプと項目数の乗算)
- +2 (CCSID) + 2 (長さ) + 5 (VARCHAR(5) データ長)
- +4 (DATE データ長)
- +8 (DOUBLE の長さ)
結果の実際の長さも 30 です。
例 2: 以下のステートメントは、NULL 値がバイナリー・ストリングにパックされると、結果のエンコードされた値の部分のスペースを NULL 値が占有しないことを示しています。
SELECT PACK(CCSID DEFAULT, '', CAST(NULL AS TIME),
CAST('Bridget' AS VARCHAR(20) CCSID EBCDIC))
FROM SYSIBM.SYSDUMMYU;
このステートメントは、以下の内容の VARBINARY ストリングを返します。 (下記の結果は 16 進形式で表示され、読みやすさのためにスペース区切り文字が入れられています。 実際の結果は 16 進形式ではなく、スペース区切り文字は入っていません)。
00 0003 01C4 0185 01C4 04B80000 00250007C2D9C9C4C7C5E3文字ストリング '' (空ストリング) は、元の CCSID 1208 形式にパックされ、'Bridget' は元の CCSID 37 形式にパックされます。これは、PACK 呼び出しに CCSID DEFAULT が指定されているためです。
結果のストリングは VARBINARY(40) です。 長さ属性 40 は、以下のエレメントによって決定されます。
- 1 (フラグ・バイト)
- +2 (項目数のサイズ)
- +2*3 (2 バイトのデータ・タイプと項目数の乗算)
- +2 (CCSID) + 2 (長さ) + 0 (空ストリングのデータ長)
- +3 (TIME データ長)
- +2 (CCSID) + 2 (長さ) + 20 (VARCHAR(20) 最大長)
結果のストリングの実際の長さは 24 です。これは、以下のエレメントによって決まります。
- 1 (フラグ・バイト)
- +2 (項目数のサイズ)
- +2*3 (2 バイトのデータ・タイプと項目数の乗算)
- +2 (CCSID) + 2 (長さ) + 0 (空ストリングのデータ長)
- +0 (NULL)
- +2 (CCSID) + 2 (長さ) + 7 (VARCHAR(20) 実際の長さ)
