プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

ホスト変数

ホスト変数は、ホスト・プログラムとOracle間の通信に重要な役割を果します。通常、プリコンパイラ・プログラムがホスト変数からOracleにデータを入力し、Oracleがプログラム内のホスト変数にデータを出力します。Oracleは入力データをデータベース列に格納し、出力データをプログラムのホスト変数に格納します。

ホスト変数には、スカラー型として解決される任意のC言語の式を指定してもかまいません。ただし、ホスト変数も左辺値であることが必要です。ほとんどのホスト変数のホスト配列もサポートされています。

関連項目:

ポインタ変数

ホスト変数の宣言

ホスト変数は、Oracleプログラム・インタフェースでサポートされているC言語のデータ型を指定して、Cプログラム言語の規則に従って宣言します。このC言語のデータ型には、ソースまたはターゲットのデータベース列のデータ型との互換性が必要です。

MODE=ORACLEの場合、特別な宣言部でホスト変数を宣言する必要はありません。ただし、宣言部がANSI SQL標準の一部である場合に宣言部を使用しないと、FIPSフラガーで警告が発行されます。 CODE=CPP(C++コードのコンパイル中)、PARSE=NONEまたはPARSE=PARTIALの場合は、宣言部を使用する必要があります。

表4-4は、C言語のデータ型と、ホスト変数の宣言時に使用できる疑似型を示しています。ホスト変数に使用できるのは、これらのデータ型のみです。

表4-4 ホスト変数のC言語のデータ型

C言語のデータ型または疑似型 説明

char

単一文字

char[n]

n文字配列(文字列)

int

integer

short

小さい整数

long

大きい整数

long long

きわめて大きい整数(8バイト)

float

浮動小数点数(通常は単精度)

double

浮動小数点数(通常は倍精度)

VARCHAR[n]

可変長文字列

表4-5は、互換性のあるOracleの内部データ型を示しています。

表4-5 C言語とOracleのデータ型の互換性

内部型 C言語のデータ型 説明

VARCHAR2(Y)

(注意1)

char

単一文字

CHAR(X)

(注意1)

char[n]

VARCHAR[n]

int

short

long

long long

float

double

nバイトの文字配列

nバイトの可変長文字配列

integer

小さい整数

大きい整数

きわめて大きい整数(8バイト)

浮動小数点数

倍精度浮動小数点

number

NUMBER

int

integer

NUMBER(P,S)

(注意2)

short

int

long

float

double

char

char[n]

VARCHAR[n]

小さい整数

integer

大きい整数

浮動小数点数

倍精度浮動小数点

number

単一文字

nバイトの文字配列

nバイトの可変長文字配列

DATE

char[n]

VARCHAR[n]

nバイトの文字配列

nバイトの可変長文字配列

LONG

char[n]

VARCHAR[n]

nバイトの文字配列

nバイトの可変長文字配列

RAW(X)

(注意1)

unsigned char[n]

VARCHAR[n]

nバイトの文字配列

nバイトの可変長文字配列

LONG RAW

unsigned char[n]

VARCHAR[n]

nバイトの文字配列

nバイトの可変長文字配列

ROWID

unsigned char[n]

VARCHAR[n]

nバイトの文字配列

nバイトの可変長文字配列

注意:

1. Xの範囲は1から2000で、デフォルト値は1です。Yの範囲は1から4000です。

2. Pの範囲は1から38です。Sの範囲は-84から127です。

単純なC言語のデータ型の1次元配列は、ホスト変数としての役割も果します。char[n]およびVARCHAR[n]の場合、nには文字列の最大長を指定します(配列内にある文字列の数ではありません)。2次元配列を指定できるのは、char[m][n]およびVARCHAR[m][n]の場合のみです。mには配列内の文字列の数を指定し、nには文字列の最大長を指定します。

単純なC言語のデータ型へのポインタがサポートされています。char[n]およびVARCHAR[n]変数へのポインタは、charまたはVARCHAR(長さの指定なし)へのポインタとして宣言する必要があります。ただし、ポインタの配列はサポートされていません。

記憶域クラス指定子

Pro*C/C++では、ホスト変数の宣言時にautoexternおよびstatic記憶域クラス指定子を使用できます。ただし、プリコンパイラはホスト変数の前にアンパサンド(&)を挿入することでアドレスを取得するため、register記憶域クラス指定子を使用してホスト変数を格納することはできません。C言語の規則に従うと、auto記憶域クラス指定子を使用できるのはブロック内のみです。

ANSI C規格に準拠するために、Pro*C/C++プリコンパイラでは次のように、最大長の指定の有無にかかわらず、extern char[n]ホスト変数を宣言できます。

extern char  protocol[15]; 
extern char  msg[]; 

ただし、最大長は常に指定する必要があります。前述の例で、あるプリコンパイル・ユニットで宣言された出力ホスト変数msgが、他のプリコンパイル・ユニットで定義された場合、プリコンパイラではその最大長を認識する方法がありません。2番目のプリコンパイル・ユニットのmsgに十分な記憶域を割り当てないと、メモリーが破損することがあります。(十分な記憶域とは通常、ホスト変数にSELECTまたはFETCHされる可能性のある最長の列値のバイト数に、ヌル終端文字が付く場合に備えた1バイトを加えた値です。)

extern char[ ]ホスト変数の最大長を指定しない場合、プリコンパイラから警告メッセージが発行されます。また、ホスト変数にはCHARACTER列値が格納されるとみなされますが、この値の長さは255文字以内にする必要があります。したがって、長さ256文字以上のVARCHAR2またはLONG列値をホスト変数にSELECTまたはFETCHする場合は、最大長を指定する必要があります

型修飾子

ホスト変数の宣言時には、constおよびvolatile型修飾子も使用できます。

constホスト変数は定数を持つ必要があります。つまり、プログラムではその初期値を変更できません。volatileホスト変数の値は、プログラムでは認識されない方法で(システムに接続されたデバイスなどにより)変更されることがあります。

ホスト変数の参照

ホスト変数は、SQL DML文で使用します。SQL文中ではホスト変数の先頭にコロン(:)を付ける必要がありますが、C言語の文中では先頭にコロンを付けないでください。次に例を示します。

char    buf[15];
int     emp_number; 
float   salary; 
... 
gets(buf); 
emp_number = atoi(buf); 

EXEC SQL SELECT sal INTO :salary FROM emp 
    WHERE empno = :emp_number; 

わかりにくくなる可能性もありますが、次のように、ホスト変数にOracleの表または列と同じ名前を付けることもできます。

int     empno; 
char    ename[10]; 
float   sal; 
... 
EXEC SQL SELECT ename, sal INTO :ename, :sal FROM emp 
    WHERE empno = :empno; 

制約

ホスト変数名はC識別子であるため、宣言および参照時には大/小文字区別を一致させる必要があります。ホスト変数は、列、表またはSQL文中の他のOracleオブジェクトでは置換できません。また、Oracle予約語も使用できません。

ホスト変数は、プログラムのアドレスに設定する必要があります。このため、関数コールおよび数値式はホスト変数に指定できません。次のコードは無効です。

#define MAX_EMP_NUM    9000 
... 
int get_dept(); 
... 
EXEC SQL INSERT INTO emp (empno, ename, deptno) VALUES 
    (:MAX_EMP_NUM + 10, 'CHEN', :get_dept());