ホスト変数は、ホスト・プログラムと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++では、ホスト変数の宣言時にauto、externおよび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する場合は、最大長を指定する必要があります。
ホスト変数は、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());