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

前
次

オプションの入力

どのプリコンパイラ・オプションも、コマンドラインに入力できます。また、その多くは、EXEC ORACLE OPTION文を使用してプリコンパイラ・プログラムのソース・ファイルにインライン入力できます。

コマンドライン

プリコンパイラ・オプションをコマンドラインに入力するには、次の構文を使用します。

... [OPTION_NAME=value] [OPTION_NAME=value] ... 

それぞれのオプション=値の指定は、1つ以上の空白で区切ります。たとえば、次のように入力したとします。

... CODE=ANSI_C MODE=ANSI 

インライン

次の構文を使用してEXEC ORACLE文を記述すると、オプションをインライン入力できます。

EXEC ORACLE OPTION (OPTION_NAME=value); 

たとえば、次のように記述します。

EXEC ORACLE OPTION (RELEASE_CURSOR=yes); 

EXEC ORACLEの用途

EXEC ORACLE機能は、プリコンパイル中にオプション値を変更する場合に特に便利です。たとえば、HOLD_CURSORとRELEASE_CURSORを1文単位で変更する場合があります。

関連項目:

インライン・オプションを使用して実行時パフォーマンスを最適化する方法は、パフォーマンス・チューニングを参照してください。

また、コマンドラインで入力できる文字数が、使用しているオペレーティング・システムで制限されているときは、オプションをインラインまたは構成ファイルで指定すると便利です。

EXEC ORACLEのスコープ

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になります。