どのプリコンパイラ・オプションも、コマンドラインに入力できます。また、その多くは、EXEC ORACLE OPTION文を使用してプリコンパイラ・プログラムのソース・ファイルにインライン入力できます。
次の構文を使用してEXEC ORACLE文を記述すると、オプションをインライン入力できます。
EXEC ORACLE OPTION (OPTION_NAME=value);
たとえば、次のように記述します。
EXEC ORACLE OPTION (RELEASE_CURSOR=yes);
EXEC ORACLE機能は、プリコンパイル中にオプション値を変更する場合に特に便利です。たとえば、HOLD_CURSORとRELEASE_CURSORを1文単位で変更する場合があります。
関連項目:
インライン・オプションを使用して実行時パフォーマンスを最適化する方法は、パフォーマンス・チューニングを参照してください。
また、コマンドラインで入力できる文字数が、使用しているオペレーティング・システムで制限されているときは、オプションをインラインまたは構成ファイルで指定すると便利です。
EXEC ORACLE文は、同一オプションを指定した別のEXEC ORACLE文によってオプション指定値(テキスト)が変更されるまで有効です。次の例では、HOLD_CURSOR=NOはHOLD_CURSOR=YESが指定されるまで有効です。
char emp_name[20];
int emp_number, dept_number;
float salary;
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC ORACLE OPTION (HOLD_CURSOR=NO);
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT empno, deptno FROM emp;
EXEC SQL OPEN emp_cursor;
printf(
"Employee Number Department\n--------------------------\n");
for (;;)
{
EXEC SQL FETCH emp_cursor INTO :emp_number, :dept_number;
printf("%d\t%d\n", emp_number, dept_number);
}
EXEC SQL WHENEVER NOT FOUND CONTINUE;
for (;;)
{
printf("Employee number: ");
scanf("%d", &emp_number);
if (emp_number == 0)
break;
EXEC ORACLE OPTION (HOLD_CURSOR=YES);
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp WHERE empno = :emp_number;
printf("Salary for %s is %6.2f.\n", emp_name, salary);
列プロパティは8バイトの値で戻され、各ビットが1つの列プロパティを示します。3つの列プロパティがサポートされています。
+---------------------------------------------------+
! 32 |..............| 10 | 9 | 8 |......| 3 | 2 | 1 |
+---------------------------------------------------+
| | |
| | |-> auto-increment column
| |-> auto value always generated
|-> if generated by default when null
列プロパティは、新しいSQLDAメンバー(sqlda->CP[])を使用して動的文から取得できます。
struct SQLDA {
/* ub4 */ int N; /* Descriptor size in number of entries */
..........
..........
..........
..........
/* ub2* */ short *Z; /* Ptr to Arr of cur lengths of ind. var. names*/
/* ub8* */ long long *CP; /* Ptr to Arr of column properties */
};
このメンバーはメタデータDESCRIBEの一部として更新されます。
列プロパティは、新しい関数SQLGetColProp()を使用した静的文で取得できます(この関数は最後に実行された文から列プロパティを取得します)。
void SQLGetColProp(
void *uga, --> IN -- run time context
text *coln, --> IN -- column name
ub2 *colatr, --> IN -- column attributes
ub8 *colprop --> IN/OUT -- column attribute/ub8 value that holds column properties
)
SQLGetColProp()は、列属性colatrで決定された値を戻します。
SQL_ATTR_COL_PROPERTIES: 指定した列の列プロパティを含む、8バイトの値(colprop)を戻します。
SQL_ATTR_COL_PROPERTY_IS_IDENTITY colpropは、指定した列がID列の場合にtrueになります。
SQL_ATTR_COL_PROPERTY_IS_GEN_ALWAYS colpropは、指定した列が常に自動増分値を生成する場合にtrueになります。
SQL_ATTR_COL_PROPERTY_IS_GEN_BY_DEF_ON_NULL colpropは、指定した列がデフォルトnull列制約である場合に自動増分値を生成するときは、trueになります。