ホスト変数は、使用方法によって出力ホスト変数または入力ホスト変数と呼ばれます。
SELECT文またはFETCH文のINTO句内のホスト変数は、Oracleによって出力される列の値が入るため出力ホスト変数と呼ばれます。Oracleは、列の値をINTO句内の対応する出力ホスト変数に割り当てます。
SQL文のその他のホスト変数の値は、プログラムがそれをOracleに入力するため、すべて入力ホスト変数と呼ばれます。たとえば、INSERT文のVALUES句内およびUPDATE文のSET句内では入力ホスト変数を使用します。入力ホスト変数はWHERE句、HAVING句およびFOR句内でも使用されます。入力ホスト変数は、SQL文で値または式を使用できる位置であればどこにでも使用できます。
注意:
ORDER BY句ではホスト変数が使用できますが、定数またはリテラルとして扱われるのでホスト変数の内容は無効になります。たとえば、次のようなSQL文があるとします。
EXEC SQL SELECT ename, empno INTO :name,:number FROM emp ORDER BY :ord;
ここでは、入力ホスト変数:ordが含まれているように見えます。しかし、この句のホスト変数は、定数として扱われ、:ordの値にかかわらず、順序付けは行われません。
入力ホスト変数は、SQLキーワードまたはデータベース・オブジェクトの名前を指定するためには使用できません。つまり、ALTER、CREATE、DROPなどのデータ定義文内で入力ホスト変数は使用できません。次の例のDROP TABLE文は無効です。
char table_name[30];
printf("Table name? ");
gets(table_name);
EXEC SQL DROP TABLE :table_name; -- host variable not allowed
データベース・オブジェクト名を実行時に変更する必要があるときは、動的SQLを使用します。Oracle動的SQLも参照してください。
入力ホスト変数を含むSQL文をOracleで実行する前に、それらの入力ホスト変数に値を割り当てる必要があります。次に例を示します。
int emp_number;
char temp[20];
VARCHAR emp_name[20];
/* get values for input host variables */
printf("Employee number? ");
gets(temp);
emp_number = atoi(temp);
printf("Employee name? ");
gets(emp_name.arr);
emp_name.len = strlen(emp_name.arr);
EXEC SQL INSERT INTO EMP (EMPNO, ENAME)
VALUES (:emp_number, :emp_name);
INSERT文のVALUES句内で入力ホスト変数の前にコロンが付いていることに注意してください。