3.15 Oracleユーザー定義タイプ(UDT)および.NETカスタム・タイプ
ODP.NETには、データベース内のOracle UDTを、.NETアプリケーションのカスタム・タイプとして表す機能があります。UDTはアプリケーション間で共有できる単一オブジェクトとして複雑な実体を表すのに便利です。Oracle製品(Oracle SpatialおよびOracle XML DBなど)では、製品独自の複雑なタイプを頻繁に使用しています。
Oracle UDTを.NETカスタム・タイプとして表すには、アプリケーションに.NET属性をカスタム・クラスおよび構造体、そしてそれらのパブリック・フィールドおよびプロパティに適用します。
注意:
ODP.NET管理対象ドライバは、UDTおよび.NETカスタム・タイプをサポートしていません。
UDTおよびカスタム・タイプ間で変換するには、ODP.NETはカスタム・インタフェースを使用します。
このセクションの内容は次のとおりです。
3.15.1 Oracleユーザー定義タイプ(UDT)
Oracle Data Provider for .NETは、Oracleオブジェクト型またはユーザー定義タイプ(UDT)をサポートしており、Oracle Databaseに定義されています。
次の2種類のUDTがあります。
-
オブジェクト・タイプ(Oracleオブジェクト)
-
コレクション・タイプ(
VARRAYタイプまたはネスト表タイプ)
また、ODP.NETはオブジェクト・タイプに対して参照(REF)をサポートしています。
UDTという用語は、Oracleオブジェクト型および抽出データ型(ADT)と同じ意味で使用されます。
Oracle UDTの名前は大/小文字を区別し、schema_name.type_name形式にする必要があります。
ORACLE_BASE\\ORACLE_HOME\ODP.NET\Samples\UDTディレクトリにUDTのサンプルが用意されています。
関連項目:
-
オブジェクト・タイプの詳細な説明は、Oracle Databaseオブジェクト・リレーショナル開発者ガイドを参照
3.15.2 カスタム・タイプ
Oracle Data Provider for .NETは、UDTをサポートしており、.NETタイプ、つまりカスタム・タイプとしてデータベースに定義されたOracle UDTを表します。アプリケーションがフェッチおよび操作するOracle UDTごとに、1つのカスタム・タイプ・ファクトリおよび1つのカスタム・タイプが必要です。カスタム・ファクトリ・クラスは、カスタム・タイプのインスタンス化のみ実行します。ODP.NETはカスタム・ファクトリ・クラスに実装されたインタフェースを使用して、実行時にカスタム・タイプをインスタンス化します。カスタム・タイプは、Oracle UDT属性または要素間で.NETメンバーへのマッピングを定義します。ODP.NETはカスタム・タイプ・インスタンスに実装されたインタフェースを使用して、実行時にOracle UDTとカスタム・タイプ間で値を変換します。
カスタム・タイプは、.NETクラスまたは構造体のいずれかです。これらはOracleオブジェクトまたはOracleコレクションのいずれかを表します。カスタム・タイプは、アプリケーション開発者が手動でカスタム・タイプを実装するか、またはODP.NETコード生成ツールを使用して生成できます。
ファクトリ・クラスおよびカスタム・タイプが定義されて実装要件を満たすと、アプリケーションは、ODP.NETを設定してOracle UDTとカスタム・タイプ間のマッピングを自動的に検索します。この検索プロセスは、カスタム・ファクトリ・クラスに適用された属性に基づいています。また、構成ファイルから明示的なマッピングが提供されます。
Oracleコレクションを.NETタイプの配列として表すことができます。たとえば、Oracleコレクション型のNUMBERをint[]にマッピングできます。さらにOracleコレクション型のOracle UDTをカスタム・タイプの配列にマッピングできます。
カスタム・タイプは、カスタム・タイプとしてOracle UDTを表すためにODP.NETの一定の要件に従う必要があります。要件は次のとおりです。
3.15.2.1 必須カスタム・タイプ実装
この項では、カスタム.NETクラスまたは構造に必要な実装をリストします。
-
Oracle.DataAcess.Types.IOracleCustomTypeインタフェースの実装このインタフェースは、カスタム・タイプおよびOracle UDT間の変換に使用されます。
OracleUdtクラスの静的メソッドを使用して、このインタフェース・メソッドを実装します。 -
カスタム・タイプ・ファクトリ
カスタム・タイプ・ファクトリを使用して、カスタム・タイプのインスタンスを作成します。カスタム・タイプ・ファクトリは、次に示すような
IOracleCustomTypeFactoryインタフェース、IOracleArrayTypeFactoryインタフェースまたは両方のインタフェースのいずれかになります。-
Oracleオブジェクトを表すカスタム・タイプを作成するには、カスタム・タイプまたは個々のカスタム・タイプ・ファクトリ・クラスが
Oracle.DataAccess.Types.IOracleCustomTypeFactoryインタフェースを実装する必要があります。 -
Oracleコレクションを表すカスタム・タイプを作成するには、カスタム・タイプまたは個々のカスタム・タイプ・ファクトリ・クラスが
Oracle.DataAccess.Types.IOracleCustomTypeFactoryインタフェースおよびOracle.DataAccess.Types.IOracleArrayTypeFactoryインタフェースを実装する必要があります。 -
Oracleコレクションを表す配列タイプを作成するには、カスタム・タイプ・ファクトリ・クラスが
Oracle.DataAccess.Types.IOracleArrayTypeFactoryインタフェースを実装する必要があります。
-
-
カスタム・タイプ・メンバーのマッピング属性
カスタム・タイプ・メンバーのマッピング属性は、カスタム・タイプ・メンバーと、OracleオブジェクトまたはOracleコレクション要素のいずれかの間のマッピングを指定します。
カスタム・タイプ・メンバーのマッピング属性には次の2種類があります。
-
OracleObjectMappingAttributeこの属性は、カスタム・タイプ・メンバーと、Oracleオブジェクトを表すカスタム・タイプのOracleオブジェクト属性の間のマッピングを指定します。この属性を、Oracleオブジェクト属性を表す各カスタム・タイプ・メンバー(フィールドやプロパティ)に適用する必要があります。
注意:
すべてのOracleオブジェクト属性をカスタム・タイプ・メンバーにマップする必要はありません。特定のオブジェクト属性に
OracleObjectMappingAttributeがない場合、Oracleオブジェクトとカスタム・タイプ間の変換の際にはODP.NETはそのオブジェクト属性を無視します。 -
OracleArrayMappingAttributeこの属性は、Oracleコレクションを表すカスタム・タイプのOracleコレクションの要素を格納するカスタム・タイプ・メンバーを指定します。属性は、1つのカスタム・タイプ・メンバーで指定される必要があります。
-
-
Oracle.DataAcess.Types.INullableインタフェースの実装このインタフェースは、カスタム・タイプのインスタンスがNULL UDTを表しているかどうかを判断するために使用されます。このインタフェースの
IsNullプロパティにより、アプリケーションおよびODP.NETはUDTがNULLかどうかを判断できます。 -
静的NULLフィールド
パブリック静的
Nullプロパティは、NULL UDTを戻すために使用されます。このプロパティは、TRUEを戻すIsNullプロパティと関連するカスタム・タイプを戻します。
3.15.2.2 オプションのカスタム・タイプの実装
次に示すのはオプションです。
-
IXMLSerializableIXMLSerializableインタフェースを.NET 2.0 frameworkで使用すると、カスタム・タイプとそのXML表現の間の変換が可能になります。このインタフェースが使用されるのは、カスタム・タイプのシリアライゼーションおよびデシリアライゼーションがDataSetで必要となる場合のみです。 -
Static ParseおよびPublic ToStringメソッドこれらのメソッドにより、カスタム・タイプとその文字列表現の間の変換が可能になります。
このメソッドは
DataGridコントロールが変更を受け入れてインスタンス値を表示する際に呼び出されます。 -
タイプの継承
タイプの継承は、スーパー・タイプからデータベース内のOracle UDTを導出するプロセスを参照します。
カスタム・タイプがスーパー・タイプから導出されるOracle UDTを表す場合、カスタム・クラスは同じタイプの階層に従う必要があるため、カスタム・クラスは、データベース内で定義されたスーパー・タイプを表す別のカスタム・クラスから導出される必要があります。
-
OracleCustomTypeMappingAttributeOracleCustomTypeMappingAttributeオブジェクトは、カスタム・タイプ(または配列タイプ)とOracle UDT間のマッピングを指定します。次に示すアプリケーションが使用する各Oracle UDTに対して、カスタム・タイプ・ファクトリは一意である必要があります。
-
Oracleオブジェクト型には次のものがあります。
カスタム・タイプ・ファクトリは、指定されたOracleオブジェクト型を表すカスタム・タイプのみを戻す必要があります。
-
Oracleコレクション型には次のものがあります。
カスタム・タイプ・ファクトリは、その他のOracleコレクション型が使用できるカスタム・タイプを戻す場合があります。これは、たとえば
int[]がNUMBERのコレクションを表すために使用される場合など、配列タイプがOracleコレクションを表すために使用される場合に共通です。
OracleCustomTypeMappingAttributeが指定されていない場合、カスタム・タイプ・マッピングは、XML構成ファイル、つまりmachine.configおよびWindowsアプリケーションのapp.configか、またはWebアプリケーションのweb.configから指定する必要があります。 -
3.15.3 カスタム・タイプ・マッピングの指定
カスタム・タイプの作成後、アプリケーションはカスタム・タイプ・マッピングを指定し、カスタム・タイプをデータベース内のOracle UDTにマップする必要があります。これは、カスタム・タイプ・ファクトリまたは構成ファイルにあるXMLを使用して実行できます。
この両方が実装されている場合は、XMLを使用したカスタム・タイプ・マッピングの指定が優先されます。実行時に、構成ファイルで指定されたカスタム・タイプ・マッピングがODP.NETによって検出されると、OracleCustomTypeMappingAttributeオブジェクトを使用して指定されたカスタム・タイプ・マッピングは無視されます。.NETアプリケーションがOracle UDTがマップされている.NETクラスを含む.NETアセンブリを動的にロードする場合、.NETクラスとOracle UDTとのマッピングは.NET構成ファイルを使用して構成される必要があります。
カスタム・タイプ・マッピングの場合、マッピングがOracleCustomTypeMappingAttributeオブジェクトまたはXML構成ファイルによるものかどうかにかかわらず、シノニムの使用を指定することはできません。
関連項目:
UDTマッピングの詳細は、Oracle Developer Tools for Visual StudioヘルプのVisual StudioのServer Explorerにあるユーザー定義タイプ・ノードに関する項を参照してください。
この項の内容は次のとおりです。
3.15.3.1 カスタム・タイプ・ファクトリを使用したカスタム・タイプ・マッピングの指定
アプリケーションは、カスタム・タイプ・ファクトリを使用してカスタム・タイプ・マッピングを指定できます。アプリケーションはschema_name.type_nameの形式でOracleCustomTypeMappingAttributeオブジェクトにOracle UDTの名前を指定し、その名前を対応するカスタム・タイプ・ファクトリに適用します。カスタム・タイプ・ファクトリはクラスまたは構造体であり、IOracleCustomTypeFactoryおよびIOracleArrayTypeFactoryインタフェースのいずれかまたは両方を実装しています。
アプリケーションが使用する各Oracle UDTは、必ず一意のカスタム・タイプ・ファクトリであることに注意してください。さらに、Oracleオブジェクト型では、カスタム・タイプ・ファクトリは指定されたOracleオブジェクト型を一意に表すカスタム・タイプを戻す必要があります。Oracleコレクション型では、カスタム・タイプ・ファクトリは、他のOracleコレクション型が使用できるカスタム・タイプを戻します。これは、配列タイプのカスタム・タイプがOracleコレクションを表す場合、つまりint[]を使用してNUMBERのコレクションを表す場合に共通です。
実行時にリフレクション・プログラミングを使用すると、OracleCustomTypeMappingAttributeオブジェクトを通して、ODP.NETはアプリケーションが指定するすべてのカスタム・タイプ・マッピングを検索します。
注意:
OracleCustomTypeMappingAttributeで指定されたUDT名には、ピリオドを使用できません。
3.15.3.2 構成ファイルのXMLを使用したカスタム・タイプ・マッピングの指定
アプリケーションは、構成ファイルのXMLを使用してカスタム・タイプ・マッピングを指定できます。たとえば、machine.configおよびWindowsアプリケーションのapp.configまたはWebアプリケーションのweb.configのいずれかを使用します。
カスタム・タイプ・マッピングは、oracle.dataaccess.client構成セクション・グループに指定される必要があります。各カスタム・タイプ・マッピングは、XML要素<add>を使用してカスタム・タイプ・マッピングのコレクションに追加される必要があります。
各カスタム・タイプ・マッピングは、名前属性および値属性で構成されます。名前属性は、カスタム・タイプ・マッピングを表す任意のユーザー固有の名前を指定できます。値属性は、udtMappingで始まり、次にリストされた必須およびオプション属性に従う必要があります。
3.15.3.2.1 必須属性
-
factoryNameカスタム・タイプ・ファクトリ・クラスまたは構造体の大/小文字を区別するアセンブリ修飾名。
カスタム・タイプ・ファクトリを定義するアセンブリにストロング・ネームがない場合、アセンブリ名のみを構成する部分的なアセンブリ名で十分です。ストロング・ネーム・アセンブリの場合、完全なアセンブリ名が必要です。アセンブリ名、
Version、Culture、PublicKeyTokenを含める必要があります。 -
typeNameデータベース内で定義される大/小文字を区別するUDTの名前。デフォルトでは、すべてのUDTはデータベース内に大文字で作成されます
-
schemaNameデータベース内でUDTが定義される大/小文字を区別するスキーマ。デフォルトでは、すべてのスキーマはデータベース内に大文字で作成されます
3.15.3.2.2 オプション属性
-
dataSource指定された場合、アプリケーションが接続するデータベース(TNS名別名で指定される)で定義されるOracle UDTに対してのみ、カスタム・タイプ・マッピングが適用されていることを示します。
データ・ソースは大/小文字を区別します。
次に示す例は、.NET 2.0の構成ファイルで指定できるXMLの書式です。
<oracle.dataaccess.client>
<settings>
<add name="Person" value="udtMapping factoryName='Sample.PersonFactory,
Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
typeName='PERSON' schemaName='SCOTT' dataSource='oracle'"/>
<add name="Student" value="udtMapping factoryName='Sample.StudentFactory,
Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
typeName='STUDENT' schemaName='SCOTT'"/>
</settings>
</oracle.dataaccess.client>
3.15.3.3 カスタム・タイプ・マッピングの使用
データの検索中、アプリケーションはカスタム・タイプ・マッピングを使用してOracle UDTをカスタム・タイプに変換します。入力および入出力パラメータ、またはOracle REFを使用した更新によってデータが戻される場合、アプリケーションはマッピングを使用してカスタム・タイプをOracle UDTに変換します。
また、入力および入出力パラメータの場合、アプリケーションはOracleParameter UdtTypeNameプロパティをパラメータのユーザー定義のタイプ名に設定する必要があります。
Oracle UDTがタイプ階層の一部になっている場合、カスタム・タイプはタイプ階層内の固有のタイプとしてインスタンス化される必要があります。カスタム・タイプ・マッピングが指定するOracle UDTは、OracleParameter UdtTypeNameプロパティが指定するOracle UDTのサブタイプである必要があります。
たとえば、ストアド・プロシージャのパラメータはタイプSCOTT.PERSONで、サブタイプSCOTT.STUDENTを含みます。アプリケーションには、SCOTT.STUDENTを表すカスタム・クラス・インスタンスがあります。Oracle UDTをインスタンス化する際にUdtTypeNameはSCOTT.PERSONに設定されますが、カスタム・タイプ・マッピングは、カスタム・クラスがSCOTT.STUDENTにマップされ、UdtTypeNameがオーバーライドされることを示します。このため、カスタム・オブジェクトがパラメータ・タイプのサブタイプであるOracle UDTを表す場合には、ODP.NETはOracle UDTを適切にインスタンス化し、バインドします。
3.15.4 カスタム・タイプおよびOracle UDT間の変換
ODP.NETがOracle UDTとカスタム・タイプ間で変換できるのは、適切な属性マッピングが指定され、カスタム・タイプが適切に定義されている場合です。
ODP.NETが変換を実行するのは、Oracle UDTが次に示すものとしてフェッチされる場合です。
-
SQLまたはPL/SQL実行にバインドされる入力、出力、入出力パラメータ
OracleParameterのDbTypeプロパティをDbType.Objectに設定するか、またはOracleDbTypeプロパティをOracleDbType.ObjectまたはOracleDbType.Arrayに設定する必要があります。ユーザー定義タイプのパラメータの場合、
OracleParameterオブジェクトのUdtTypeNameプロパティを、常にパラメータ・タイプに設定する必要があります。注意:
UdtTypeNameはカスタム・タイプ・マッピングで指定されたOracle UDTとは異なる場合があります。これは、パラメータ・タイプが、カスタム・タイプが表すOracle UDTのスーパー・タイプの場合です。 -
OracleDataReaderオブジェクトから取得される列の値GetValue、GetValues、GetOracleValue、GetOracleValues、GetProviderSpecificValueまたはGetProviderSpecificValuesメソッド、またはUDT列のItem[]プロパティのいずれかを通じてアプリケーションが値を要求する場合、ODP.NETはOracle UDTに対応するカスタム・タイプを検出し、適切に変換します。 -
DataSetを移入する結果セットの一部OracleDataAdapterのFillメソッドを使用して、アプリケーションがUDTを含む結果を持つDataSetを移入する場合、DataSetにOracle UDTを表すカスタム・タイプが移入されます。ADO.NET 2.0の場合、OracleDataAdapterのReturnProviderSpecificTypesがtrueまたはfalseに設定されているかどうかにかかわらず、DataSetにUDT列のカスタム・タイプが移入されます。 -
REFを通して参照されるオブジェクトREFが参照するオブジェクトが取得される場合、Oracle UDTを表すカスタム・タイプが戻されます。次のように、アプリケーションは
OracleUdtFetchOptionメソッドを使用して戻されるオブジェクトのコピーを制御できます。-
OracleUdtFetchOption.Cacheオプションが指定され、キャッシュされたオブジェクトのコピーが存在する場合、キャッシュされたコピーはすぐに戻されます。キャッシュされたコピーが存在しない場合、データベースの最新のオブジェクトのコピーがキャッシュされて戻されます。 -
OracleUdtFetchOption.Serverオプションが指定された場合、データベースの最新のオブジェクトのコピーがキャッシュされて戻されます。オブジェクトがすでにキャッシュされている場合、最新のオブジェクトのコピーは既存のオブジェクトのコピーを上書きします。 -
OracleUdtFetchOption.TransactionCacheオプションが指定された場合、同一トランザクション内では次の2つの可能性があります。-
ServerまたはTransactionCacheオプションを使用してオブジェクトのコピーを以前に取得した場合、TransactionCacheオプションの動作はCacheオプション動作と同じになります。 -
Serverまたは
TransactionCacheオプションを使用してオブジェクトのコピーを以前に取得していない場合は、TransactionCacheオプションの動作はServerオプション動作と同じになります。
-
-
3.15.5 Oracle UDT属性マッピング
表3-21は、Oracle UDTタイプと、.NETタイプまたはOracleプロバイダ固有のタイプ(ODP.NETタイプ)のいずれかであるカスタム・オブジェクト・タイプ間の、有効な属性(オブジェクトの場合)および要素(コレクションの場合)のマッピングをリストしています。
Oracleコレクションは、カスタム・クラスにマップする必要はありません。Oracleコレクションは、固有のタイプの配列とマップできます。表3-21は、指定されたOracleタイプの要素のコレクションで、.NETタイプまたはプロバイダ固有のタイプ配列にマップできることを示しています。たとえば、OracleコレクションがNUMBER(8)のVARRAYの場合、typeof(int[])にマップできます。これにより、int[]のみ保持するクラスを作成する必要がなくなります。
.NET 2.0の場合、OracleコレクションをNullableタイプにマップできます。これにより、.NET 2.0アプリケーションはNULLを使用できるint[]を取得できるので、int[]内にNULL値を保持できます。
Oracle UDT属性および要素をobjectまたはobject[]にマップできないことに注意してください。
表3-21 UDTおよびカスタム・オブジェクト・タイプ間の属性マッピング
| UDT属性または要素のタイプ | .NETタイプ | ODP.NETタイプ |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ネストした表 |
|
|
|
|
|
|
|
|
|
|
|
オブジェクト・タイプ |
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意:
-
System.Byte[]からBFILEへの変換はサポートされていないため、読取り専用の場合、System.Byte[]はBFILEのみを表します。
3.15.6 OracleDataReaderからのOracle UDTの検索
OracleDataReaderからOracle UDTを取得するには、アプリケーションはOracle UDTを表すタイプを識別するカスタム・タイプ・マッピングを指定する必要があります。カスタム・タイプ・マッピングが指定されていて、任意の必要なカスタム・タイプが作成されている場合、アプリケーションはOracle UDTを取得できます。
表3-22は、呼び出されたメソッドに基づいてOracleDataReaderオブジェクトから戻されるタイプおよび値、列タイプ、および有効なカスタム・タイプ・マッピングがあるかどうかを示しています。
注意:
PS Objectは、プロバイダ固有のオブジェクトです。
表3-22 OracleDataReaderオブジェクトから戻されるタイプおよび値
| OracleDataReaderメソッドおよびプロパティの起動 | 列データ型 | カスタム・タイプ・マッピング | Oracle UDTに戻される値 | Oracle UDTに戻されるNULL値 |
|---|---|---|---|---|
|
|
|
none |
スローされる例外 |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
|
|
none | |
|
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
|
|
none | |
|
|
3.15.7 OracleDataReaderからのOracle UDTメタデータの検索
OracleDataReaderオブジェクトは、.NETタイプまたはプロバイダ固有のタイプ・アクセッサが呼び出される場合にメタデータを戻してカスタム・タイプがOracle UDTを表すかを判断するために使用します。OracleDataAdapter.Fillメソッドを使用してDataSetを移入する場合、同じカスタム・タイプを使用します。
表3-23は、列の.NETタイプを指定するOracleDataReader GetFieldTypeおよびGetProviderSpecificFieldTypeメソッドから戻される値を示しています。
表3-23 OracleDataReaderメソッドから戻される値
| OracleDataReaderメソッドおよびプロパティの起動 | 列データ型 | カスタム・タイプ・マッピング | 戻り値 |
|---|---|---|---|
|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
3.15.8 OracleParameterとのOracle UDTパラメータのバインド
この項では、UDT出力および入力パラメータのOracleParameterオブジェクトとのバインドの使用について説明します。
関連項目:
この項の内容は次のとおりです。
3.15.8.1 UDT入力および出力パラメータのバインドのガイドライン
UDTパラメータのOracleParameterオブジェクトとのバインドを使用する場合は、開発者は次のことを考慮する必要があります。
-
UdtTypeNameプロパティを設定する必要があります。UdtTypeNameプロパティに基づいているバインドは、パラメータ・ディレクションには関係ありません。注意:
UdtTypeNameは、カスタム・タイプ・マッピングで指定されたOracle UDTとは異なる場合があります。これが発生するのは、パラメータ・タイプが、カスタム・タイプが表すOracle UDTのスーパー・タイプの場合です。 -
入出力バインドの場合、その動作は入力および出力パラメータと同じになります。
-
入力パラメータ値の場合、バインド値は、カスタム・タイプ・マッピングにより指定されたUDTに変換されます。
-
出力パラメータの場合は次のようになります。
-
戻り値がOracleオブジェクトまたはコレクションの場合、戻り値はカスタム・タイプ・マッピングにより指定されたカスタム・タイプまたは配列タイプに変換されます。戻り値は常にカスタム・タイプまたは配列タイプであり、プロパティの最新の設定値が
DbTypeまたはOracleDbTypeであるかは関係ありません。 -
戻り値が
REFの場合、カスタム・タイプ・マッピングは不要です。
-
3.15.8.2 OracleParametersを指定したUDT入力パラメータのバインド
OracleParameterオブジェクトには、OracleParameterのプロパティ値、DbType、OracleDbType、およびUdtTypeNameの特定の組合せのみ存在できます。OracleParameterオブジェクトを、リストされていない組合せに設定することはできません。
表3-24では、Oracle UDTに入力パラメータをバインドする有効な手段について説明します。
最後の列は、ODP.NETがOracleParameter値をOracleタイプに変換してからバインドするOracleタイプを示しています。
表3-24 Oracle UDTに入力パラメータをバインドする有効な手段
| OracleParameter.Value | OracleParameter.DbTypeまたはOracleParameter.OracleDbType | OracleParameter.UdtTypeName | カスタム・タイプ・マッピング | バインド前に行う変換先のOracleタイプ |
|---|---|---|---|---|
|
|
|
未設定 |
none | |
スローされる例外 |
|
|
|
|
none |
スローされる例外 |
|
|
|
|
|
指定されたUDTをインスタンス化します。値はオブジェクトまたはコレクションとして、 |
|
|
|
|
|
指定されたUDTをインスタンス化します。 |
|
|
|
|
|
指定されたUDTをインスタンス化します。 |
|
|
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
none | |
スローされる例外 |
|
Char[](16進) | |
|
|
none | |
|
3.15.8.3 OracleParametersを指定したUDT出力パラメータのバインド
OracleParameterオブジェクトには、OracleParameterのプロパティ値、DbType、OracleDbType、およびUdtTypeNameの特定の組合せのみ存在できます。OracleParameterオブジェクトを、リストされていない組合せに設定することはできません。
表3-25は、サポートされているODP.NETのOracleデータベース・オブジェクトの出力パラメータ・バインドを示しています。
最後の列は、ODP.NETはOracleParameter値をそのタイプに変換してからバインドする列を示しています。
表3-25 Oracle UDTに出力パラメータをバインドする有効な手段
| Oracleから戻されたタイプ | OracleParameter.DbType | OracleParameter.UdtTypeName | カスタム・タイプ・マッピング | 変換先のタイプ |
|---|---|---|---|---|
|
|
|
未設定 |
none | |
スローされる例外 |
|
|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
none | |
|
3.15.9 Oracle UDTでのDataSetの移入
DataSetは切断された結果セットです。ADO.NET 2.0では、.NETまたはプロバイダ固有のどちらのタイプを使用してもDataSetを移入できます。この項では、列がOracle UDTの場合にDataSetを移入するために使用するタイプについて説明します。
表3-26は、Oracle列タイプに基づくDataSet列、DataAdapterのReturnProviderSpecificTypesプロパティ、既存のカスタム・タイプ・マッピング、DataSetの列タイプ、 DataSetの列の値およびDataSetの列のNULL値をリストしています。
表3-26 ADO.NET 2.0でのDataSetを移入するタイプ
| Oracle列タイプ | ReturnProvider-SpecificTypesプロパティ | カスタム・タイプ・マッピング | DataSet列タイプ | DataSet列値 | DataSet列NULL値 |
|---|---|---|---|---|---|
|
|
|
none |
スローされる例外 |
スローされる例外 |
スローされる例外 |
|
|
|
schema.type |
|
|
|
|
|
|
schema.type |
|
|
|
|
|
|
schema.type |
|
|
|
|
|
|
schema.type |
|
|
|
|
|
|
none | schema.type |
|
|
|
|
|
|
none | schema.type |
|
|
|
3.15.10 UDTメソッドの起動
ODP.NETは、データベースのUDTに対して定義されたメソッドの起動をサポートします。次のいずれかを実行するとメソッドを起動できます。
-
CommandTypeをCommandType.StoredProcedureとして設定する。 -
CommandTextを"type_name.procedure_name"として設定する -
任意の
ExecuteメソッドをOracleCommandオブジェクトで使用してコマンドを実行する。
インスタンスのファンクションでは、パラメータは次のとおりです。
-
最初のパラメータは戻り値にする必要があります。
-
2番目のパラメータはインスタンス・メソッドが呼び出されるUDTインスタンスにする必要があります。これは.NETカスタム・オブジェクトのインスタンスです。
-
後続のパラメータはファンクション用です。
インスタンスのプロシージャでは、最初のパラメータはUDTインスタンスにする必要があります。
静的メソッドでは、UDTインスタンスは不要です。
3.15.11 Oracle UDTの構成設定
ODP.NETは、2つの構成設定を公開してODP.NETによるOracle UDTの処理方法を決定します。
これらの構成設定は、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Versionの下に存在する名前のレジストリ・キーを使用すれば、ODP.NETの特定バージョンに対するマシン全体の設定として指定できます。.NET Framework全体の設定についてmachine.configでエントリが作成された場合、またはアプリケーション固有の設定についてapp.configまたはweb.configでエントリが作成された場合、レジストリで指定された構成設定よりも優先されます。
関連項目:
ODP.NETの構成の詳細は、「Oracle Data Provider for .NETの構成」を参照してください。
3.15.11.1 StatementCacheWithUdts
StatementCacheWithUdtsは、文キャッシュに戻される場合に、SELECT文によって取得されるOracle UDTをSELECT文と一緒にODP.NETがキャッシュするかどうかを指定します。戻される値は1 - Yes(デフォルト)または0 - Noです。
値が1の場合、Oracle UDTは文と一緒にキャッシュされます。そのため、UDTが含まれていたメモリーを再利用できます。その後同じ文を実行する場合には、追加メモリーは不要です。これにより全体のパフォーマンスは向上します。
値が0の場合、ODP.NETが取得されたOracle UDTのメモリーを解放してから、文は文キャッシュに戻されます。これによりパフォーマンスが低下するのは、その後の実行に新しいメモリーの割当てが必要になるためです。