この章では、結果セットまたはデータベースに関するメタデータの取出し方法を説明します。
ここでは、次の項目について説明します。
データベース・オブジェクトには、そのデータベース・オブジェクトを記述する様々な属性があります。DESCRIBE
操作を実行すると、特定のスキーマ・オブジェクトに関する情報を取得できます。結果は、Metadata
クラスのオブジェクトとしてアクセスできます。結果にアクセスするには、Metadata
クラスの様々なメソッドに、オブジェクト属性を引数として渡します。
DESCRIBE
操作を明示的に実行できる対象は、データベース全体、ResultSet
クラスに含まれている列の型とプロパティ、または、スキーマ・オブジェクトとサブスキーマ・オブジェクト、たとえば、表、型、順序、ビュー、型属性、列、プロシージャ、型メソッド、引数、関数、コレクション、結果、パッケージ、シノニム、およびリストなどです。
検索する属性の型を指定する必要があります。MetaData
クラスのgetAttributeCount()
、getAttributeId()
およびgetAttributeType()
の各メソッドを使用すると、使用可能な各属性をスキャンできます。
すべてのDESCRIBE
情報は、その情報に対する最後の参照が削除されるまでキャッシュされます。この方法によって、開放されているDESCRIBE
情報に、ユーザーが間違えてアクセスすることがなくなります。
メタデータが明示的な記述の場合は、Connection
クラスのgetMetaData()
メソッドをコールしてメタデータを取得します。また、結果セット列のメタデータを取得するには、ResultSet
クラスのgetColumnListMetaData()
メソッドをコールします。この2つのメソッドでは、詳細な情報を持つMetaData
オブジェクトが戻されます。MetaData
クラスには、この情報にアクセスするためのget
xxx
()
メソッドが用意されています。
DESCRIBE
操作の実行時には、次の問題に注意してください。
ATTR_TYPECODE
では、CREATE
TYPE
文で型を新規作成したときに指定した型を表す型コードが戻されます。これらの型コードは、TypeCode
列挙型で、OCCI_TYPECODE
定数によって表されます。内部PL/SQL型(ブール、索引付きの表)はサポートされていません。
ATTR_DATA_TYPE
では、データベース列のデータ型を表す型が戻されます。これらの値は、Type
列挙型です。たとえば、LONG
型では、OCCI_SQLT_LNG
型が戻されます。
データベース・メタデータの記述は、明示的なDESCRIBE
操作と同じになります。記述対象のオブジェクトは、スキーマ内のオブジェクトである必要があります。型の記述では、getMetaData()
メソッドを接続からコールし、オブジェクトの名前またはRefAny
オブジェクトを渡します。最初にOBJECT
モードで環境を初期化する必要があります。getMetaData()
メソッドでは、MetaData
型のオブジェクトが戻されます。MetaData
型の各オブジェクトには、記述ツリーの一部である属性のリストがあります。この記述ツリーを再帰的に横断して参照できるサブツリーで、詳細な情報を表示できます。オブジェクトに関する詳細情報は、get
xxx
()
メソッドをコールして取得できます。
データベースとそのオブジェクトを再帰的に記述するブラウザの構築が必要な場合は、(データベースも含めて)そのデータベースにある各オブジェクトの属性数、属性IDのリストおよび属性型のリストに関する情報にアクセスできます。この情報を使用すると、記述ツリーを最上位ノード(データベース)から表の列、型の属性、プロシージャやファンクションのパラメータに至るまで、再帰的にたどることができます。
たとえば、表とその内容を記述するという典型的なケースを想定します。getMetaData()
メソッドを接続からコールし、記述する表の名前を渡します。戻されたMetaData
オブジェクトには、表に関する情報が含まれています。記述するオブジェクト(表、列、型、コレクション、ファンクション、プロシージャなど)の型はわかっているため、属性リストを取得できます。対応するget
xxx
()
メソッドをコールすると、表に指定されている型の変数内に値を取り出すことができます。
この項では、メタデータを使用するためのコード例を示します。
例6-1 単純なデータベース表の属性に関するメタデータの取得方法
この例は、単純なデータベース表の属性に関するメタデータの取得方法を示しています。
/* Create an environment and a connection to the HR database */ . . /* Call the getMetaData method on the Connection object obtainedv*/ MetaData emptab_metaData = connection->getMetaData( "EMPLOYEES", MetaData::PTYPE_TABLE); /* Now that you have the metadata information on the EMPLOYEES table, call the getxxx methods using the appropriate attributes */ /* Call getString */ cout<<"Schema:"<< (emptab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))<<endl; if(emptab_metaData.getInt( emptab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE) cout<<"EMPLOYEES is a table"<<endl; else cout<<"EMPLOYEES is not a table"<<endl; /* Call getInt to get the number of columns in the table */ int columnCount=emptab_metaData.getInt(MetaData::ATTR_NUM_COLS); cout<<"Number of Columns:"<<columnCount<<endl; /* Call getTimestamp to get the timestamp of the table object */ Timestamp tstamp = emptab_metaData.getTimestamp(MetaData::ATTR_TIMESTAMP); /* Now that you have the value of the attribute as a Timestamp object, you can call methods to obtain the components of the timestamp */ int year; unsigned int month, day; tstamp.getData(year, month, day); /* Call getVector for attributes of list type, such as ATTR_LIST_COLUMNS */ vector<MetaData>listOfColumns; listOfColumns=emptab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS); /* Each of the list elements represents a column metadata, so now you can access the column attributes*/ for (int i=0;i<listOfColumns.size();i++ { MetaData columnObj=listOfColumns[i]; cout<<"Column Name:"<<(columnObj.getString(MetaData::ATTR_NAME))<<endl; cout<<"Data Type:"<<(columnObj.getInt(MetaData::ATTR_DATA_TYPE))<<endl; . . /* and so on to obtain metadata on other column specific attributes */ }
例6-2 ユーザー定義型を含む列からのメタデータの取得方法
この例は、データベース表のユーザー定義型を含む列からのメタデータの取得方法を示しています。
/* Create an environment and a connection to the HR database */ ... /* Call the getMetaData method on the Connection object obtained */ MetaData custtab_metaData = connection->getMetaData( "CUSTOMERS", MetaData::PTYPE_TABLE); /* Have metadata information on CUSTOMERS table; call the getxxx methods */ /* Call getString */ cout<<"Schema:"<<(custtab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA)) <<endl; if(custtab_metaData.getInt(custtab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE) cout<<"CUSTOMERS is a table"<<endl; else cout<<"CUSTOMERS is not a table"<<endl; /* Call getVector to obtain list of columns in the CUSTOMERS table */ vector<MetaData>listOfColumns; listOfColumns=custtab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS); /* Assuming metadata for column cust_address_typ is fourth element in list*/ MetaData customer_address=listOfColumns[3]; /* Obtain the metadata for the customer_address attribute */ int typcode = customer_address.getInt(MetaData::ATTR_TYPECODE); if(typcode==OCCI_TYPECODE_OBJECT) cout<<"customer_address is an object type"<<endl; else cout<<"customer_address is not an object type"<<endl; string objectName=customer_address.getString(MetaData::ATTR_OBJ_NAME); /* Now that you have the name of the address object, the metadata of the attributes of the type can be obtained by using getMetaData on the connection by passing the object name */ MetaData address = connection->getMetaData(objectName); /* Call getVector to obtain the list of the address object attributes */ vector<MetaData> attributeList = address.getVector(MetaData::ATT_LIST_TYPE_ATTRS); /* and so on to obtain metadata on other address object specific attributes */
例6-3 参照からのオブジェクト・メタデータの取得方法
この例は、オブジェクトへの参照が使用されているときに、そのオブジェクトに関するメタデータを取得する方法を示しています。
Type ADDRESS(street VARCHAR2(50), city VARCHAR2(20)); Table Person(id NUMBER, addr REF ADDRESS); /* Create an environment and a connection to the HR database */ . . /* Call the getMetaData method on the Connection object obtained */ MetaData perstab_metaData = connection->getMetaData( "Person", MetaData::PTYPE_TABLE); /* Now that you have the metadata information on the Person table, call the getxxx methods using the appropriate attributes */ /* Call getString */ cout<<"Schema:"<<(perstab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))<<endl; if(perstab_metaData.getInt(perstab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE) cout<<"Person is a table"<<endl; else cout<<"Person is not a table"<<endl; /* Call getVector to obtain the list of columns in the Person table*/ vector<MetaData>listOfColumns; listOfColumns=perstab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS); /* Each of the list elements represents a column metadata, so now get the data type of the column by passing ATTR_DATA_TYPE to getInt */ for(int i=0;i<numCols;i++) { int dataType=colList[i].getInt(MetaData::ATTR_DATA_TYPE); /* If the data type is a reference, get the Ref and obtain the metadata about the object by passing the Ref to getMetaData */ if(dataType==SQLT_REF) RefAny refTdo=colList[i].getRef(MetaData::ATTR_REF_TDO); /* Now you can obtain the metadata about the object as shown MetaData tdo_metaData=connection->getMetaData(refTdo); /* Now that you have the metadata about the TDO, you can obtain the metadata about the object */ }
例6-4 ResultSetオブジェクトからの選択リストに関するメタデータの取得方法
この例は、ResultSet
からの選択リストに関するメタデータの取得方法について示しています。
/* Create an environment and a connection to the database */ ... /* Create a statement and associate it with a select clause */ string sqlStmt="SELECT * FROM EMPLOYEES"; Statement *stmt=conn->createStatement(sqlStmt); /* Execute the statement to obtain a ResultSet */ ResultSet *rset=stmt->executeQuery(); /* Obtain the metadata about the select list */ vector<MetaData>cmd=rset->getColumnListMetaData(); /* The metadata is a column list and each element is a column metaData */ int dataType=cmd[i].getInt(MetaData::ATTR_DATA_TYPE); ...
getMetaData
メソッドがコールされるのは、ATTR_COLLECTION_ELEMENT
属性の場合のみです。
この項では、スキーマ・オブジェクトとサブスキーマ・オブジェクトに属する属性について説明します。
すべての要素には、その要素に固有の属性およびいくつかの汎用属性があります。表6-2では、すべての要素に属する属性について説明します。
表6-2 すべての要素に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
オブジェクトIDまたはスキーマID。 |
|
|
オブジェクト名、スキーマ名またはデータベース名。 |
|
|
オブジェクトが置かれているスキーマ。 |
|
|
パラメータによって記述される情報の型。可能な値は次のとおりです。
|
|
|
この説明の基礎となるオブジェクトの |
|
次の各項では、各種の要素に固有の属性を示しています。
表またはビューのパラメータ(PTYPE_TABLE
型またはPTYPE_VIEW
型)には、表6-3に記載されている型固有の属性があります。
表6-3 表またはビューに属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
オブジェクトID。 |
|
|
列数。 |
|
|
列リスト( |
|
|
記述されているオブジェクト型への |
|
|
表またはビューが一時的であるかどうかを識別します。 |
|
|
表またはビューが型指定かどうかを識別します。 |
|
|
一時表の継続時間。指定できる値は次のとおりです。
|
|
表に属する追加属性は、表6-4に記載されています。
プロシージャまたはファンクションのパラメータ(PTYPE_PROC
型またはPTYPE_FUNC
型)には、表6-5に記載されている型固有の属性があります。
表6-5 プロシージャまたはファンクションに属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
引数のリスト。「リスト属性」を参照してください。 |
|
|
プロシージャまたはファンクションに対して実行者権限が設定されているかどうかを識別します。 |
|
パッケージ・サブプログラムに属する追加属性は、表6-6に記載されています。
パッケージのパラメータ(PTYPE_PKG
型)には、表6-7に記載されている型固有の属性があります。
表6-7 パッケージに属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
サブプログラムのリスト。「リスト属性」を参照してください。 |
|
|
パッケージに対して実行者権限が設定されているかどうかを識別します。 |
|
型のパラメータ(PTYPE_TYPE
型)には、表6-8に記載されている属性があります。
表6-8 型に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
列の型がオブジェクト型の場合に、型の型記述子オブジェクトのメモリー内REFを戻します。 |
|
|
型コードです。指定できる値は次のとおりです。
|
|
|
型がコレクションの場合のコレクションの型コード。これ以外の型の場合は無効です。指定できる値は次のとおりです。
|
|
|
ユーザーによって割り当てられたバージョンが含まれる |
|
|
最終の型であるかどうかを識別します。 |
|
|
インスタンス化可能な型であるかどうかを識別します。 |
|
|
サブタイプであるかどうかを識別します。 |
|
|
スーパータイプが含まれているスキーマの名前。 |
|
|
スーパータイプの名前。 |
|
|
この型が実行者権限であるかどうかを識別します。 |
|
|
この型が不完全かどうかを識別します。 |
|
|
システムの型であるかどうかを識別します。 |
|
|
事前定義の型であるかどうかを識別します。 |
|
|
一時的な型であるかどうかを識別します。 |
|
|
システム生成の型であるかどうかを識別します。 |
|
|
この型にネストした表の属性があるかどうかを識別します。 |
|
|
この型に |
|
|
この型に |
|
|
コレクション要素へのハンドル。 「コレクション属性」を参照してください。 |
|
|
型属性の数。 |
|
|
型属性のリスト。 「リスト属性」を参照してください。 |
|
|
型メソッドの数。 |
|
|
型メソッドのリスト。 「リスト属性」を参照してください。 |
|
|
型のマップ・メソッド。 「型メソッド属性」を参照してください。 |
|
|
型のオーダー・メソッド。「型メソッド属性」を参照してください。 |
|
型の属性のパラメータ(PTYPE_TYPE_ATTR
型)には、表6-9に記載されている属性があります。
表6-9 型属性に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
型属性の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。 |
|
|
型コード。 |
|
|
型属性のデータ型 |
|
|
型属性名である文字列へのポインタ。 |
|
|
数値型属性の精度。精度が0(ゼロ)以外で、スケールが |
|
|
数値型属性のスケール。精度が0(ゼロ)以外で、スケールが |
|
|
型名である文字列。データ型が |
|
|
型が作成されたスキーマ名が含まれる文字列。 |
|
|
列型がオブジェクト型である場合に、型のTDOのメモリー内 |
|
|
型属性が文字列またはキャラクタ・タイプである場合のキャラクタ・セットID。 |
|
|
型属性が文字列またはキャラクタ・タイプである場合のキャラクタ・セット・フォーム。 |
|
|
日時または間隔における秒の小数部分の精度。 |
|
|
間隔における整数部分のフィールドの精度。 |
|
型のメソッドのパラメータ(PTYPE_TYPE_METHOD
型)には、表6-10に記載されている属性があります。
表6-10 型メソッドに属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
メソッド(プロシージャまたはファンクション)の名前。 |
|
|
メソッドのカプセル化レベル。指定できる値は次のとおりです。
|
|
|
引数のリスト。 |
|
|
メソッドがコンストラクタであるかどうかを識別します。 |
|
|
メソッドがデストラクタであるかどうかを識別します。 |
|
|
メソッドが演算子であるかどうかを識別します。 |
|
|
メソッドが自己参照であるかどうかを識別します。 |
|
|
メソッドがマップ・メソッドであるかどうかを識別します。 |
|
|
メソッドがオーダー・メソッドであるかどうかを識別します。 |
|
|
メソッドに対して「Read No Data State」が設定されているかどうかを識別します。 |
|
|
メソッドに対して「Read No Process State」が設定されているかどうかを識別します。 |
|
|
メソッドに対して「Write No Data State」が設定されているかどうかを識別します。 |
|
|
メソッドに対して「Write No Process State」が設定されているかどうかを識別します。 |
|
|
最終のメソッドであるかどうかを識別します。 |
|
|
インスタンス化可能なメソッドであるかどうかを識別します。 |
|
|
オーバーライドする側のメソッドであるかどうかを識別します。 |
|
コレクション型のパラメータ(PTYPE_COLL
型)には、表6-11に記載されている属性があります。
表6-11 コレクション型に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
型属性の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。 |
|
|
Typecode。 |
|
|
型属性のデータ型。 |
|
|
配列内の要素数。配列であるコレクションについてのみ有効です。 |
|
|
型属性名である文字列へのポインタ。 |
|
|
数値型属性の精度。精度が0(ゼロ)以外で、スケールが |
|
|
数値型属性のスケール。精度が0(ゼロ)以外で、スケールが |
|
|
型名である文字列。データ型が |
|
|
型が作成されたスキーマ名が含まれる文字列。 |
|
|
型の |
|
|
Typecode。 |
|
|
型属性のデータ型。 |
|
シノニムのパラメータ(PTYPE_SYN
型)には、表6-12に記載されている属性があります。
順序のパラメータ(PTYPE_SEQ
型)には、表6-13に記載されている属性があります。
表6-13 順序に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
オブジェクトID。 |
|
|
最小値(Oracle NUMBER形式)。 |
|
|
最大値(Oracle NUMBER形式)。 |
|
|
増分数(Oracle NUMBER形式)。 |
|
|
キャッシュされた順序番号の数。順序がキャッシュされた順序でない場合は、0(ゼロ)となります(Oracle NUMBER形式)。 |
|
|
順序が順序指定されているかどうかを識別します。 |
|
|
最高水位標(Oracle NUMBER形式)。 |
|
表またはビューの列のパラメータ(PTYPE_COL
型)には、表6-14に記載されている属性があります。
表6-14 表またはビューの列に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
列の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。 |
|
|
列のデータ型。 |
|
|
列名である文字列へのポインタ。 |
|
|
精度を戻します。 |
|
|
数値列のスケール。精度が0(ゼロ)以外で、スケールが |
|
|
列にnull値が許可されていない場合、 |
|
|
型名である文字列が戻されます。データ型が |
|
|
型が作成されたスキーマ名が含まれる文字列が戻されます。 |
|
|
列型がオブジェクト型である場合の、型のTDOの |
|
|
文字の列のキャラクタ・セットID。設定されていない場合、キャラクタ・セットIDのデフォルトは直接パス・コンテキストで設定されたキャラクタ・セットIDになります。 |
|
|
列のキャラクタ・セット・フォーム。この属性を設定すると、クライアント側のデータベースまたは各国語キャラクタ・セットの使用が指定されます。 |
|
引数、プロシージャ型またはファンクション型(PTYPE_ARG
型)、型メソッド引数(PTYPE_TYPE_ARG
型)、あるいはメソッド結果(PTYPE_TYPE_RESULT
型)のパラメータには、表6-15に記載されている属性があります。
表6-15 引数または結果に属する属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
引数名である文字列へのポインタが戻されます。 |
|
|
引数リスト内の引数の位置。常に |
|
|
Typecode。 |
|
|
引数のデータ型。 |
|
|
引数のデータ型のサイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。 |
|
|
数値引数の精度。精度が0(ゼロ)以外で、スケールが |
|
|
数値引数のスケール。精度が0(ゼロ)以外で、スケールが |
|
|
データ型レベル。この属性では常に |
|
|
引数にデフォルト値があるかどうかを示します。 |
|
|
引数がレコードまたは表の型である場合の、次レベルにある引数のリスト。 |
|
|
引数モードを示します。有効な値は次のとおりです。
|
|
|
基数が戻されます(数値型の場合)。 |
|
|
列に |
bool |
|
型名(またはパッケージのローカル型の場合はパッケージ名)である文字列が戻されます。データ型が |
|
|
|
|
|
|
|
|
|
|
|
引数型がオブジェクトである場合、型のTDOの |
|
|
引数が文字列またはキャラクタ・タイプである場合、キャラクタ・セットIDが戻されます。 |
|
|
引数が文字列またはキャラクタ・タイプである場合、キャラクタ・セット・フォームが戻されます。 |
|
リスト内のすべての要素についてリスト型の属性を記述できます。ファンクション引数リストの場合、位置0
には戻り値のパラメータがあります(PTYPE_ARG
)。
すべての要素についてリストが繰り返し記述されます。結果はC++ vector<MetaData>
に格納されます。リスト型の属性を記述するには、getVector()
メソッドをコールします。表6-16にリスト属性を示しています。
スキーマ型のパラメータ(PTYPE_SCHEMA
型)には、表6-17に記載されている属性があります。
データベースのパラメータ(PTYPE_DATABASE
型)には、表6-18に記載されている属性があります。
表6-18 データベースに固有の属性
属性 | 説明 | 属性のデータ型 |
---|---|---|
|
データベースのバージョン。 |
|
|
サーバー・ハンドルからのデータベース・キャラクタ・セットID。 |
|
|
サーバー・ハンドルからのデータベース・ネイティブ・キャラクタ・セットID。 |
|
|
データベース内のスキーマのリスト( |
|
|
プロシージャ名の最大長。 |
|
|
列名の最大長。 |
|
|
データベース内のカーソルおよびプリコンパイルされた文に対する
|
|
|
カタログ(データベース)名の最大長。 |
|
|
修飾表内のカタログの位置。値は次のとおりです。
|
|
|
データベースがセーブポイントをサポートしているかどうかを識別します。値は次のとおりです。
|
|
|
データベースがNOWAIT句をサポートしているかどうかを識別します。値は次のとおりです。
|
|
|
DDL文に自動コミット・モードが必須かどうかを識別します。値は次のとおりです。
|
|
|
データベースのロック・モード。値は次のとおりです。
|
|