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

前
次

C言語の構造体の使用について

Oracle8以前は、Pro*C/C++のSQL SELECT文では、C言語の構造体を1つのホスト変数として指定できました。その場合、構造体の各メンバーは、リレーショナル表の1つのデータベース列に対応付けられます。つまり、各メンバーは問合せによって戻される選択リスト内の1つの項目を表します。

Oracle8i以上のバージョンでは、データベース内のオブジェクト型は、1つのエンティティであり、1つの項目として選択できます。Oracle7の表記法では、構造体はスカラー変数のグループなのか、それともオブジェクトなのかがあいまいです。

Pro*C/C++では、次の規則を利用してこのあいまいさを解消しています。

OTTを使用してC宣言が生成された場合にかぎり、C言語の構造体のホスト変数がオブジェクト型を表すとみなされます。そのため、型記述はPro*C/C++へのINTYPEオプションで指定される型ファイルに表示されます。他のすべてのホスト構造体は、データベースに同じ名前のデータ型が存在する場合でも、Oracle7構文が使用されているものとみなされます。

したがって、既存の構造体ホスト変数の型と同じ名前を持つ新しいオブジェクト型を使用する場合は、Pro*C/C++ではINTYPEファイル内のオブジェクト型定義が使用されることに注意してください。これは、コンパイル・エラーの原因となる場合があります。この修正には、既存のホスト変数の型を名前変更するか、またはOTTを使用してオブジェクト型に新しい名前を付けます。

前述の規則は、OTT生成のデータ型に対して別名指定されるユーザー定義のデータ型にまで広く適用されます。例として、emptypeがヘッダー・ファイルdbtypes.h内でOTTによって生成された構造体であり、Pro*C/C++プログラムに次の文を組み込んだ場合を考えます。

#include <dbtypes.h>
typedef emptype myemp;
myemp *employee;

変数employeeを表す型の名前myempは、データベース内で定義されたあるオブジェクト型を表すOTT生成の型の名前emptypeに対して別名指定されます。これによって、Pro*C/C++では、変数employeeはオブジェクト型を表すものとみなされます。

前述の規則は、OTT生成の型を持つC言語の構造体や、OTT生成の型に対して別名指定されているC言語の構造体を、オブジェクト型以外の型のデータのフェッチに使用できないという意味ではありません。単に、Pro*C/C++は自動的にそうした構造体を拡張しないということです。ユーザーは自由に一般的な構文を使用して、構造体の個々のフィールドを単一データベースの列の選択や更新に使用できます。