2 OraOLEDBの機能
次の各項では、Oracle Provider for OLE DB (OraOLEDB)のコンポーネントについて、およびこれらのコンポーネントを使用してOLE DBコンシューマ・アプリケーションを開発する方法について説明します。
2.1 OraOLEDBプロバイダ固有の機能
次の各項で、OraOLEDBのプロバイダ固有の機能について説明します。
この他のプロバイダ固有の情報は、プロバイダ固有の情報を参照してください。
2.1.1 データ・ソース
OraOLEDBのデータソース・オブジェクトは、Oracle Databaseへの最初の接続を確立します。初期接続を確立するために、コンシューマはCoCreateInstance
ファンクションを使用してデータソース・オブジェクトのインスタンスを作成する必要があります。このファンクションでは、プロバイダに関する重要な情報(プロバイダのクラスIDと実行可能なコンテキスト)が必要です。OraOLEDBのクラスIDは、CLSID_OraOLEDB
です。
OraOLEDBはインプロセス・サーバーです。CoCreateInstance
をコールするには、CLSCTX_INPROC_SERVER
マクロを使用します。次に例を示します。
// create an instance of OraOLEDB data source object and // obtain the IDBInitialize interface hr = CoCreateInstance(CLSID_OraOLEDB, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);
上のコード・スニペットでは、データソース・オブジェクトをインスタンス化しても、OLEDBサービスは有効になりません。OLEDBサービスを有効にするには、この後のOLE DBサービスとの互換性を参照してください。
注意:
OraOLEDBは、永続データソース・オブジェクトをサポートしません。
データソース・オブジェクトのインスタンスが正常に作成されると、コンシューマ・アプリケーションはそのデータソースを初期化してセッションを作成できます。
OraOLEDBは、Oracle Databaseの各リリースとの接続をサポートします。特定のデータベースと接続するために、コンシューマはDBPROPSET_DBINIT
プロパティ・セットの次のプロパティを設定する必要があります。
-
DBPROP_AUTH_USERNAME
にユーザーID(scott
など)を設定します。 -
DBPROP_AUTH_PASSWORD
にパスワード(tiger
など)を設定します。 -
DBPROP_INIT_DATASOURCE
にネット・サービス名(myOraDb
など)を設定します。
また、コンシューマは、DBPROP_INIT_PROMPT
にDBPROMPT_PROMPT
を使用できます。これを使用すると、プロバイダがログオン・ボックスを表示するので、ユーザーは接続情報を入力できるようになります。
DBPROMPT_NOPROMPT
を使用すると、ログオン・ボックスの表示ができなくなります。この場合は、ログオン情報が不完全なために、プロバイダはログオン・エラーを返します。ただし、このプロパティにDBPROMPT_COMPLETE
またはDBPROMPT_COMPLETEREQUIRED
が設定されている場合は、ログオン情報が不完全な場合にのみログオン・ボックスが表示されます。
2.1.1.1 OLE DBサービスとの互換性
OraOLEDBは、OLE DB Version 2.0以上で使用可能なOLE DBサービスと互換性があります。OLE DBサービスには、自動トランザクション登録、クライアント・カーソル・エンジン(CCE)、接続およびセッション・プールといった、アプリケーションのパフォーマンス向上に役立つ有用なサービスが含まれています。
OLE DBサービスは、C++/COMまたはADOを介してOraOLEDBで使用できます。
デフォルトでは、OraOLEDBのCLSID
の下にあるOraOLEDBのOLEDB_SERVICES
レジストリ・エントリが0xffffffff
(-1
)に設定され、すべてのサービスが有効になります。DBPROP_INIT_OLEDBSERVICES
プロパティの設定を使用して、プログラムによって特定のOLE DBサービスを無効または有効にすることもできます。
関連項目:
OLE DBサービスの詳細、および特定のサービスを有効または無効にする方法の詳細は、http://msdn.microsoft.com/en-us/library/ms724518(VS.85).aspx
を参照してください。
2.1.1.1.1 ADOアプリケーションでのOLE DBサービス
ADOでは、OLE DBサービスが自動的に有効になります。このため、ADOアプリケーションでOLEDBサービスを使用するために特別なコードは必要ありません。
2.1.1.1.2 C++/COMアプリケーションでのOLE DBサービス
C++/COMアプリケーションでOLE DBサービスを使用するためには、いくつかの追加手順が必要です。
次のコード・スニペットは、C++/COMアプリケーションでOLE DBサービスを有効にする1つの方法を示しています。このコードは、CoCreateInstance()
を使用してCLSID_MSDAINITIALIZE
クラスのインスタンスを作成し、そのオブジェクトからIDataInitialize
インタフェースを取得した後、そのインタフェースを介してOLE DBデータソース・オブジェクトを作成するOLE DBコンシューマを示しています。
// Instantiate the CLSID_MSDAINITIALIZE class and request for the
// IID_IDataInitialize interface from it
hr = CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,
IID_IDataInitialize, (void**)&pIDataInitialize);
// Set properties, datasource name, userid, and password, etc.
...
// Create an OLEDB data source object using the interface obtained from the
// CLSID_MSDAINITIALIZE class.
hr = pIDataInitialize->CreateDBInstance(CLSID_OraOLEDB, NULL,
CLSCTX_INPROC_SERVER, NULL,IID_IDBInitialize,(IUnknown**)&pIDBInitialize);
...
// If connection/session pooling was enabled, pIDBInitialize->Release()
// releases the connection/session back to the pool.
// pIDataInitialize->Release() should not be called until the application no
// longer need to use connection/session pooling and the rest of
// the OLE DB Services that were enabled for the application.
//
pIDBInitialize->Release();
2.1.1.2 Oracle Databaseへの接続
OraOLEDBを使用してOracle Databaseに接続するには、OLE DB接続文字列を次のように設定する必要があります。
"Provider=OraOLEDB.Oracle;User ID=user;Password=pwd;Data Source=constr;"
リモート・データベースに接続するには、Data
Source
に、適切なネット・サービス名(tnsnames.ora
ファイル内にある別名)を設定する必要があります。
2.1.1.3 OraOLEDB固有の接続文字列属性
OraOLEDBによって、プロバイダ固有の接続文字列属性が提供されますが、これらはプロバイダおよびユーザーIDの設定方法と同じ方法で設定されます。プロバイダ固有の接続文字列属性は、次のとおりです。
-
CacheType
- クライアント上の行セット・データの格納に使用する、キャッシュのタイプを指定します。行セットのためのOraOLEDB固有の接続文字列属性を参照してください。 -
ChunkSize
- プロバイダのキャッシュに格納される、LONG
型またはLONG RAW
型の列データのサイズを指定します。行セットのためのOraOLEDB固有の接続文字列属性を参照してください。 -
DistribTX
- 分散トランザクションの登録機能を有効または無効にします。「分散トランザクション」を参照してください。 -
FetchSize
- 取り出す配列のサイズを行数で指定します。行セットのためのOraOLEDB固有の接続文字列属性を参照してください。 -
OLEDB.NET
- OLEDB.NETデータ・プロバイダとの互換性を有効または無効にします。OLEDB.NETデータ・プロバイダの互換性を参照してください。 -
OSAuthent
- Oracle Databaseに接続するときに、オペレーティング・システム認証が使用されるかどうかを指定します。オペレーティング・システム認証を参照してください。 -
PLSQLRSet
- PL/SQLストアド・プロシージャから行セットを返す機能を有効または無効にします。コマンドのためのOraOLEDBカスタム・プロパティを参照してください。 -
PwdChgDlg
- パスワードが期限切れになったときに、パスワード変更ダイアログ・ボックスを表示可能または不可にします。「パスワードの期限」を参照してください。 -
UseSessionFormat
- セッションの間、NLSセッションのデフォルトの書式を使用するか、OraOLEDBでこれらの書式の一部を上書きするかを指定します。有効値は0
(FALSE
)と1
(TRUE
)です。デフォルト値はFALSE
で、OraOLEDBはNLSセッションのデフォルトの書式の一部を上書きできます。値がTRUE
の場合、OraOLEDBはNLSセッションのデフォルトの書式を使用します。この接続属性は、
\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下に表示されないので注意してください。 -
VCharNull
- ストアド・プロシージャでVARCHAR2 OUT
パラメータのヌル文字での終了を有効または無効にします。 -
SPPrmDefVal
- アプリケーションでストアド・プロシージャのパラメータ値が指定されていない場合に、デフォルト値とNULL値のどちらを使用するかを指定します。 -
NDataType
: コマンドにバインドされているパラメータのいずれかがNデータ型かどうかを指定しますが、これには、NCHAR
、NVARCHAR2
またはNCLOB
が含まれます。「NDatatype」を参照してください。この接続属性は、
\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下に表示されないので注意してください。 -
SPPrmsLOB
: ストアド・プロシージャにバインドされている1つ以上のパラメータがLOBデータ型かどうかを指定しますが、これには、CLOB
、BLOB
またはNCLOB
が含まれます。「SPPrmsLOB」を参照してください。この接続属性は、
\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下に表示されないので注意してください。 -
StmtCacheSize
- キャッシュできる文の最大数を指定します。「文のキャッシュ」を参照してください。 -
MetaDataCacheSize
- メタデータをキャッシュできるSELECT
文の最大数を指定します。「メタデータのキャッシュ」を参照してください。 -
DeferUpdChk
- 読取り専用の非接続行セットの更新がサポートされるよう、更新可能性チェックを遅らせるかどうかを指定します。行セットのためのOraOLEDB固有の接続文字列属性のDeferUpdChk
を参照してください。 -
DBNotifications
- 高可用性イベントにサブスクライブするかどうかを指定します。拡張フェイルオーバー機能を参照してください。 -
DBNotificationPort
- データベース通知のリスニング用に開かれるポート番号を指定します。拡張フェイルオーバー機能を参照してください。
2.1.1.4 デフォルトの属性値
この属性のデフォルト値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下にあります。このKEY_
HOMENAME
はOracleホームです。
レジストリにあるすべてのデフォルト値は、プロバイダがメモリーにロードされたときに、OraOLEDBによってそのレジストリから読み込まれます。接続時にOracle固有の接続文字列属性が与えられない場合は、デフォルトのレジストリ値を使用します。ただし、属性が与えられた場合は、新しい値によってデフォルトのレジストリ値が上書きされます。
DBPROPSET_DBINIT
プロパティ・セットの中のDBPROP_INIT_PROVIDERSTRING
プロパティを設定した場合も、これらの属性を設定できます。次に例を示します。
"FetchSize=100;CacheType=Memory;OSAuthent=0;PLSQLRSet=1;StmtCacheSize=10;"
2.1.1.5 分散トランザクション
DistribTX
属性は、セッションを分散トランザクションに登録できるかどうかを指定します。有効値は0
(使用不可)と1
(使用可能)です。デフォルトは1
で、セッションを分散トランザクションに登録できることを示します。
Microsoft Distributed Transaction Coordinatorを使用しているアプリケーションでは、DistribTX
をデフォルトの1
に設定する必要があります。
分散トランザクションに登録できるセッションでは、Oracle Databaseのダイレクト・パス・ロードおよびパラレルDML機能を使用する文を実行できません。このような文は従来型パスのシリアル文として実行されます。
2.1.1.6 拡張フェイルオーバー機能
この機能により、フェイルオーバー機能が強化されます。
これらの接続文字列属性のサポートにより、フェイルオーバー機能が強化されました。
-
DBNotifications
DBNotifications
属性は、高可用性イベントにサブスクライブするかどうかを指定します。有効値は0
(FALSE
)と1
(TRUE
)です。デフォルトはFALSE
で、OraOLEDBが高可用性イベントにサブスクライブされないことを示します。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。 -
DBNotificationPort
DBNotificationPort
属性は、データベース通知のリスニングに使用されるポート番号を指定します。有効値は符号なしの整数です。DBNotificationPort
は、接続文字列属性またはレジストリ・エントリのいずれかを使用してDBNotifications
属性がTRUE
に設定されている場合にのみ有効です。DBNotificationPort
属性のデフォルトは0
で、これはOraOLEDBが有効なポートをランダムに開くことを意味します。OraOLEDBはポート番号を検証しないため、有効なポート番号を指定するのはアプリケーションの役割です。
レジストリ・エントリを使用したフェイルオーバー機能の有効化
-
DBNotifications
DBNotifications
レジストリ・エントリは、高可用性イベントにサブスクライブするかどうかを指定します。有効値は0
(FALSE
)と1
(TRUE
)です。デフォルト値はFALSE
で、OraOLEDBはサブスクライブされません。このレジストリ・エントリ値は、DBNotifications
接続文字列属性が設定されていない場合に使用されます。この値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\
KEY_
HOMENAME
\OLEDB
レジストリ・キーの下にあります。
2.1.1.7 オペレーティング・システム認証
OSAuthent
属性は、Oracle Databaseに接続するときに、オペレーティング・システム認証が使用されるかどうかを指定します。有効値は0
(使用不可)と1
(使用可能)です。デフォルトは0
で、オペレーティング・システム認証が使用されないことを示します。
オペレーティング・システム認証という機能によって、Oracleはユーザーを認証するためにオペレーティング・システムのセキュリティ・メカニズムを使用します。
Windowsクライアントがオペレーティング・システム認証のために正しく設定されると、OraOLEDBクライアントは、次のいずれかを設定することでこの機能を使用できるようになります。
-
DBPROP_AUTH_USERNAME
を/
に設定 -
DBPROP_INIT_PROVIDERSTRING
をOSAuthent=1
;に設定 -
レジストリの
OSAuthent
を1
に設定
関連項目:
この件とWindowsクライアントでの設定方法の詳細は、『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』を参照してください。
2.1.1.8 パスワードの失効
Oracleには、パスワードの有効期限機能があり、データベース管理者はこれを使用して、ユーザーがパスワードを定期的に変更するように強制できます。PwdChgDlg
属性は、パスワードの期限切れが原因でログオンできないときに、パスワード変更ダイアログ・ボックスの表示を有効化または無効化します。有効にした場合、プロバイダは、パスワードを変更するためのダイアログ・ボックスを表示します。無効にした場合は、ログオンが失敗し、エラー・メッセージが表示されます。有効値は0
(無効)および1
(有効)です。デフォルトは1
(有効)です。
関連項目:
パスワード失効機能の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
例: ADOによるOracle Databaseへの接続
次の例で、OraOLEDBおよびADOによるOracle Databaseへの接続方法を示します。
注意:
Data Source
、User ID
およびPassword
がOpen
メソッドで指定されている場合、ADOはそれらのConnectionString
属性を無視します。
ConnectionStringを使用して接続
Dim con As New ADODB.Connection con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=MyOraDb;" & _ "User ID=scott;Password=tiger;" con.Open
ConnectionStringを使用しないで接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.Open "MyOraDb", "scott", "tiger"
接続してプロバイダ固有の属性を設定
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.ConnectionString = "FetchSize=200;CacheType=Memory;" & _ "OSAuthent=0;PLSQLRSet=1;Data Source=MyOraDb;" & _ "User ID=scott;Password=tiger;" con.Open
ユーザーIDに「/」を設定するオペレーティング・システム認証接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.Open "MyOraDb", "/", ""
OSAuthentを使用するオペレーティング・システム認証接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.ConnectionString = "Data Source=MyOraDb;OSAuthent=1;" con.Open
2.1.1.9 VCharNull
VCharNull
属性は、ストアド・プロシージャで、VARCHAR2 OUT
パラメータのヌル文字での終了を有効または無効にします。有効値は0
(使用不可)と1
(使用可能)です。デフォルトは1
で、VARCHAR2 OUT
パラメータがヌル文字で終了することを示します。値0
は、VARCHAR2 OUT
パラメータに空白が埋め込まれることを示します。
この属性のデフォルト値は、\\HKEY_LOCAL_ MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下にあり、このHOMENAME
はOracleホームです。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
この接続属性を有効にした場合、アプリケーションでストアド・プロシージャのIN
パラメータとIN OUT CHAR
パラメータをWHERE
句で使用するときは、パラメータに明示的に空白を埋め込む必要があります。
2.1.1.10 SPPrmDefVal
SPPrmDefVal
属性は、アプリケーションでストアド・プロシージャのパラメータ値が指定されていない場合に、デフォルト値とNULL値のどちらを使用するかを指定します。有効値は0
(FALSE)と1
(TRUE)です。デフォルトはFALSEで、OraOLEDBでNULL値を渡すことができます。値がTRUEであれば、OraOLEDBでデフォルト値が使用されます。
この属性のデフォルト値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
HOMENAME
\OLEDB
レジストリ・キーの下にあります。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
2.1.2 OraOLEDBセッション
OraOLEDBセッション・オブジェクトは、Oracle Databaseへの単一の接続を表します。セッション・オブジェクトは、データにアクセスして操作できるようにするインタフェースを公開します。
初期化データソースに作成される最初のセッションは、IDBInitialize::Initialize()
で確立された初期接続を継承します。作成される後続のセッションは、データソース・プロパティで指定された特定のOracle Databaseへの、それぞれ個別の接続を確立します。
各セッション・オブジェクトもまた、データソースのトランザクション領域を定義します。特定のセッション・オブジェクトから作成されるすべてのコマンド・オブジェクトおよび行セット・オブジェクトは、そのセッションのトランザクションの一部になります。
そのセッション・オブジェクトへのすべての参照が解放されると、セッション・オブジェクトはメモリーから削除され、接続は切断されます。
2.1.2.1 トランザクション
OraOLEDBは、トランザクション操作の明示的なコミットと異常終了を行う、ローカル・トランザクションおよび分散トランザクションをサポートします。
OraOLEDBでは、ネストしたトランザクションはサポートしません。さらに、現在分散トランザクションに登録されているセッションでは、ローカル・トランザクションを起動できません。逆も同様で、現在ローカル・トランザクションに登録されているセッションでは、分散トランザクションを起動できません。
2.1.2.1.1 ローカル・トランザクション
OraOLEDBは、明示的トランザクションのためのITransactionLocal
インタフェースをサポートします。デフォルトでは、OraOLEDBは自動コミット・モードで、データベース上で終了した各処理は自動的または暗黙的にコミットされます。ITransactionLocal
インタフェースを使用すると、コンシューマは明示的に特定のセッションに対するトランザクションを起動できるようになり、コンシューマが明示的に各処理をコミットまたは異常終了できるようになります。
OraOLEDBは、コミット読取り(カーソル・スタビリティ)分離レベルをサポートします。このレベルでは、別のトランザクションによる変更は、そのトランザクションがコミットされるまで参照できなくなります。
2.1.2.1.2 分散トランザクション
OraOLEDBコンシューマを、Microsoft Transaction Server(またはCOM+)トランザクションに登録する、またはMicrosoft分散トランザクション・コーディネータ(MS DTC)によって調整された分散トランザクションに登録するには、Oracle Services for Microsoft Transaction Server(MTS)リリース10.2以上をインストールする必要があります。
ITransactionJoin::JoinTransaction()
がコールされると、OraOLEDBはIsoLevel
、IsoFlags
およびpOtherOptions
の各パラメータを無視します。コンシューマがITransactionDispenser::BeginTransaction()
メソッドをコールしてMS DTCからトランザクション・オブジェクトを取得する場合は、これらのオプションが必要です。
ただし、IsoFlags
が0でない場合は、XACT_E_NOISORETAIN
が返されます。
関連項目:
Oracle Services for MTSでの設定および構成情報の詳細は、『Oracle Services for Microsoft Transaction Server開発者ガイドfor Microsoft Windows』を参照してください。
2.1.3 コマンド
OraOLEDBは、Oracle DatabaseによってサポートされるANSI SQLと、ODBC SQL構文をサポートします。
2.1.3.1 ストアド・プロシージャ
コマンドを使用してOracle PL/SQL ストアド・プロシージャを実行する場合、コマンドで、次のようにOracle固有の構文またはODBCプロシージャ・コールのエスケープ・シーケンスを使用します。
-
Oracle固有の構文:
BEGIN credit_account(123, 40); END;
-
ODBC構文:
{CALL credit_account(123, 40)}
2.1.3.3 コマンド・パラメータ
Oracle ANSI SQLを使用する場合は、コマンド内のパラメータの前にコロンを付けます。ODBC SQLの場合は、パラメータに疑問符(?
)を付けます。
OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションの入力、出力および入出力パラメータをサポートします。OraOLEDBは、SQL文の入力パラメータをサポートします。
注意:
OraOLEDBは、位置バインドのみをサポートします。
2.1.3.4 コマンドのためのOraOLEDBカスタム・プロパティ
コマンドのためのOraOLEDBカスタム・プロパティは、カスタム・プロパティ・セットORAPROPSET_COMMANDS
の下にグループ化されます。次のプロパティを提供します。
表2-1 コマンドのためのカスタム・プロパティ
Visual Basicユーザーの場合 | C++ユーザーの場合 |
---|---|
|
|
|
|
|
|
|
|
PLSQLRSet
このプロパティは、PLSQLRSet
接続文字列属性と同様です。
このプロパティは、OraOLEDBがPL/SQLストアド・プロシージャから行セットを返す必要があるかどうかを指定します。コンシューマから提供されたストアド・プロシージャが行セットを返す場合は、PLSQLRSet
をTRUE
(使用可能)に設定する必要があります。このプロパティは、コマンドが実行された後はFALSE
に設定する必要があります。デフォルトでは、このプロパティはFALSE
(使用不可)に設定されます。
プロパティは、セッションではなくコマンド・オブジェクトで設定できるので、コンシューマは、属性よりプロパティを優先的に使用する必要があります。コマンド・オブジェクトで設定することにより、コンシューマは、行セットを返すストアド・プロシージャを実行するコマンド・オブジェクトに対してのみプロパティを設定することができます。属性の場合、コンシューマは、ADOアプリケーションによって実行される多くのストアド・プロシージャの1つのみが行セットを返した場合でも、属性を設定する必要があります。このプロパティを使用すると、以前に属性を使用していたアプリケーションのパフォーマンスを向上させることができます。
例: カスタム・プロパティPLSQLRSetの設定
Dim objRes As NEW ADODB.Recordset Dim objCon As NEW ADODB.Connection Dim objCmd As NEW ADODB.Command .... objCmd.ActiveConnection = objCon objCmd.CommandType = adCmdText ' Enabling the PLSQLRSet property indicates to the provider ' that the command returns one or more rowsets objCmd.Properties("PLSQLRSet") = TRUE ' Assume Employees.GetEmpRecords() has a REF CURSOR as ' one of the arguments objCmd.CommandText = "{ CALL Employees.GetEmpRecords(?,?) }" ' Execute the SQL set objRes = objCmd.Execute ' It is a good idea to disable the property after execute as the ' same command object may be used for a different SQL statement objCmd.Properties("PLSQLRSet") = FALSE
NDatatype
このプロパティを使用すると、コンシューマは、コマンドにバインドされているパラメータのいずれかがOracleのNデータ型(NCHAR
、NVARCHAR2
またはNCLOB
)かどうかを指定できます。この情報は、OraOLEDBがパラメータを検出およびバインドするために必要です。このプロパティは、SELECT
文を実行するコマンドには設定しないでください。ただし、このプロパティはINSERT
、UPDATE
、DELETE
など、その他すべてのSQL文には設定する必要があります。
このプロパティを設定すると、データベースへの少なくとも1回のラウンドトリップという処理オーバーヘッドが課されるので、このプロパティの使用はNデータ型のパラメータを含むSQL文に限定する必要があります。デフォルトでは、このプロパティはFALSE
に設定されています。
注意:
OraOLEDBは、SQL文のWHERE
句内ではNデータ型のパラメータをサポートしません。
注意:
コンシューマは、ODBCプロシージャ・コールのエスケープ・シーケンスを使用して、Nデータ型パラメータを持つストアド・プロシージャまたはファンクションをコールする必要があります。
例: カスタム・プロパティNDatatypeの設定
Dim objCon As NEW ADODB.Connection Dim objCmd As NEW ADODB.Command Dim prEmpno As NEW ADODB.Parameter Dim prEname As NEW ADODB.Parameter ... objCmd.ActiveConnection = objCon objCmd.CommandType = adCmdText ' Create and append the parameters to the command object Set prEmpno = objCmd.CreateParameter("prEmpno", adSmallInt, adParamInput, ,8521) ' prEname is bound to a NVARCHAR2 column in the EMP table Set prEname = objCmd.CreateParameter("prEname", adBSTR, adParamInput, , "Joe") objCmd.Parameters.Append prEmpno objCmd.Parameters.Append prEname ' Enabling the NDatatype property indicates to the provider ' that one or more of the bound parameters is of N datatype objCmd.Properties("NDatatype") = TRUE ' Assume column ENAME in table EMP is of NVARCHAR2 type objCmd.CommandText = "INSERT INTO EMP (EMPNO, ENAME) VALUES (?, ?)" ' Execute the SQL objCmd.Execute ' It is a good idea to disable the property after execute as the same command ' object may be used for a different SQL statement objCmd.Properties("NDatatype") = FALSE
SPPrmsLOB
このプロパティを使用すると、コンシューマは、ストアド・プロシージャにバインドされているパラメータの1つ以上がOracleのLOBデータ型(CLOB
、BLOB
またはNCLOB
)かどうかを指定できます。OraOLEDBでは、ストアド・プロシージャを実行する前にそのパラメータ・リストをフェッチするために、このプロパティをTRUE
に設定する必要があります。このプロパティを使用すると、1つ以上のLOBデータ型パラメータを持つストアド・プロシージャの処理オーバーヘッドが制限されます。このプロパティは、コマンドが実行された後はFALSE
に設定する必要があります。デフォルトでは、このプロパティはFALSE
に設定されています。
注意:
コンシューマは、ODBCプロシージャ・コールのエスケープ・シーケンスを使用して、LOBデータ型パラメータを持つストアド・プロシージャまたはストアド・ファンクションをコールする必要があります。
例: カスタム・プロパティSPPrmsLOBの設定
Dim objCon As NEW ADODB.Connection Dim objCmd As NEW ADODB.Command Dim prCLOB As NEW ADODB.Parameter ... objCmd.ActiveConnection = objCon objCmd.CommandType = adCmdText ' Create and append the parameters to the command object Set prCLOB = objCmd.CreateParameter("prCLOB", adLongVarchar, adParamOutput, _ 10000) objCmd.Parameters.Append prCLOB ' Enabling the SPPrmsLOB property indicates to the provider ' that one or more of the bound parameters is of LOB data type objCmd.Properties("SPPrmsLOB") = TRUE ' Assume the Stored Procedure requires a CLOB parameter objCmd.CommandText = "{ call storedproc(?) }" 'Execute the SQL objCmd.Execute ' It is a good idea to disable the property after execute as the ' same command object may be used for a different SQL statement objCmd.Properties("SPPrmsLOB") = FALSE
AddToStmtCache
このプロパティを使用すると、プロパティがTRUE
に設定され、文のキャッシュが有効になっているときに、実行された文をコンシューマがキャッシュできます。文のキャッシュが無効になっているか、このプロパティがFALSE
に設定されていると、実行された文はキャッシュされません。
文のキャッシュが無効の場合、このプロパティは無視されます。文のキャッシュを有効にするには、StmtCacheSize
接続文字列属性を0よりも大きい値に設定します。このプロパティを使用すると、文のキャッシュが有効な場合に、文を選択してキャッシュに追加することができます。デフォルトでは、このプロパティはTRUE
に設定されています。
例: カスタム・プロパティAddToStmtCacheの設定
Dim objCon As NEW ADODB.Connection Dim objCmd As NEW ADODB.Command ... ' Statement caching is enabled by setting the 'StmtCacheSize' ' connection string attribute to a value greater than zero objCon.ConnectionString = "StmtCacheSize=10;Data Source=MyOraDb;" & _ "User ID=scott;Password=tiger;" objCon.Open objCmd.ActiveConnection = objCon objCmd.CommandType = adCmdText objCmd.CommandText = "SELECT * FROM EMP" ' "SELECT * FROM EMP" statement would be added to the statement cache because ' StmtCacheSize connection string attribute value is greater than 0 and ' AddToStmtCache property value is TRUE by default. objCmd.Execute ' Do not add "SELECT * FROM DEPT" to the statement cache objCmd.CommandText = "SELECT * FROM DEPT" objCmd.Properties("AddToStmtCache") = FALSE ' "SELECT * FROM DEPT" statement would not be added to the statement cache objCmd.Execute
2.1.3.5 行セットを返すストアド・プロシージャおよびストアド・ファンクション
Oracle Provider for OLE DBでは、コンシューマは、REF
CURSOR
型の引数を持つPL/SQLストアド・プロシージャまたはREF
CURSOR
値を返すストアド・ファンクションを実行できます。
OraOLEDBはREF
CURSOR
バインド変数に対して行セットを返します。OLE DBの仕様にはREF
CURSOR
のデータ型が定義されていないため、コンシューマはこのパラメータをバインドできません。
PL/SQLストアド・プロシージャにREF
CURSOR
型の引数が1つ以上ある場合、OraOLEDBはそれらの引数をバインドし、REF
CURSOR
型の各引数に対して行セットを返します。
PL/SQLストアド・ファンクションがREF
CURSOR
を返す場合、またはREF
CURSOR
型の引数を持つ場合、OraOLEDBはそれらの引数をバインドし、各REF
CURSOR
型に対して行セットを返します。
この機能を使用するには、ODBCプロシージャ・コールのエスケープ・シーケンスでストアド・プロシージャまたはストアド・ファンクションをコールする必要があります。
コールされるストアド・プロシージャまたはストアド・ファンクションは、スタンドアロンまたはパッケージのどちらでも構いません。ただし、返されるREF
CURSOR
は、データベース内のパッケージで明示的に定義されている必要があります。
2.1.3.6 複数の行セット
OraOLEDBは、ストアド・プロシージャから複数の行セットを返す機能をサポートしています。コンシューマは、この機能を使用して、ストアド・プロシージャから返されたすべてのREF
CURSOR
にアクセスできます。
例: 複数の行セットを返すストアド・プロシージャ
PL/SQLパッケージ
CREATE OR REPLACE PACKAGE Employees AS TYPE empcur IS REF CURSOR; PROCEDURE GetEmpRecords(p_cursor OUT empcur, q_cursor OUT empcur, indeptno IN NUMBER, p_errorcode OUT NUMBER); FUNCTION GetDept(inempno IN NUMBER, p_errorcode OUT NUMBER) RETURN empcur; END Employees; CREATE OR REPLACE PACKAGE BODY Employees AS PROCEDURE GetEmpRecords(p_cursor OUT empcur, q_cursor OUT empcur, indeptno IN NUMBER, p_errorcode OUT NUMBER) IS BEGIN p_errorcode := 0; OPEN p_cursor FOR SELECT * FROM emp WHERE deptno = indeptno ORDER BY empno; OPEN q_cursor FOR SELECT empno FROM emp WHERE deptno = indeptno ORDER BY empno; EXCEPTION WHEN OTHERS THEN p_errorcode:= SQLCODE; END GetEmpRecords; FUNCTION GetDept(inempno IN NUMBER, p_errorcode OUT NUMBER) RETURN empcur IS p_cursor empcur; BEGIN p_errorcode := 0; OPEN p_cursor FOR SELECT deptno FROM emp WHERE empno = inempno; RETURN (p_cursor); EXCEPTION WHEN OTHERS THEN p_errorcode:= SQLCODE; END GetDept; END Employees;
ADOプログラム
Dim Con As New ADODB.Connection Dim Rst1 As New ADODB.Recordset Dim Rst2 As New ADODB.Recordset Dim Rst3 As New ADODB.Recordset Dim Cmd As New ADODB.Command Dim Prm1 As New ADODB.Parameter Dim Prm2 As New ADODB.Parameter Con.Provider = "OraOLEDB.Oracle" Con.ConnectionString = "Data Source=MyOraDb;" & _ "User ID=scott;Password=tiger;" Con.Open Cmd.ActiveConnection = Con ' Although Employees.GetEmpRecords() takes four parameters, only ' two need to be bound because Ref cursor parameters are automatically ' bound by the provider. Set Prm1 = Cmd.CreateParameter("Prm1", adSmallInt, adParamInput, , 30) Cmd.Parameters.Append Prm1 Set Prm2 = Cmd.CreateParameter("Prm2", adSmallInt, adParamOutput) Cmd.Parameters.Append Prm2 ' Enable PLSQLRSet property Cmd.Properties ("PLSQLRSet") = TRUE ' Stored Procedures returning resultsets must be called using the ' ODBC escape sequence for calling stored procedures. Cmd.CommandText = "{CALL Employees.GetEmpRecords(?, ?)}" ' Get the first recordset Set Rst1 = Cmd.Execute ' Disable PLSQLRSet property Cmd.Properties("PLSQLRSet") = FALSE ' Get the second recordset Set Rst2 = Rst1.NextRecordset ' Just as in a stored procedure, the REF CURSOR return value must ' not be bound in a stored function. Prm1.Value = 7839 Prm2.Value = 0 ' Enable PLSQLRSet property Cmd.Properties("PLSQLRSet") = TRUE ' Stored Functions returning resultsets must be called using the ' ODBC escape sequence for calling stored functions. Cmd.CommandText = "{CALL Employees.GetDept(?, ?)}" ' Get the rowset Set Rst3 = Cmd.Execute ' Disable PLSQLRSet Cmd.Properties ("PLSQLRSet") = FALSE ' Clean up Rst1.Close Rst2.Close Rst3.Close
2.1.3.7 文キャッシュ
文のキャッシュにより、SQLまたはPL/SQL文の最初の実行時に作成されたサーバー・カーソルがキャッシュされるため、実行前に各文を解析する必要がなくなります。同じ文を後で実行する場合、カーソルから解析された情報を再利用して、文を解析せずに実行することで、パフォーマンスが向上します。
文のキャッシュによるパフォーマンスの向上を確認するには、繰り返して実行される文のみをキャッシュすることをお薦めします。さらに、SQL文またはPL/SQL文では、リテラル値ではなくパラメータを使用してください。このようにすると、文のキャッシュを最大限に活用できます。パラメータを含む文の解析情報は、後続の実行でパラメータ値が変わっても再利用できるためです。ただし、文のリテラル値が異なる場合、解析された情報は、後続の文にも同じリテラル値がないかぎり、再使用できません。
StmtCacheSize接続文字列属性
この属性は、OraOLEDB文のキャッシングを有効化または無効化します。デフォルトでは、この属性は0
(無効)に設定されています。0
より大きい値に設定した場合、OraOLEDB文のキャッシングが有効になり、この値は接続用にキャッシュできる文の最大数を指定します。
1つの接続について指定の最大キャッシュ・サイズまでキャッシュされると、最近使用されていなかったカーソルが解放されて、新たに作成されたカーソルをキャッシュするための領域が空けられます。この値は、init.ora
データベース・コンフィギュレーション・ファイルにあるOPEN_CURSORS
パラメータ・セットの値以下にする必要があります。
AddToStmtCacheコマンドのプロパティ
このプロパティは、文のキャッシュが有効な場合にのみ関係があります。文のキャッシュが有効な場合に、このプロパティがtrue
(デフォルト)に設定されると、実行時に文がキャッシュに追加されます。文のキャッシュが無効になっているか、このプロパティがfalse
に設定されていると、実行された文はキャッシュされません。
レジストリを使用した文のキャッシュの有効化
システムで実行するすべてのOraOLEDBアプリケーションについて、アプリケーションを変更せずに、文のキャッシュをデフォルトで有効にするには、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\
KEY_
HOMENAME
\OLEDB\StmtCacheSize
のレジストリ・キーを0
よりも大きい値に設定します。このHOMENAME
は適切なOracleホームです。この値は、サーバーでキャッシュされるカーソルの数を指定します。デフォルトでは、これは10
に設定されています。
接続と文キャッシング
文キャッシングは、接続ごとに個別に管理されます。このため、同じ文を別の接続で実行するときは、接続ごとに文を1回解析して個別のカーソルをキャッシュする必要があります。
2.1.3.8 メタデータのキャッシュ
この機能は、SELECT
文の最初の実行時にメタデータをキャッシュすることで、文のメタデータの取得を最小限に抑えます。その後に実行された同じ文は、キャッシュされたメタデータ情報を再利用して、パフォーマンスを向上させることができます。メタデータのキャッシュによるパフォーマンスの向上を確認するには、繰り返して実行される文のみをキャッシュすることをお薦めします。
注意:
メタデータのキャッシュは、各接続で個別に管理されます。そのため、同じ文を異なる接続で実行するには、メタデータを接続ごとに1回キャッシュする必要があります。
2.1.3.8.1 接続文字列属性を使用したメタデータのキャッシュの有効化
MetaDataCacheSize
属性は、OraOLEDBメタデータ・キャッシングを有効化または無効化します。0
より大きい値に設定した場合、OraOLEDBメタデータ・キャッシングが有効になり、この値はメタデータが接続用にキャッシュできる文の最大数を指定します。デフォルトでは、この属性は10
に設定されています。
2.1.3.9 コマンド・タイムアウトおよびCancelメソッド
Cancel
メソッドは、現在実行中のOraOLEDBコマンドを取り消します。このメソッドは、ネットワーク通信量やサーバーの使用負荷が高い時間帯に、アプリケーションで実行時間の長いコマンドを取り消す必要がある場合に有用です。
あるいは、開発者はCommandTimeout
プロパティを使用して、OraOLEDBでコマンドの取消しが試行されるまでの、コマンドの実行時間の制限を設定できます。OraOLEDBでCommandTimeout
を有効にするには、EnableCmdTimeout
レジストリ値を1
に設定する必要があります。
OLE DBを使用する場合、デフォルトのDPBROP_COMMANDTIMEOUT
は0
秒です。ADOを使用する場合、デフォルトのCommandTimeout
プロパティは30
秒です。
2.1.4 行セット
ここでは、OraOLEDBで行セットを使用する方法を説明します。
2.1.4.1 行セットの作成
OraOLEDBは、行セットを作成するIOpenRowset::OpenRowset
およびICommand::Execute
をサポートします。
IOpenRowset::OpenRowsetによる行セットの作成
IOpenRowset::OpenRowset
を使用する場合は、次のガイドラインに従ってください。
-
pTableID
パラメータには、実表またはビューを指定するDBID
構造体が含まれている必要があります。 -
DBID
構造体のeKind
メンバーには、DBKIND_GUID_NAME
、DBKIND_NAME
またはDBKIND_PGUID_NAME
を設定する必要があります。 -
DBID
構造体のuName
メンバーには、実表またはビューの名前をUnicode文字列で指定する必要があります。これはNULL
にはできません。 -
OpenRowset
のpIndexID
パラメータにはNULL
を設定する必要があります。
ICommand::Executeによる行セットの作成
OraOLEDBは、行セットを返すSQLのSELECT
文をサポートします。また、OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションから行セットを返す機能をサポートします。
デフォルトでは、ADOはコマンド・オブジェクトから更新不可の行セットを作成します。更新可能の行セットは、コマンド・オブジェクトでUpdatability
およびIRowsetChange
の2つのプロパティを設定することで、作成できます。Updatability
プロパティには、次の値を設定できます。
表2-2 Updatabilityプロパティに設定可能な値
値 | 説明 |
---|---|
|
更新 |
|
削除 |
|
更新および削除 |
|
挿入 |
|
挿入および更新 |
|
挿入および削除 |
|
挿入、削除および更新 |
次のADOコードのサンプルでは、コマンド・オブジェクトのUpdatability
プロパティに、行セット・オブジェクトに対する挿入、削除および更新の各操作ができるよう値を設定します。
Dim Cmd As New ADODB.Command Dim Rst As New ADODB.Recordset Dim Con As New ADODB.Connection ... Cmd.ActiveConnection = Con Cmd.CommandText = "SELECT * FROM emp" Cmd.CommandType = adCmdText cmd.Properties("IRowsetChange") = TRUE Cmd.Properties("Updatability") = 7 ' creates an updatable rowset Set Rst = cmd.Execute
2.1.4.2 更新可能性
OraOLEDBは、即時と遅延の両方の更新モードをサポートします。ただし、その操作によってLONG
型、BLOB
型またはCLOB
型などの非スカラー列が変更されるような挿入および更新は、遅延モードでは実行できません。非スカラー列の値が遅延更新モードで変更された場合は、それが即時更新モードで操作されたかのように、その行全体がデータベースに転送されます。また、これらの操作はUndo
メソッド(ADO)あるいはIRowsetUpdate::Undo()
を使用しても取り消すことができません。ただし、トランザクション内の操作の場合は、RollbackTrans
メソッド(ADO)またはITransactionLocal::Abort()
によってロールバックできます。
結合を含む問合せを使用して作成された行セットは、Client Cursor Engineが使用可能になっているOraOLEDBでのみ更新できます。C/C++ OLE DBコンシューマは、これらの行セットを更新可能にするにはこのサービスを使用可能にする必要があります。ADOコンシューマは、これらの行セットを更新可能にするにはadUseClient
としてCursorLocation
を指定する必要があります。
次に例を示します。
Dim objCon As New ADODB.Connection Dim objRst As New ADODB.Recordset objCon.Provider = "OraOLEDB.Oracle" objCon.Open "MyOraDb", "scott", "tiger" objRst.CursorLocation = adUseClient 'ADO Client Cursor objRst.Open "select ename, dname " & _ "from emp, dept " & _ "where emp.deptno = dept.deptno", _ objCon, adOpenStatic, adLockOptimistic, adCmdText 'Recordset created is updatable. Please note that CursorLocation 'needs to be explicitly set to adUseClient for this join recordset 'to be updatable.
2.1.4.3 Server Data on Insertプロパティ
OraOLEDBを使用してDBPROP_SERVERDATAONINSERT
(Server Data on Insert)にTRUE
が設定されていると、挿入および更新が行セットを通じて操作された場合、コンシューマは新たに挿入および更新された行からデフォルト値、順序値、およびトリガーされた列の値を取得できます。
DBPROP_SERVERDATAONINSERT
がTRUE
に設定されていると、OraOLEDBは新しく挿入または更新された行の行データをデータベースからフェッチするため、行セットを使用した挿入および更新の両方の操作でパフォーマンスが低下する可能性があります。ただし、DBPROP_SERVERDATAONINSERT
がデフォルト値のFALSE
に設定されている場合は、それらの行の列値がリクエストされたときに、挿入および更新操作で明示的に提供された値のみが返されます。
行セットを作成する元になっている実表には、デフォルト値、順序値およびトリガーによる値は含まれません。DBPROP_SERVERDATAONINSERT
はデフォルト値のFALSE
のままにしておくことを強くお薦めします。
DBPROP_SERVERDATAONINSERT
プロパティは、コマンド・オブジェクトを使用した挿入および更新操作のパフォーマンスには影響しません。
2.1.4.4 IRowsetFind::FindNextによる行の検索
OraOLEDBはCHAR
型、DATE
型、FLOAT
型、NUMBER
型、RAW
型およびVARCHAR2
型の列に対する検索のみをサポートします。それ以外の場合は、DB_E_NOTSUPPORTED
が返されます。
NULL
値による検索を実行する場合は、DBCOMPAREOPS_EQ
比較とDBCOMPAREOPS_NE
比較の各操作のみがサポートされます。それ以外の場合は、DB_E_NOTSUPPORTED
が返されます。
2.1.4.5 行セットのためのOraOLEDB固有の接続文字列属性
行セットのパフォーマンスに影響を与えるOraOLEDB固有の接続文字列属性は、次のとおりです。
-
CacheType
- プロバイダが行セット・データの格納に使用する、キャッシュのタイプを指定します。OraOLEDBには、次の2つのキャッシュ・メカニズムがあります。-
Memory - プロバイダはすべての行セット・データをインメモリーに格納します。このキャッシュ・メカニズムによりパフォーマンスは向上しますが、メモリーの使用量はかなり多くなります。デフォルトはMemoryです。
-
File - プロバイダはすべての行セット・データをディスク上に格納します。このキャッシュ・メカニズムによりメモリーの消費量は制限されますが、パフォーマンスは低下します。
-
-
ChunkSize
- この属性は、プロバイダのキャッシュでフェッチおよび格納される、LONG
型およびLONG RAW
型の列データのサイズをバイト数で指定します。この属性に大きな値を指定するとパフォーマンスが改善されますが、行セットにデータを格納するためにより多くのメモリーを必要とします。有効値は1
から65535
です。デフォルト値は100
です。 -
FetchSize
: プロバイダが一度にフェッチする行数(フェッチ配列)を指定します。データ・サイズおよびネットワークの応答時間に基づいて設定する必要があります。この値の設定が高すぎる場合、問合せの実行時に待機時間が長くなることがあります。値の設定が低すぎる場合は、データベースへのラウンド・トリップが増える場合があります。有効値は、1
から429
、496
および
296
です。
デフォルトは100
です。 -
DeferUpdChk
-DeferUpdChk
属性は、更新可能性チェックを遅らせるかどうかを指定します。これにより、ADOの読取り専用の非接続行セットの更新がサポートされます。有効値は0
(FALSE
)と1
(TRUE
)です。デフォルトはFALSE
で、OraOLEDBがチェックを遅らせないことを意味します。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
レジストリ内に、デフォルトの属性値が設定されています。次のADOコードは、デフォルトの属性値を上書きするサンプルです。
Dim con As ADODB.Connection Set con = NEW ADODB.Connection con.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=scott;" & _ "Password=tiger;Data Source=MyOraDB;" & _ "FetchSize=200;CacheType=File;" con.Open
関連項目:
デフォルト属性値の詳細は、「デフォルト属性値」を参照してください。
2.1.4.6 ADOプログラマのためのヒント
ADO RowsetプロパティLockType
のadLockPessimistic
への設定は、Oracle Provider for OLE DBではサポートされません。LockType
がadLockPessimistic
に設定されいる場合、OraOLEDBは、adLockOptimistic
に設定されているときと同様の動作をします。この動作は、OraOLEDBが変更される行に対して明示的なロックを実行しないために発生します。ただし、新しいデータがデータベースに送信されると、別のユーザーによって行セット・データがすでに更新されていない場合にかぎり、データベースは更新を実行しますが、これは内容を保証しない書込みが許可されないことを意味します。LockType
値のadLockReadOnly
、adLockBatchOptimistic
およびadLockOptimistic
がOraOLEDBでサポートされています。
ADO RowsetプロパティCursorType
にadOpenKeyset
またはadOpenDynamic
を設定しても、Oracle Provider for OLE DBではサポートされません。Oracleは文レベルの読取り一貫性をサポートすることで、問合せから返されるデータには、その問合せが実行された時点でコミット済のデータのみが含まれることが保証されるため、OraOLEDBは2つのどちらもサポートしません。CursorType
の値としては、adOpenStatic
およびadOpenForwardOnly
がOraOLEDBによってサポートされています。
2.1.4.7 スキーマ行セット
Oracle Provider for OLE DBで使用可能なスキーマ行セットは、次のとおりです。
-
DBSCHEMA_COLUMNS
-
DBSCHEMA_INDEXES
-
DBSCHEMA_SCHEMATA
-
DBSCHEMA_VIEWS
-
DBSCHEMA_TABLES
-
DBSCHEMA_PROVIDER_TYPES
(前方スクロールのみ) -
DBSCHEMA_FOREIGN_KEYS
-
DBSCHEMA_PRIMARY_KEYS
-
DBSCHEMA_PROCEDURES
-
DBSCHEMA_PROCEDURE_PARAMETERS
2.1.4.8 日付書式
Oracleセッションの日付書式は、ALTER SESSION SET NLS_DATE_FORMAT
コマンドを使用しても設定できません。Visual Basicでは、日付書式はWindowsのコントロール パネルの「地域」設定で制御されます。Visual Basicの日付書式の詳細は、Visual Basicのドキュメントを参照してください。
Oracle Provider for OLE DBでは、Connection
プロパティのUseSessionFormat
がデフォルト値のFALSE
に設定されている場合、セッションのNLS_DATE_FORMAT
が、プロバイダによって'YYYY-MM-DD HH24:MI:SS'
に固定されています。日付を文字列としてOracle Databaseに渡す場合、'YYYY-MM-DD HH24:MI:SS'
の形式にする必要があります。UseSessionFormat
がTRUE
に設定されている場合、NLS_DATE_FORMAT
はOracle Provider for OLE DBによって固定されず、デフォルト・セッションのNLS_DATE_FORMAT
が使用されます。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE > '1981-06-15 17:32:12'
別の書式を使用するには、SQLファンクションTO_DATE()
を使用して、文字列として渡される日付の書式を指定する必要があります。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE > TO_DATE('15-JUN-81', 'DD-MON-YY')
ただし、パラメータとして渡される日付については、ADOが日付書式を制御するため、Windowsのコントロール パネルの「地域」設定によって制御されます。この場合は、TO_DATE()
を使用しないでください。次に例を示します。
Private Sub Command1_Click() Dim objCon As New ADODB.Connection Dim objCmd As New ADODB.Command Dim objRst As New ADODB.Recordset Dim pDate As New ADODB.Parameter objCon.Provider = "OraOLEDB.Oracle" objCon.Open "MyOraDb", "scott", "tiger" Set pDate = objCmd.CreateParameter("pDate", adDate, adParamInput) objCmd.Parameters.Append pDate objCmd.CommandText = _ "SELECT * FROM EMP WHERE HIREDATE > ?" objCmd.ActiveConnection = objCon objCmd.CommandType = adCmdText pDate.Value = "06/15/1981" Set objRst = objCmd.Execute ... End Sub
2.1.4.9 オブジェクト名の大/小文字
Oracle Databaseのオブジェクト(表、列、ビューなど)の名前にはすべて、大文字と小文字の区別があります。このため、EMP
とemp
という2つのオブジェクトを、データベースの同じ名前空間に置くことができます。
問合せSELECT ename FROM emp
は、表名がデータベース内でEMP
(すべて大文字)であっても正しく実行されます。一方、大文字と小文字が混在したオブジェクト名を指定する場合は、二重引用符で名前を囲むことによって指定できます。次に例を示します。
SELECT ename FROM "Emp"
この例は、データベース内の表名がEmp
の場合に正常に実行されます。二重引用符で囲むことにより、Oracle Databaseでオブジェクト名の大/小文字が区別されます。
2.1.4.10 SQL Server Integration Servicesによる高速読込みの実行
OraOLEDBは行セットを開くとき、IRowsetFastLoad
インタフェースを実装します。SQL Server Integration Services (SSIS)とともに使用すると、Oracle Provider for OLE DBを使用してOLE DB宛先への高速読込みをアプリケーションで実行できます。これによって、読込み時間は従来型の読込みに比べて大幅に短縮されます。高速読込みを実行するには、OLE DB宛先のAccessMode
プロパティを"
OpenRowset
Using
FastLoad
"
に設定します。
2.1.5 データ型
OraOLEDBでサポートされるデータ型とUnicodeおよび非Unicodeのマッピングを表A-1に示します。
関連項目:
前述のデータ型とその他のデータ型、およびタイムゾーンの詳細は、『Oracle Database SQL言語リファレンス』を参照
2.1.5.1 バイナリ・データ型
BINARY_FLOAT
は、OLE DBのDBTYPE_R4
にマップされる単精度浮動小数点データ型(4バイト)です。
BINARY_DOUBLE
は、OLE DBのDBTYPE_R8
にマップされる倍精度浮動小数点データ型(8バイト)です。
2.1.5.2 TIMESTAMPデータ型
ここでは、タイムスタンプ・データ型について説明し、次の例を示します。
-
各
タイムスタンプ
・データ型を使用した挿入操作および取得操作を示すサンプル・データ。 -
タイムスタンプ
・データ型を使用したVisual Basicのコード例。
タイムスタンプ・データ型は、OLE DBのDBTYPE_DBTIMESTAMP
にマップされます。OLE DBのDBTYPE_DBTIMESTAMP
データ型には、TIME
ZONE
情報はありません。
タイムスタンプ・データ型には次のものがあります。
-
TIMESTAMP
-
TIME
WITH
TIME
ZONE
-
TIMESTAMP
WITH
LOCAL
TIME
ZONE
データの挿入
TIMESTAMP
WITH
TIME
ZONE
またはTIMESTAMP
WITH
LOCAL
TIME
ZONE
列へのデータの挿入には、クライアントのタイムゾーン設定が使用されます。
OLE DBのタイムスタンプ・データ型ではタイムゾーン情報が提供されません。挿入操作の場合、クライアント・セッションからのデフォルト・タイムゾーンがTIMESTAMP
WITH
TIME
ZONE
列のデータに追加されます。
データの取出し
データ取得では、TIMESTAMP
WITH
TIME
ZONE
列にはTIME
ZONE
が使用されませんが、TIMESTAMP
WITH
LOCAL
TIME
ZONE
列にはTIME
ZONE
が使用されます。
OLE DBのタイムスタンプ
・データ型にはタイムゾーン情報を格納できません。
秒の端数
TIMESTAMP
データ型とCommand
オブジェクトのバインドでは、秒の端数がサポートされていません。
タイムゾーン情報を変更するためにALTER
SESSION
を使用すると新規または既存のRecordset
のタイムゾーン情報は変更されません(Recordsetはオペレーティング・システムの地域オプションのクライアント・タイムゾーン設定を使用します)。TIMESTAMP
のfractional_seconds_precision
の最大値は9
で、デフォルトの精度は6
です。
ADOコンシューマ
タイムスタンプ・データ型の場合、ADOコンシューマは、CursorLocation
の値をadUseServer
として指定し、DML操作にRecordset
を使用する必要があります。
タイムスタンプの挿入および取出し例
次の例では、デフォルトの精度6
を使用するものと想定しています。
TIMESTAMP列
データ挿入: 4/16/2003 11:19:19 AM(タイムゾーンなし)
DB内のデータ: 4/16/2003 11.19.19.000000 AM
データ取出し: 4/16/2003 11:19:19 AM
TIMESTAMP WITH TIME ZONE列
データ挿入: 4/16/2003 11:19:19 AM(クライアント・セッションのタイムゾーンを使用)
DB内のデータ: 4/16/2003 11.19.19.000000 AM -07:00
データ取出し: 4/16/2003 11:19:19 AM(タイムゾーンをドロップ)
TIMESTAMP WITH LOCAL TIME ZONE列
次の例では、クライアント・セッションのタイムゾーンが-04:00
で、現在US EDT(米国東部夏時間)にあるものと仮定しています。挿入操作では、TIMESTAMP
WITH
LOCAL
TIME
ZONE
列のデータにはタイムゾーンのずれは含まれませんが、そのTIMESTAMP
データは、US PDT (太平洋夏時間)と同じであるデータベースのタイムゾーン-07:00
に標準化されます。
問合せに対して、データはクライアント・セッションのタイムゾーンで返されます。タイムゾーンによる時差とは、ローカル時間と協定世界時(UTC)との差異(時分単位)を指します。
データ挿入: 4/16/2003 4:30:23 PM(クライアント・タイムゾーンは-04:00)
DB内のデータ: 4/16/2003 01.30.23.000000 PM(データベースのタイムゾーンは-07:00)
データ取出し: 4/16/2003 4:30:23 PM(クライアント・タイムゾーンは-04:00)
データ取出し: 4/16/2003 3:30:23 PM(クライアント・タイムゾーンは-05:00)
データ取出し: 4/16/2003 2:30:23 PM(クライアント・タイムゾーンは-06:00)
データ取出し: 4/16/2003 1:30:23 PM(クライアント・タイムゾーンは-07:00)
Visual Basicの例
... Dim DT As Date DT = Now() con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=user_name;" & _ "Password=pwd;Data Source=Oracle;" con.Open 'Must use adUseServer rec.CursorLocation = adUseServer rec.ActiveConnection = con rec.Open "select timestamp_column from test_table", con, adOpenDynamic,_ adLockOptimistic rec.AddNew Array("timestamp_column"), Array(DT) update data rec.Update Array("timestamp_column"), Array("07/07/07 07:17:17 AM") ...
2.1.5.3 INTERVALデータ型
期間データ型は、OLE DBのDBTYPE_STR
にマップされます。期間データ型には次のものがあります。
-
INTERVAL
YEAR
TO
MONTH
-
INTERVAL
DAY
TO
SECOND
INTERVAL
YEAR
TO
MONTH
列では、year_precision
の最大は9
で、デフォルトは2
です。INTERVAL
DAY
TO
SECOND
列では、day_precision
の最大は9
、デフォルトは2
で、fractional_seconds_precision
の最大は9
、デフォルトは6
です。
注意:
符号が指定されていない場合、デフォルトは+です。
INTERVALYEARTOMONTH
使用方法: (符号)years-months
例:
-
2-3
2年3か月
-
+2-3
2年3か月
-
-2-3
-2年3か月
INTERVALDAYTOSECOND
使用方法: (符号)days hours:minutes:seconds.second_fraction
例:
-
7
10:20:30.123456
7日と10時間20分30.123456秒
-
+7
10:20:30.123456
7日と10時間20分30.123456秒
-
-7
10:20:30.123456
-7日と10時間20分30.123456秒
Visual Basicの例
... con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=user_name;"& _ "Password=pwd;Data Source=Oracle;" con.Open 'no restriction on using adUseServer or adUseClient rec.CursorLocation = adUseServer rec.ActiveConnection = con rec.Open "select * from test_table2", con, adOpenDynamic, adLockOptimistic rec.AddNew Array("year_to_month_column", "day_to_second_column"), _ Array("8-1", "3 20:30:10.12") 'update data rec.Update Array("year_to_month_column", "day_to_second_column"), _ Array("2-3", "7 10:20:30.123456") ...
2.1.6 LOBサポート
ISequentialStream
インタフェースは、すべてのLONG
、LONG RAW
およびLOB (BLOB
、CLOB
、NCLOB
およびBFILE
)列でサポートされます。コンシューマはこのインタフェースを使用して、読取り専用のBFILE
を除くすべてのLOB列に対して読取りおよび書込みを行えます。これらの列に対して読取りおよび書込みアクセスを行うには、行セットを作成するために使用するSELECT
SQL文に結合を含めないでください。
注意:
Oracle DatabaseのLOB列のほとんどが、2GBを超えるデータ記憶域のLOBをサポートしますが、ADOの列サイズの最大値は2GBです。
BFILE
データ型を持つ列は、Rowset
インタフェースでは更新できません。ただし、更新が、BFILE
列で示される外部ファイルのディレクトリと名前の変更に限定される場合は、コマンド・インタフェースを使用してこれらの列を更新できます。次に例を示します。
INSERT INTO topomaps (areanum, topomap) VALUES (158, BFILENAME('mapdir', 'topo158.tps'))
LOBの詳細は、Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイドを参照してください。
2.1.7 Unicodeサポート
OraOLEDBはUnicodeキャラクタ・セットをサポートします。コンシューマはこの機能を使用して、同じクライアント・コンピュータにある複数言語のデータにアクセスするためにOraOLEDBを使用できます。これは、Unicode標準で必要とされる数の言語をサポートするグローバル・インターネット・アプリケーションの作成に特に役立ちます。たとえば、Oracle Databaseにアクセスする単一のActive Server Page (ASP)アプリケーションを作成して、日本語、アラビア語、英語、タイ語などのコンテンツを動的に生成できます。
2.1.7.1 Unicodeエンコーディングのタイプ
Oracle Databaseは、UnicodeのASCII互換のマルチバイト・エンコーディングであるUTF-8コード体系でUnicodeデータを格納します。Microsoft Windowsは、2バイトの固定幅コード体系であるUTF-16エンコーディングを使用します。OraOLEDBは、2つのコード体系間でデータを透過的に変換し、コンシューマがUTF-16のみに対処できるようにします。
注意:
Unicodeサポートは、ADOコンシューマに対して透過的です。CまたはC++を使用しているOLE DBコンシューマは、Unicodeデータが含まれている場合には、データ型バインドでDBTYPE_WSTR
を明示的に指定する必要があります。
2.1.7.2 Oracle Unicodeサポートの機能
OraOLEDBは、Unicodeモードと非Unicodeモードの2つのモードで動作します。クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットでない場合、またはデータベースのキャラクタ・セットがマルチバイト・キャラクタ・セットである場合、OraOLEDBは自動的にUnicodeモードを有効にします。このモードでは、OraOLEDBはUTF-16コード体系でキャッシュ内にデータを格納します。ユーザーは、データの損失を防ぐために、データベースのキャラクタ・セットがAL32UTF8であることを確認する必要があります。
クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットである場合、プロバイダは非Unicodeモードで動作します。このモードでは、UTF-16エンコーディングで必要となる大規模な文字バッファを扱う必要がないため、パフォーマンスが多少向上します。
クライアントとサーバーのキャラクタ・セットの検出は、ログオン時に実行されます。
注意:
OraOLEDBでは、Unicodeモードを有効にするためにクライアントのキャラクタ・セットをUTF-8に設定する必要はなくなりました。プロバイダは、現在もこのような設定をサポートしていますが、必須ではなくなりました。
詳細は、行セットおよびパラメータのデータ型マッピングを参照してください。
2.1.7.3 Unicodeサポートの設定
データの損失を防ぐために、データベースのキャラクタ・セットをAL32UTF8にする必要があります。これ以外に、Unicodeサポートで必須の設定はありません。
2.1.7.3.1 データベースの設定
Oracle DatabaseがAL32UTF8キャラクタ・セットでデータを格納するように構成されていることを確認する必要があります。キャラクタ・セット構成は、通常はデータベースの作成時に指定します。データベースのキャラクタ・セット設定を確認するには、SQL*Plusで次の問合せを実行します。
SQL> SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
データベースのキャラクタ・セットがAL32UTF8でない場合は、AL32UTF8キャラクタ・セットで新規のデータベースを作成し、そこにデータをインポートする必要があります。
2.1.8 エラー
OLEオブジェクトおよびCOMオブジェクトは、オブジェクト・メンバー・ファンクションのHRESULT
リターン・コードによってエラーを報告します。OLE/COMのHRESULT
リターン・コードはビット圧縮された構造体です。OLEには構造体メンバーの参照を解除するマクロがあります。OraOLEDBは、エラーに関する情報を取り出すために、IErrorLookup
を公開します。
すべてのオブジェクトは拡張エラー情報をサポートします。このため、コンシューマは、OLE DB拡張エラー・オブジェクトをインスタンス化し、続いてGetErrorDescription()
メソッドをコールして、エラー・テキストを取得する必要があります。
// Instantiate OraOLEDBErrorLookup and obtain a pointer to its // IErrorLookup interface CoCreateInstance(CLSID_OraOLEDBErrorLookup, NULL, CLSCTX_INPROC_SERVER, IID_IErrorLookup, (void **)&pIErrorLookup) //Call the method GetErrorDescription() to get the full error text pIErrorLookup->GetErrorDescription()
OraOLEDBプロバイダは、エラー全体を1つのテキスト・ブロックにスタックして返します。
ADOユーザーは、次のサンプルを参考にしてください。
Dim oerr As ADODB.Error For Each oerr in con.Errors MsgBox "Error: " & oerr.Description & vbCrLf _ & "Source: " & oerr.Source Next
2.1.9 OLEDB.NETデータ・プロバイダの互換性
2.1.9.1 接続文字列でのOLEDB.NET属性の使用
OLE DB .NETデータ・プロバイダでOraOLEDBを使用する際に、OLEDB.NET
接続属性は、次の例に示すようにTrue
に設定する必要があります。
// in VB.NET Dim con As New OleDbConnection() con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" & _ "Password=tiger;Data Source=Oracle;OLEDB.NET=True;" con.Open // in C# ... OleDbConnection con = new OleDbConnection(); con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" + "Password=tiger;Data Source=Oracle;OLEDB.NET=true;" con.Open(); ...
2.1.9.2 OraOLEDBカスタム・プロパティの使用
ADOでは、OraOLEDBプロバイダ固有のプロパティをオブジェクト・レベルで設定できます。OraOLEDB固有のプロパティSPPrmsLOB
およびNDatatype
は、接続文字列属性としても、コマンド・オブジェクト・レベルでも設定できます。StmtCacheSize
プロパティは接続文字列属性として設定でき、AddToStmtCache
プロパティはコマンド・オブジェクト・レベルで設定できます。次の例では、コマンド・レベルでのプロパティの設定を示します。
// in VB Dim cmd as new ADODB.Command ... cmd.Properties("SPPrmsLOB") = True cmd.Properties("NDatatype") = True cmd.Properties("AddToStmtCache") = True ...
一方、OLEDB.NETデータ・プロバイダは、OLE DBプロバイダ固有のプロパティをオブジェクト・レベルで公開できません。したがって、OraOLEDBがOLE DB .NETデータ・プロバイダで使用される場合、SPPrmsLOB
プロパティおよびNDatatype
プロパティは接続文字列属性としてのみ設定でき、AddToStmtCache
プロパティはサポートされません。
// in VB.NET Dim con As New OleDbConnection() con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" & _ "Password=tiger;Data Source=Oracle;OLEDB.NET=True;" & _ "SPPrmsLOB=False;NDatatype=False;" con.Open()
SPPrmsLOB
およびNDatatype
接続文字列属性が指定されていない場合は、デフォルトでFalse
に設定されます。
これらの接続文字列属性をTrue
に設定すると、パラメータ付きのコマンドを実行する際に、処理オーバーヘッドが増加します。
関連項目:
いずれかの属性をTrue
に設定する前に「コマンドのためのOraOLEDBカスタム・プロパティ」を参照してください
2.1.9.3 DataTable変更でのOracleの更新
OleDbDataAdapter.Update()
メソッドがDataTable
で行われた変更でOracle Databaseを適切に更新するには、DataTableにデータベース表の主キーが含まれている必要があります。データベース表に主キーが含まれていない場合は、DataTable
に移入する際にROWID
を明示的に選択して、データベース内の行の更新時にROWID
を使用して行を一意に識別できるようにする必要があります。
主キーを含むデータベース表でROWID
を選択しないでください。ROWID
が主キーとともに選択されている場合、ROWID
は主キーとしてマークされる唯一の列になります。
関連項目:
OLE DB .NETデータ・プロバイダの使用方法の詳細は、次の資料を参照してください。
-
Microsoft .NETドキュメント
-
Microsoft .NET Frameworkクラス・ライブラリ
2.2 Visual BasicでのOraOLEDBの使用
次の簡単なサンプルで、Visual Basic 6.0でADOとOracle Provider for OLE DBを使用してOracle Databaseに接続し、PL/SQLのストアド・プロシージャとストアド・ファンクションを実行する方法を説明します。
2.2.1 Oracle Databaseの設定
この例では、Oracle Databaseに、デモ用の表EMP
とユーザー・アカウントscott
が存在することを前提にしています。scott
アカウントは、Oracleの初期データベースに含まれています。使用しているデータベースにこのアカウントがない場合は、サンプル・プログラムを実行する前にこのアカウントを作成してください。使用しているデータベースにemp
表がない場合は、demobld.sql
スクリプトを使用してこのデモ用の表を作成できます。
また、このサンプルでは、Oracle Databaseに接続するときに、データベースのネットワーク別名としてexampledb
を使用します。使用しているシステムに合わせて、このネットワーク別名を変更する必要があります。
手順1: サンプル表の作成
-
SQL*Plusを起動します。
-
ユーザー名
scott
とパスワードtiger
を使用して接続します。 -
demobld.sql
スクリプトを実行します。SQL> @ORACLE_BASE\ORACLE_HOME\sqlplus\demo\demobld.sql;
scott
アカウントでemp
表を作成した後で、Visual Basicのサンプルで実行されるストアド・プロシージャとストアド・ファンクションを含むPL/SQLパッケージを作成する必要があります。
手順2: PL/SQLパッケージの作成