プライマリ・コンテンツに移動
Oracle® Database Oracleプリコンパイラのためのプログラマーズ・ガイド
12c リリース1 (12.1)
B71398-03
目次へ移動
目次
索引へ移動
索引

前
次

データ型の同値化

データ型の同値化により、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_nameVARCHARまたはVARRAWの場合、host_variableには少なくとも3バイトの長さが必要です。

LONG VARCHARおよびLONG VARRAW外部データ型が4バイト長のフィールドで、nバイトのデータ・フィールドが続く場合、nの値の範囲は1から2147483643になります。そのため、type_nameLONG VARCHARまたはLONG VARRAWの場合、host_variableには少なくとも5バイトの長さが必要です。

ext_type_nameは、RAWSTRINGなどの有効な外部データ型の名前です。

lengthは、有効な長さをバイトで指定する整数リテラルです。lengthの値は、外部データ型を指定するのに十分な長さにする必要があります。

type_nameDECIMALまたはDISPLAYの場合は、lengthではなく、precisionおよびscaleを指定する必要があります。type_nameVARNUMROWIDまたはDATEの場合、lengthは事前に定義されているために指定できません。他の外部データ型の場合、lengthはオプションです。デフォルトでhost_variableの長さに設定されます。

lengthを指定するとき、type_nameVARCHARVARRAWLONG VARCHARまたはLONG VARRAWの場合、データ・フィールドの最大長を使用してください。プリコンパイラでは、lengthフィールドの説明をします。type_nameLONG VARCHARまたはLONG VARRAWで、データ・フィールドが65533バイトを超える場合は、lengthフィールドに-1を指定してください。

precisionscaleは、それぞれ有効数字の数値と四捨五入が発生する位置を表します。たとえば、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_nameDECIMALまたは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 外部データ型のパラメータ

外部データ型 長さ 精度 スケール デフォルトの長さ

CHAR

オプション

n/a

n/a

変数の宣言長

CHARZ

オプション

n/a

n/a

変数の宣言長

DATE

n/a

n/a

n/a

7バイト

DECIMAL

n/a

必須

必須

なし

DISPLAY

n/a

必須

必須

なし

FLOAT

オプション(4または8)

n/a

n/a

変数の宣言長

INTEGER

オプション(1、2または4)

n/a

n/a

変数の宣言長

LONG

オプション

n/a

n/a

変数の宣言長

LONG RAW

オプション

n/a

n/a

変数の宣言長

LONG VARCHAR

必須(注意1)

n/a

n/a

なし

LONG VARRAW

必須(注意1)

n/a

n/a

なし

MLSLABEL

必須

n/a

n/a

なし

NUMBER

n/a

n/a

n/a

該当なし

STRING

オプション

n/a

n/a

変数の宣言長

RAW

オプション

n/a

n/a

変数の宣言長

ROWID

n/a

n/a

n/a

13バイト(注意2)

UNSIGNED

オプション(1、2または4)

n/a

n/a

変数の宣言長

VARCHAR

必須

n/a

n/a

なし

VARCHAR2

オプション

n/a

n/a

変数の宣言長

VARNUM

n/a

n/a

n/a

22バイト

VARRAW

オプション

n/a

n/a

なし

注意:

  1. データ・フィールドが65,533バイトを超える場合は、-1を渡します。

  2. 一般的な値ですが、デフォルトはポートによって異なります。

CHARFデータ型指定子の使用について

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ベースの外部データ型を使用してください。