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

前
次

コレクションの記述子

NESTED TABLEのC言語のデータ型は、OCITableへのポインタです。VARRAYの場合は、OCIArrayへのポインタになります。(両方ともOCICollへのポインタのサブタイプです。)OTT(Object Type Translator)ユーティリティを使用して、アプリケーション・コードにインクルードするヘッダー・ファイルにtypedefを生成します。Object Type Translator (OTT)も参照してください。

コレクションのホスト構造体は記述子で、これを介してコレクションの要素にアクセスできます。この記述子には、実際のコレクション要素は保持されていませんが、その要素へのポインタが格納されています。記述子とその関連要素のためのメモリーは、オブジェクト・キャッシュで入手できます。

オブジェクト型における通常の手順に従って、OTT生成の型ファイルを、Pro*C/C++に対するINTYPEプリコンパイラ・オプション内と、#includeプリプロセッサ・ディレクティブを使用してPro*C/C++プログラムにインクルードされたOTT生成のヘッダー内に指定する必要があります。このスキーマにより、コレクション・オブジェクト・タイプに対する適切なタイプ・チェックがプリコンパイル中に間違いなく実行されます。

ただし、他のオブジェクト型とは異なり、コレクション・オブジェクト・タイプは、OTTによって生成される特別なインジケータ構造体を必要としません。かわりにスカラー・インジケータが使用されます。その理由は、アトミックNULLインジケータのみで十分にコレクション型全体がNULLかどうかがわかるからです。個々のコレクション要素のNULL状態は、(オプションで)各要素に対応する別個のインジケータで表すことができます。

ホスト変数と標識変数の宣言

コレクション・オブジェクト・タイプを表すホスト変数は、その他のオブジェクト型の場合と同様に、該当するOTT生成の型へのポインタとして宣言する必要があります。

ただし、コレクション・オブジェクト・タイプ全体を表す標識変数は、その他のオブジェクト型の場合とは異なり、2バイトの符号付きスカラー型OCIIndとして宣言されます。標識変数はオプションで設定しますが、Pro*C/C++で宣言された各ホスト変数に対してそれぞれ1つずつ指定するようにプログラミングすることをお薦めします。

コレクションの操作について

コレクションを操作する方法は2つあります。コレクションを自律型エンティティとして扱い、コレクションの要素へのアクセスが発生しない場合と、コレクションの要素に対するアクセス、追加および切捨てなどが発生する場合です。

自律型コレクション・アクセス

Cコレクション記述子(OCITableまたはOCIArray)を使用した場合、コレクション全体を1つのエンティティとして割り当てること以外はできません。OBJECT GET埋込みSQL文を使用すると、コレクションがCホスト変数記述子にバインドされます。OBJECT SET文では、逆にCホスト記述子がコレクションにバインドされます。

1つの文中で複数のコレクションを1つの互換Cコレクション記述子にバインドしたり、コレクションをCコレクション記述子にバインドしている文中で他のスカラーにバインドすることもできます。

コレクション要素アクセス

Cコレクション記述子は、コレクションの要素にアクセスするために使用します。記述子には、始点およびエンドポイントなどのコレクションの内部属性およびその他の情報が含まれます。

要素のスライスは、互換データ型を持つホスト配列にバインドされます。コレクションのスライスとは、開始インデックスと終了インデックス間の内容のことです。スライスは配列にマップされます。配列の次元がスライス要素数よりも大きいことがあります。

スカラーのバインドは、ホスト配列の次元を1にすること、またはオプションのFOR句が1に評価されることと同じことです。

アクセスのルール

アクセスのルールは、自律型アクセスと要素アクセスで異なります。

自律型アクセス

  • コレクションは1つの全体として扱われるため、FOR句は使用できません。

  • NESTED TABLEとVARRAYの定義方法が異なるため、それらの間で代入を行うことはできません。

  • 1つの文中で、複数のコレクションを様々に組み合せてCコレクション記述子に代入することができます。1つの文中で、コレクションをCコレクション記述子に代入したり、他のスカラー・データ型をバインドしたりできます。

要素アクセス

  • FOR句を使用できます。省略すると、配列サイズの最小値が実行の繰返し回数になります。

  • 一度に複数のコレクションにアクセスすることはできません。

    注意:

    FOR句の変数では、処理する配列の要素数を指定します。この数は、最小の配列次元を超えないように設定します。内部では、値は符号なしの数量として扱われます。符号付きのホスト変数を使用して負の値を渡すと、予測不能な動作が発生する原因となります。

標識変数

アクセス方法ごとに標識変数の使用方法が異なります。

自律型バインド

1つの標識変数には、コレクションのNULL状態が1つのエンティティとして格納されます。各要素のNULL状態は格納されていません。

要素バインド

標識変数には、要素がNULLであるかどうかが格納されます。コレクション・データのスライスが、独自のインジケータ配列のホスト配列にバインドされている場合は、インジケータ配列には各要素のNULL状態がスライスに格納されます。

コレクション要素型がユーザー定義オブジェクト型の場合は、ホスト変数に対応付けられた標識変数に、オブジェクトおよびその属性のNULL状態が格納されます。