データ型の同値化により、Oracleで入力データを解釈する方法と出力データの書式を設定する方法をカスタマイズできます。サポートされているホスト言語のデータ型は、変数ごとにOracleの外部データ型に同値化できます。
データ型の同値化は、いくつかの点で役に立ちます。たとえば、COBOLプログラムでNULLで終了するホスト文字列を使用するとします。PIC Xホスト変数を宣言した後で、これを常にNULLで終了する外部データ型STRINGに同値化できます。
Oracleにデータを格納するが、解釈はしないという場合に、データ型の同値化を使用できます。たとえば、LONG RAWデータベース列に整数のホスト配列を格納する場合、ホスト配列を外部データ型LONG RAWに同値化できます。
また、デフォルトのデータ型変換をオーバーライドする場合にもデータ型の同値化を使用できます。Oracle初期化ファイルのグローバリゼーション・サポート・パラメータで特に指定されていない場合、DATE列値を選択して文字ホスト変数に入れると、Oracleからは次のような書式の9バイトの文字列が戻されます。
DD-MON-YY
ただし、文字ホスト変数をDATE外部データ型に同値化すると、内部書式の7バイトの値が戻されます。
デフォルトでは、Oracleプリコンパイラは、すべてのホスト変数に特定の外部データ型を割り当てます。(これらのデフォルトの割当ては、このマニュアルに対する補足資料で表にまとめられています。)デフォルトの割当ては、宣言部でホスト変数をOracleの外部データ型に同値化することによりオーバーライドできます。これをホスト変数の同値化と呼びます。
EXEC SQL VAR <host_variable>
IS <ext_type_name> [({<length> | <precision>,<scale>})];
ここで、host_variableは、宣言部で先に宣言された入力または出力ホスト変数(あるいはホスト配列)です。VARCHARおよびVARRAW外部データ型が2バイト長のフィールドで、nバイトのデータ・フィールドが続く場合、nの値の範囲は1から65533になります。そのため、type_nameがVARCHARまたはVARRAWの場合、host_variableには少なくとも3バイトの長さが必要です。
LONG VARCHARおよびLONG VARRAW外部データ型が4バイト長のフィールドで、nバイトのデータ・フィールドが続く場合、nの値の範囲は1から2147483643になります。そのため、type_nameがLONG VARCHARまたはLONG VARRAWの場合、host_variableには少なくとも5バイトの長さが必要です。
ext_type_nameは、RAWやSTRINGなどの有効な外部データ型の名前です。
lengthは、有効な長さをバイトで指定する整数リテラルです。lengthの値は、外部データ型を指定するのに十分な長さにする必要があります。
type_nameがDECIMALまたはDISPLAYの場合は、lengthではなく、precisionおよびscaleを指定する必要があります。type_nameがVARNUM、ROWIDまたはDATEの場合、lengthは事前に定義されているために指定できません。他の外部データ型の場合、lengthはオプションです。デフォルトでhost_variableの長さに設定されます。
lengthを指定するとき、type_nameがVARCHAR、VARRAW、LONG VARCHARまたはLONG VARRAWの場合、データ・フィールドの最大長を使用してください。プリコンパイラでは、lengthフィールドの説明をします。type_nameがLONG VARCHARまたはLONG VARRAWで、データ・フィールドが65533バイトを超える場合は、lengthフィールドに-1を指定してください。
precisionとscaleは、それぞれ有効数字の数値と四捨五入が発生する位置を表します。たとえば、scaleが2の場合、値は小数第2位に値が四捨五入されることを意味します(3.456は3.46になります)、scaleが-3のときは、1000の位に値が四捨五入されます(3456は3000になります)。
1から99までのprecisionおよび-84から99までのscaleを指定できます。ただし、データベース列の精度および位取りの最大値は、それぞれ38と127です。したがって、precisionが38を超えていると、host_variableの値はデータベース列に挿入できません。ただし、列値のscaleが99を超えると、host_variableに入れる値の選択もフェッチもできません。
precisionおよびscaleは、type_nameがDECIMALまたはDISPLAYの場合にのみ指定してください。
表3-7は、各外部データ型に使用されるパラメータを示しています。
EMP表から従業員名を選択し、NULLで終了する文字列が期待されるルーチンに渡すとします。これらの名前に、明示的にヌル終端文字を付ける必要はありません。次のように、ホスト変数をSTRING外部データ型に同値化するのみです。
EXEC SQL BEGIN DECLARE SECTION; ... emp_name CHARACTER(11); EXEC SQL VAR emp_name IS STRING (11); EXEC SQL END DECLARE SECTION;
ENAME列の幅は10文字のため、ヌル終端文字を含めるために、新しいemp_nameに11文字を割り当てます。(lengthのデフォルト値はホスト変数の長さのため、lengthの指定は任意です。)ENAME列からemp_nameに入れる値をSELECTする場合、Oracleにより値はヌル文字で終了します。
表3-7 外部データ型のパラメータ
| 外部データ型 | 長さ | 精度 | スケール | デフォルトの長さ |
|---|---|---|---|---|
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
n/a |
n/a |
n/a |
7バイト |
|
n/a |
必須 |
必須 |
なし |
|
n/a |
必須 |
必須 |
なし |
|
オプション(4または8) |
n/a |
n/a |
変数の宣言長 |
|
オプション(1、2または4) |
n/a |
n/a |
変数の宣言長 |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
必須(注意1) |
n/a |
n/a |
なし |
|
必須(注意1) |
n/a |
n/a |
なし |
|
必須 |
n/a |
n/a |
なし |
|
n/a |
n/a |
n/a |
該当なし |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
n/a |
n/a |
n/a |
13バイト(注意2) |
|
オプション(1、2または4) |
n/a |
n/a |
変数の宣言長 |
|
必須 |
n/a |
n/a |
なし |
|
オプション |
n/a |
n/a |
変数の宣言長 |
|
n/a |
n/a |
n/a |
22バイト |
|
オプション |
n/a |
n/a |
なし |
注意:
データ・フィールドが65,533バイトを超える場合は、-1を渡します。
一般的な値ですが、デフォルトはポートによって異なります。
VAR文およびTYPE文でデータ型指定子CHARFを使用すると、DBMSの設定に関係なく、ホスト言語のデータ型を固定長のANSIデータ型CHARに同値化できます。
MODE=ANSIの場合、TYPE文でデータ型CHARを指定すると、ホスト言語のデータ型は固定長のANSIデータ型CHAR(Oracleの外部データ型コード96)に同値化されます。ただし、MODE=ORACLEの場合、ホスト言語のデータ型は、ユーザーの意向に関係なく、可変長データ型VARCHAR2(コード1)に同値化されます。
ただし、ホスト言語のデータ型はいつでも固定長のANSIデータ型CHARに同値化できます。これには、VAR文でデータ型CHARFを指定します。CHARFを使用すると、MODE=ORACLEに設定されている場合でも、ホスト言語のデータ型は固定長のANSIデータ型CHARに同値化されます。
VARNUM値またはDATE値を入力するには、必ずOracleの内部形式で入力してください。Oracleでは、VARNUM値およびDATE値の出力には内部形式が使用されます。
列値を選択してVARNUMホスト変数に格納した後、先頭のバイトをチェックすれば値の長さがわかります。表3-8では、戻されるVARNUM値の例を示しています。
表3-8 戻されるVARNUM値の例
| 10進数 | VARNUM値の長さ(バイト) | VARNUM値の指数(バイト) | VARNUM値の仮数(バイト) | VARNUM値の終了文字(バイト) |
|---|---|---|---|---|
0 |
1 |
128 |
na |
na |
5 |
2 |
193 |
6 |
na |
-5 |
3 |
62 |
96 |
102 |
2767 |
3 |
194 |
28, 68 |
na |
-2767 |
4 |
61 |
74, 34 |
102 |
100000 |
2 |
195 |
11 |
na |
abcdefg |
5 |
196 |
2, 24, 46, 68 |
na |
DATE値は、通常、プログラムによる値の出力(たとえば、表示)や入力に使用されめ、DD-MON-YYなどの文字書式に変換してください。
適したOracleの外部データ型がない場合は、VARCHAR2ベースまたはRAWベースの外部データ型を使用してください。