このOracle ODBC Driver情報には、次の項があります。
ODBCとは
Open Database Connectivity (ODBC)は、1つのアプリケーションが多くの異なるデータソースにアクセスできるようにする標準インタフェースを提供します。アプリケーションのソース・コードは、データソースごとに再コンパイルする必要がありません。データベース・ドライバは、アプリケーションを特定のデータソースにリンクします。データベース・ドライバは、アプリケーションが特定のデータソースにアクセスするためにオンデマンドで呼び出すことのできるダイナミック・リンク・ライブラリです。したがって、アプリケーションはデータベース・ドライバが存在する任意のデータソースにアクセスできます。
ODBCインタフェースには次のものが定義されています。
ODBC関数コールのライブラリ。アプリケーションではこのライブラリを利用してデータソースに接続し、SQL文を実行して結果を取り出すことができます。
SQL-99仕様に基づくSQL構文
エラー・コードの標準セット
データソースへの接続とログインの標準的な方法
データ型の標準的な表現
図1-1に、ODBCモデルのコンポーネントを示します。ODBCアプリケーションは、ODBC APIを介してドライバ・マネージャをコールします。ドライバ・マネージャは、Microsoftドライバ・マネージャまたはunixODBCドライバ・マネージャです。ドライバ・マネージャは、ここでもODBC APIを使用してODBCドライバをコールします。ODBCドライバは、データベースAPIを使用し、ネットワーク通信リンク経由でデータベースにアクセスします。図1-1は、異なる3つのデータベースにアクセスするODBCアプリケーションを示したものです。
関連トピック
Oracle ODBC Driverを使用すると、Microsoft WindowsおよびLinux、Solaris、AIXなどのUNIXプラットフォーム上のアプリケーションで、Oracle Net Servicesソフトウェアを使用し、ODBCインタフェースを介して、Oracleデータベースに対する読取りおよび書込みアクセスができます。
Oracle ODBC Driverは、Oracle Call Interface(OCI)のクライアント/サーバー・ソフトウェアを介して、データソースへの要求の送信およびデータソースからの応答を受信します。OCIクライアントとOracleサーバー間の通信には、Oracle Net Services通信プロトコルが使用されます。
Oracle ODBC Driverは、ODBC SQL構文をデータソースにアクセスできる構文に変換します。データソースから結果が戻されると、Oracle ODBC Driverは戻された結果をODBC SQL構文に変換します。
図1-2は、前述のOracle ODBC Driverアーキテクチャを示したものです。
* Oracle ODBCリソースDLLファイル(sqres
xx
.dll
。xx
は言語の略称)には、言語に関連する全情報が含まれています。使用されるデフォルトのリソース・ファイルはsqresus.dll
です。
OCIクライアント/サーバー・ソフトウェアの詳細は、OCIのマニュアルを参照してください。
関連トピック
リリース12.1.0.1.0の新機能
Microsoft Windows Server 2008、Windows Server 2008 R2、Windows 7、Windows 8、Windows Server 2012、Linux X86-64 (32/64ビット)、Sun Solaris SPARC64 (32/64ビット)、IBM AIX 5L 5.2 (32/64ビット)、Sun Solaris X64 (32/64ビット)、HPUX IA64 (32/64ビット)、ZLinux (32/64ビット)オペレーティング・システム用のOracle ODBC Driverリリース12.1.0.1.0ソフトウェアの機能は次のとおりです。
Oracle ODBC Driverは、VARCHAR2
、NVARCHAR2
およびRAW
データで32 KBデータ列をサポートするようになりました。32 KB列の作成の詳細は、Oracle Database PL/SQL言語リファレンスおよびOracle Database SQL言語リファレンスを参照してください。
odbc.ini
ファイルまたは接続レベル属性の新しいパラメータ:
SQL_TRANSLATE_ERRORS= T/F [デフォルトはF (false)]
Babelfish機能を使用している移行済のサード・パーティODBCアプリケーションでは、サーバーから返されるエラーがネイティブ・データベース形式を取ると予想されます。ユーザーは、Babelfishモードで稼働しているOracle DatabaseのSQL翻訳プロファイルにエラーの翻訳を登録できます。エラーの翻訳が登録されたら、ODBCアプリケーションのユーザーはオプションSQLTranslateErrors = T
を有効化し、登録されているとおりのネイティブ・エラーを受け取ることができます。
SQL翻訳フレームワークの詳細は、『Oracle Database移行ガイド』、特に「SQL翻訳フレームワークのアーキテクチャと概要」、「翻訳フレームのインストールと構成」および「移行例」を参照してください。
詳細は、表1-5を参照してください。
Oracle ODBCドライバが、RefCursor
を使用せずに暗黙的結果を返すことのできるストアド・プロシージャの実行をサポートするようになりました。このサポートにより、Oracleに移行したサード・パーティのODBCアプリケーションで、旧ベンダーが提供していたこの同じ機能を使用しやすくなります。
Oracle Databaseによる暗黙的結果のサポートの詳細は、Oracle Database移行ガイドを参照してください。
Oracleデータベースの自動増分機能をサポートするためのSQLColAttribute()フィールド識別子の拡張サポート。Oracle ODBC Driver固有のヘッダー・ファイルsqora.h
をアプリケーションに含めることで、この機能を使用できます。自動増分の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
SQL_COLUMN_AUTO_INCREMENT
Oracle Database 12cリリース1 (12.1)以降では、Oracleが自動増分列をサポートするため、Oracle ODBC Driverは既存のSQLColAttribute()識別子SQL_COLUMN_AUTO_INCREMENT
を通じて同じサポートを拡張しました。このプロパティは読取り専用であり、列が自動増分の場合にSQL_TRUE
を返し、それ以外の場合にSQL_FALSE
を返します。
SQL_ORCLATTR_COLUMN_PROP
Oracle Database 12cリリース1 (12.1)以降では、Oracle ODBC Driverは、列の属性を返す新しいドライバ固有フィールド識別子SQL_ORCLATTR_COLUMN_PROP
をサポートします。この識別子は、次に示すようにすべての列プロパティを持つSQLULEN
値を返します。
+-----------------------------------------+
| 32 |...| 10 | 9 | 8 |......| 3 | 2 | 1 |
+-----------------------------------------+
| | |
| | |-> Column is auto-increment?
| |-> Auto value is always generated?
|-> If generated by default when null?
Oracle Database 12cリリース1 (12.1)でサポートされるODBC API
SQLMoreResults()
暗黙的結果のODBCサポートを実装します。詳細は、「ODBC API関数の実装」の表1-7およびhttp://msdn.microsoft.com/en-us/library/ms714673(v=VS.85).aspx
を参照してください。
リリース11.2.0.1.0の新機能
Microsoft Windows XP、Microsoft Windows 2003 Server、Microsoft Windows Vista、Linux X86-32 (RHEL AS 4、5)、Linux X86-64 (RHEL AS 4、5)(32/64ビット)、Sun Solaris SPARC64 (9、10)(32/64ビット)、IBM AIX 5L 5.2 (32/64ビット)、Linux IA64 (64ビット)、Linux on Power (32/64ビット)、Sun Solaris X64 (64ビット)、Hewlett Packard Itanium (32/64ビット)オペレーティング・システム用のOracle ODBC Driverリリース11.2.0.1.0ソフトウェアの機能は次のとおりです。
LONG/LONG RAWデータのプリフェッチ
Oracle ODBC Driverは、ODBCアプリケーションのパフォーマンスを向上させるために、LONG
またはLONG RAW
データをプリフェッチするように拡張されています。これを行うには、WindowsではLONG
データの最大サイズ(MaxLargeData
)をレジストリに設定し(DSNにレジストリ・キーMaxLargeData
を追加する必要もあります)、UNIXプラットフォームではodbc.ini
ファイルにこれを手動で設定する必要があります。この機能強化により、ユーザーが設定したMaxLargeData
サイズに応じてOracle ODBC Driverのパフォーマンスが最大10倍向上します。MaxLargeData
のデフォルト値は0です。設定できるMaxLargeData
の最大値は64KB (65536バイト)です。
MaxLargeData
の値が65536より大きい値に設定されていても、フェッチされるデータは65536バイトのみです。データベースに65536バイトより大きいLONG
またはLONG RAW
データがある場合は、単一行のフェッチが行われ、完全なLONG
データがフェッチされるように、MaxLargeData
を0 (デフォルト値)に設定する必要があります。ポーリング以外のモードでMaxLargeData
サイズより少ないバッファ・サイズを渡すと、データベースのLONG
データ・サイズがバッファ・サイズより大きい場合には、データの切捨てエラーが発生します。
メタデータをフェッチするためのOCIDescribeAny()
の使用オプション
アプリケーションが、REF CURSORS
を返す小さなパッケージ・プロシージャを大量にコールする場合、ドライバにOCIDescribeAny()
の使用を強制することでパフォーマンスを向上させることができます。このオプションを有効にするには、UNIXプラットフォームで、またWindowsではレジストリを使用して、odbc.ini
のUseOCIDescribeAny
の値をT
(True)に設定します。デフォルト値はF
(False)です。
リリース11.1.0.1.0の新機能
Windows XP、Linux、SolarisおよびAIXオペレーティング・システム用のOracle ODBC Driverリリース11.1.0.1.0ソフトウェアの機能は次のとおりです。
RULEヒントを無効化(DRH接続文字列)
新しい接続オプション「RULEヒントを無効化」が追加されました。これにより、ユーザーは、カタログAPIでRULEヒントを使用するかどうかを選択するオプションを指定できます。カタログAPIのODBCドライバのパフォーマンスを向上させるための変更が行われました。オプションのデフォルト値は、RULEヒントがカタログAPIで使用されないことを意味するTRUE
です。
NUMBERをFLOATとしてバインド(BNF接続文字列)
新しい接続オプション「NUMBERをFLOATとしてバインド」が追加されました。列に浮動小数点データが含まれる場合にFLOAT
としてのNUMBER
列の列バインディングを導入することにより、バインド変数をFLOAT
として使用する問合せ実行が高速になります。
文キャッシング
各セッションの文のキャッシュを提供および管理するOCI文キャッシュ機能のサポートが追加されました。OCI文のキャッシュ・オプションのサポートを実装することで、ユーザーが同じ接続で同じ文を複数回解析する必要がある場合にOracle ODBC Driverのパフォーマンスが向上します。文キャッシュ・フラグのデフォルト値はFALSE
です。
リリース10.1.0.2.0の新機能
Windows 98、Windows 2000、Windows XPおよびWindows NT X86オペレーティング・システム用のOracle ODBC Driverリリース10.1.0.2.0ソフトウェアの機能は次のとおりです。
TIMESTAMP
をDATE
としてバインド(BTD接続文字列)
新規の「TIMESTAMP
をDATE
としてバインド」接続オプションが追加されました。これによりODBCドライバのSQL_TIMESTAMP
データ型を、OracleのTIMESTAMP
データ型ではなくDATE
データ型でバインドできます(これはデフォルトです)。
MONTHNAME (exp)
関数
日付式で表される月の名前を返すMONTHNAME (exp)
関数のサポートが追加されました。たとえば、「April」などです。
DAYNAME (exp)
関数
日付式で表される日の名前を返すDAYNAME (exp)
関数のサポートが追加されました。たとえば、「Tuesday」などです。
インスタント・クライアントの構成
インスタント・クライアント・モードの構成がサポートされるようになりました。
リリース10.1.0.2.0の変更点
Oracle ODBC Driverリリース10.1.0.2.0で変更された機能、また将来廃止される可能性のある機能は次のとおりです。
Microsoft Transaction Serverの無効化
Microsoft Transaction Server (MTS)を無効にするデフォルト設定が、FALSE
からTRUE
に変更されました。MTSのサポートは、デフォルトで無効になっています。
浮動小数点のデータ型
Oracleのデータ型であるBINARY_FLOAT
およびBINARY_DOUBLE
は、ODBCデータ型のSQL_REAL
およびSQL_DOUBLE
にそれぞれマップされるように変更されました。
SQLGetDataの拡張(GDE接続文字列)
このリリースでは、SQLGetData
の拡張接続は廃止されました。このオプションの機能は常に使用できます。
LONG列の強制取り出し(FRL接続文字列)
このリリースでは、「LONG列強制取り出し」接続オプションは廃止されました。このオプションの機能は常に使用できます。
「翻訳オプション」構成タブ
このリリースでは、「Oracle ODBCドライバ構成」ダイアログ・ボックスにあった「翻訳オプション」タブが削除されました。
リリース・ノート
リリース・ノートのファイル名が、ODBCRelnotes.wri
からODBCRelnotesUS.htm
に変更されました。
Oracle ODBC Driverは、ODBC 3.0の次にあげる機能はサポートしていません。
期間データ型
SQL_C_UBIGINT
およびSQL_C_SBIGINT
Cデータ型識別子
共有接続
共有環境
SQLSetConnectAttr
のSQL_LOGIN_TIMEOUT
属性
表1-2 Oracle ODBC Driverキットでインストールされるファイル
説明 | Windowsインストールのファイル名 | UNIXインストールのファイル名 |
---|---|---|
Oracle ODBCデータベース・アクセスDLL |
|
libsqora.so.12.1 |
Oracle ODBC Driver設定DLL |
|
なし |
Oracle ODBCリソースDLL |
|
なし |
日本語用のOracle ODBCリソースDLL |
|
なし |
Oracle ODBC Driverメッセージ・ファイル |
|
|
日本語用のOracle ODBC Driverメッセージ・ファイル |
|
|
Oracle ODBC Driverリリース・ノート |
|
|
日本語用のOracle ODBC Driverリリース・ノート |
|
|
Oracle ODBC Driver Instant Clientリリース・ノート |
|
|
Oracle ODBC Driverヘルプ・ファイル |
|
|
日本語用のOracle ODBC Driverヘルプ・ファイル |
|
|
Oracle ODBC Driver Instant Clientインストール・スクリプト |
|
|
Oracle ODBC Driver Instant Clientアンインストール・スクリプト |
|
なし |
Microsoftドライバ・マネージャおよびAdministratorファイル
Microsoft ODBC 3.52コンポーネントとともにインストールされるファイルのリストは、Microsoft ODBC 3.52 Software Development Kit and Programmer's Referenceを参照してください。
Microsoft ODBCコンポーネントは、Microsoft Data Access Component (MDAC)キットに含まれています。WindowsのOracle ODBC Driverは、MDACバージョン2.8を使用してテストされています。これは、http://www.microsoft.com/download/en/search.aspx?q=ODBC+MDAC
からダウンロードできます。
unixODBCドライバ・マネージャおよびAdministratorファイル
unixODBCドライバ・マネージャとともにインストールされるファイルのリストは、unixODBCのREADMEファイルおよびINSTALLファイルを参照してください。
unixODBCドライバ・マネージャは、http://www.unixodbc.org/download.html
からダウンロードできます。
ODBCは、次の2つの分野でドライバの準拠レベルを定義しています。
ODBC Application Program Interface (API)
ODBC SQL-99の構文
Oracle ODBC Driverは、APIのすべてのコア機能と、レベル1およびレベル2機能セットの一部をサポートしています。詳細は、「API準拠」を参照してください。
Oracle ODBC DriverはSQL-92のエントリ・レベル仕様のスーパーセットであるSQL-99のコア仕様と広く互換性があります。SQL-99でサポートされる機能のリストを取得するには、アプリケーションにおいて適切な情報型を指定してSQLGetInfoをコールしてください。
次の事項は、Oracle ODBC Driverではサポートされていません。
ODBC ASYNCインタフェース
アプリケーションでの[Ctrl]+[C]を使用した取消し
データソースを構成する前に、ネットワーク・データベース・サービスを構成して各TNSサービス名のエントリを構成する必要があります。これを行うには、Oracle Net Configuration Assistant (NETCA)を使用します。
NETCAを使用してtnsnames.oraファイルに各TNSサービス名のエントリを作成できます。Oracle Net Servicesのインストール時に、NETCAもインストールされます。
注意: 次の構成手順はWindowsユーザー用です。UNIXユーザーは、odbc_update_ini.sh ファイルを使用してデータソース名(DSN)を作成する必要があります。 |
Oracle ODBC DriverをインストールしてOracle Net Servicesを構成した後、Oracle ODBC Driverを使用する前に、データソースを構成する必要があります。
アプリケーションとデータソース間で通信を行うには、構成情報が設定されている必要があります。Oracle ODBC Driverは、この構成情報からアクセス対象の情報を取得します。
データソースは、アクセス対象のデータと、それに対応付けられたオペレーティング・システム、データベース管理システムおよびデータベース管理システムにアクセスするためのネットワーク・プラットフォームで構成されます。Oracle ODBC Driverが発行する要求のデータソースはOracleデータベースであり、このデータソースはOracle Net Servicesによるトランスポートをサポートしています。
Oracleデータソースを構成または追加するには
Oracle ODBC Driverをインストールしたら、ODBCデータソース管理者を使用して、各OracleデータベースにOracleデータソースを構成または追加します。Oracle ODBC Driverは、データソースを追加する際にユーザーが入力する情報を使用してデータにアクセスします。次の手順を実行します。
「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース (ODBC)」を選択します。インストールされているドライバのリストが表示されます。
新規データ ソースの作成ウィンドウで「追加」をクリックし、インストール済ドライバのリストで「Oracle ODBC Driver」を選択します。
「終了」をクリックします。「Oracle ODBCドライバ構成」ダイアログ・ボックスが表示されます。データソース名とTNSサービス名は必ず入力する必要があります。このダイアログ・ボックスでその他の必要な情報を入力することも、フィールドを空白のままにして、アプリケーションを実行するときに情報を指定することもできます。
データを入力したら、「OK」をクリックするか[Enter]を押します。
データソースはいつでも変更または削除できます。次の項では、データソースの追加、変更または削除方法を説明します。
Oracleデータソースを変更するには
「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース(ODBC)」を選択します。
「ODBC データ ソース アドミニストレータ」ダイアログ・ボックスで、データソースのリストからデータソースを選択し、「構成」をクリックします。「Oracle ODBCドライバ構成」ダイアログ・ボックスが表示されます。
「Oracle ODBCドライバ構成」ダイアログ・ボックスで、必要に応じてオプション値を変更し、「OK」をクリックします。
Oracleデータソースを削除するには
「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース(ODBC)」を選択します。
「ODBC データ ソース アドミニストレータ」ダイアログ・ボックスで、データソースのリストから削除するデータソースを選択します。
「削除」、「はい」の順にクリックして、削除を確定します。
関連トピック
注意: 「Oracle ODBCドライバ構成」ダイアログ・ボックスを使用できるのは、Microsoft Windowsユーザーのみです。 |
次のリストは、前図に示した「Oracle ODBCドライバ構成」ダイアログ・ボックスにあるメイン設定オプションおよびフィールドの説明です。ダイアログ・ボックスの下半分にあるタブは次以降のトピックで説明します。
データソース名 - ODBCでデータソースを識別する名前。たとえば、「odbc-pc」です。データソース名は入力する必要があります。
説明 - データソースに含まれているデータについての説明やコメント。たとえば、「全従業員の入社日、給与履歴、現行評価」などとします。「説明」フィールドはオプションです。
TNSサービス名 - ODBCドライバがデータを取得するOracleデータベースの位置。これは、Oracle Net Servicesを構成したときに、Oracle Net Configuration Assistant (NETCA)を使用して入力したものと同じ名前です。詳細は、NETCAのマニュアルおよび「Oracle ODBCドライバの最初の使用」を参照してください。TNSサービス名は、使用可能なTNS名のプルダウン・リストから選択できます。たとえば、「ODBC-PC」を選択します。TNSサービス名を入力する必要があります。
ユーザーID - データにアクセスするために使用するサーバー上のアカウントのユーザー名です。たとえば、「scott」です。「ユーザーID」フィールドはオプションです。
「データソース名」と「TNSサービス名」は必ず入力する必要があります。このダイアログ・ボックスでその他の情報を入力することも、フィールドを空白のままにして、アプリケーションを実行するときに情報を指定することもできます。
前述のメイン設定オプションの他に、「接続テスト」ボタンがあります。このボタンは、データソース名定義で指定されたデータベースに接続することによってODBC環境が適切に構成されているかを確認します。「接続テスト」ボタンを押し、ユーザー名およびパスワードを入力してください。
「Oracle ODBCドライバ構成」ダイアログ・ボックスの下半分にあるオプション・タブの説明は、次のリンクのいずれかをクリックします。
アプリケーション・オプション
図1-4 「Oracle ODBCドライバ構成」ダイアログ・ボックスの「アプリケーション」オプション・タブ
次のリストは、前図で示した「アプリケーション」タブにあるフィールドの説明です。
結果セットを有効化 - Oracle結果セットの処理を有効にします。結果セットがアプリケーションに必要ない場合、結果セットのサポートを無効にできます。パッケージからの結果セットを含んでいないプロシージャ・コールは、少々パフォーマンスが低下します。デフォルトでは、結果セットは有効です。
問合せタイムアウトを有効化 - SQL問合せで、タイムアウトを有効にします。デフォルトでは、Oracle ODBC DriverはSQLSetStmtAttr関数用にSQL_ATTR_QUERY_TIMEOUT
属性をサポートします。このボックスが選択されていない場合、Oracle ODBC Driverは、「不可」メッセージを返します。デフォルトでは、問合せタイムアウトは有効です。
読取専用接続 - 読取り専用アクセスを指定するには、このボックスを選択します。デフォルトは、書込み可能な接続です。
カーソル・クローズを有効化 - カーソル・クローズを有効にします。デフォルトでは、カーソル・クローズは無効(フィールドが空)になっています。これは、不必要なパフォーマンス低下の原因となるためこの動作が望ましくない場合に、カーソルのクローズをコールしてもOCIカーソルのクローズが強制されないことを意味します。カーソルのクローズをコールしたときにOCIカーソルを強制的にクローズすることが望ましい場合は、カーソル・クローズを有効にする必要があります。
注意: カーソルがクローズされるたびに、パフォーマンスに影響があります。 |
スレッド・セーフティを有効化 - データソースについてスレッド・セーフティを無効にすることもできます。スレッド・セーフティが不要な場合は、このオプションを指定しなければスレッド・セーフティのオーバーヘッドをなくすことができます。デフォルトではスレッド・セーフティは有効です。
バッチ自動コミット・モード - デフォルトでは、すべての文が成功した場合、コミットが実行されます。
数値の設定 - 文字列としてバインドされた数値データの受け渡しで、どの数値設定を使用して小数点文字や3桁セパレータを決定するかを指定します。このオプションでは、Oracle NLSの設定(デフォルトの設定)、Microsoftのデフォルトの地域設定(Oracle OLE DBドライバの動作と合わせ相互運用性を向上)、US数値設定(英語環境以外でMS AccessまたはDAO (Database Access Object)を使用する際に必要)の選択ができます。
メイン構成設定オプションの説明は、「「Oracle ODBCドライバ構成」ダイアログ・ボックス」のトピックにあります。
Oracleオプション
図1-5 「Oracle ODBCドライバ構成」ダイアログ・ボックスの「Oracle」オプション・タブ
次のリストは、前図で示した「Oracle」タブにあるフィールドの説明です。
フェッチ・バッファ・サイズ - 単一の問合せでアプリケーション・プログラムがリクエストする行数に関係なく、ODBCドライバがOracleデータベースから一度にプリフェッチするデータの行数を決定するために使用されるメモリー量。ただし、プリフェッチされる行数は、単一の問合せで指定された列の幅と数に依存します。通常一度に20行未満をフェッチするアプリケーションでは、低速なネットワーク接続上で動作する場合や非常に負荷の高いサーバーにアクセスする場合には特に、レスポンス時間が向上します。これを大きく設定しすぎると、実際にはレスポンス時間が悪化したり、メモリーを大量に消費したりすることがあります。
注意: LONG およびLOBデータ型がある場合、ODBCドライバのプリフェッチ行数は、フェッチ・バッファ・サイズに依存しません。LONG およびLOBデータ型では、パフォーマンスの改善が見込めず、過度のメモリー消費を引き起こす可能性があります。ODBCドライバは、LONG およびLOBデータ型が含まれる場合、フェッチ・バッファ・サイズを無視し、プリフェッチ行数を使用します。 |
LOBを有効化 - Oracle LOBの書込みを可能にします。アプリケーションにOracle LOBの書込みが不要であれば、LOBのサポートは無効にできます。LOBを有効にすると、INSERT文とUPDATE文の処理時にわずかながらパフォーマンスが低下します。LOBの書込みはデフォルトで有効ですが、LOBデータ型をサポートしないOracleデータベースでは無効になります。
ステートメントのキャッシングを有効化 - 文キャッシュ機能を有効にします。これにより、ユーザーが問合せおよび関連パラメータの同じテキストを複数回解析する必要がある場合に、問合せの解析パフォーマンスが向上します。デフォルトでは無効になります。
キャッシュバッファサイズ - 文のキャッシュには、サービス・コンテキスト(OCI_ATTR_STMTCACHESIZE
)の属性を使用して変更可能な最大サイズ(文の数)があります。デフォルトのキャッシュ・バッファ・サイズは20で、文キャッシングのオプションが有効化されている場合にのみ使用されます。キャッシュ・バッファ・サイズを0に設定すると、文のキャッシング機能は無効になります。
最大トークン・サイズ - トークン・サイズを4 KB (4096バイト)から開始する最も近い1 KB (1024バイト)の倍数に設定します。デフォルト・サイズは8 KB (8192バイト)です。設定できる最大値は128 KB (131068バイト)です。
ORAエラーを変換 - Babelfish機能を使用している移行済のサード・パーティODBCアプリケーションでは、サーバーから返されるエラーがネイティブ・データベース形式を取ると予想されます。このオプションを有効にすると、SQL翻訳プロファイルに登録されているエラー翻訳に基づいたネイティブ・エラーを受け取ることができます。
空の文字列を変換 - Oracle Databaseに移行されたサード・パーティのODBCアプリケーションでは、空の文字列データを処理する必要があります(Oracle Databaseでは表の列にある空の文字列データが処理されません)。このオプションを有効にすると、アプリケーションで空の文字列データの挿入または取得ができるようになります。
注意: この機能は、リリース12.1に実装されていません。 |
「Oracle」タブの「フェイルオーバー」領域には次のフィールドがあります。
フェイルオーバーを有効化 - Oracle Fail SafeとOracle Parallel Serverのフェイルオーバーの再試行を有効にします。このオプションは、Oracle Fail SafeとOracle Parallel Serverのフェイルオーバー機能に対する拡張です。このオプションで追加フェイルオーバー再試行が構成可能になります。デフォルトは有効です。
再試行 - 接続のフェイルオーバーを試みる回数。デフォルトは10回です。
遅延 - フェイルオーバーを試みる間隔の秒数。デフォルトは10秒です。
注意: Oracle Fail SafeとOracle Parallel Serverの設定や使用方法については、それぞれの製品のドキュメントを参照してください。 |
メイン構成設定オプションの説明は、「「Oracle ODBCドライバ構成」ダイアログ・ボックス」のトピックにあります。
Workaroundsオプション
図1-6 「Oracle ODBCドライバ構成」ダイアログ・ボックスの「Workarounds」オプション・タブ
次のリストは、前図で示した「Workarounds」タブにあるフィールドの説明です。
TIMESTAMPをDATEとしてバインド - このボックスを選択すると、Oracle ODBC Driverにより、SQL_TIMESTAMP
パラメータがOracleのTIMESTAMP
型(デフォルト)ではなくOracle DATE
型で強制的にバインドされます。詳細は、「データ型の実装」を参照してください。
SQL_WCHAR強制サポート - このボックスを選択すると、SQLDescribeCol、SQLColumnsおよびSQLProcedureColumnsにより、SQL_CHAR
列にはSQL_WCHAR
のデータ型、SQL_VARCHAR
列にはSQL_WVARCHAR
のデータ型、およびSQL_LONGVARCHAR
列にはSQL_WLONGVARCHAR
のデータ型がそれぞれ無条件で戻されるようになります。この機能により、これらのODBCコールの結果に依存するアプリケーション(たとえば、ADOアプリケーション)でのUnicodeのサポートが可能になります。デフォルトでは、このサポートは無効になっています。
MTS無効 - このボックスの選択を解除すると、Microsoft Transaction Server (MTS)サポートが有効になります。MTSのサポートは、デフォルトで無効になっています。
METADATA IDデフォルトにSQL_TRUEをセット - このボックスを選択すると、SQL_ATTR_METADATA_ID
接続と接続時の文属性のデフォルト値がSQL_TRUE
に変更されます。通常ではSQL_ATTR_METADATA_ID
はSQL_FALSE
がデフォルトです。接続後に明示的に属性値を変更するアプリケーションのODBCコールが、このオプションにより影響を受けることはなく、関数は問題なく終了します。デフォルトでは、このオプションは無効です。「ODBC API関数の実装」のトピックに、SQL_ATTR_METADATA_ID
属性に関する追加情報があります。
LONG列データのサイズをプリフェッチ - LONG
またはLONG RAW
データをプリフェッチしてODBCアプリケーションのパフォーマンスを向上させるには、この値を設定します。この機能強化により、ユーザーが設定したプリフェッチ・サイズに応じてOracle ODBC Driverのパフォーマンスが最大10倍向上します。デフォルト値は0 (ゼロ)です。設定できる最大値は64KB (65536バイト)です。
プリフェッチ・サイズの値が65536より大きい値に設定されていても、フェッチされるデータは65536バイトのみです。データベースに65536バイトより大きいLONG
またはLONG RAW
データがある場合は、単一行のフェッチが行われ、完全なLONG
データがフェッチされるように、プリフェッチ・サイズを0 (デフォルト値)に設定する必要があります。ポーリング以外のモードでプリフェッチ・サイズより少ないバッファ・サイズを渡すと、データベースのLONG
データ・サイズがバッファ・サイズより大きい場合には、データの切捨てエラーが発生します。
SQLDescribeParamを無効化 - SQLDescribeParam関数が有効な場合、すべてのパラメータに対してSQL_VARCHAR
データ型が戻されます。SQL_WCHAR強制サポート関数も有効な場合は、すべてのパラメータに対してSQL_WVARCHAR
データ型が戻されます。デフォルトでは、この関数は有効です。
NUMBERをFLOATとしてバインド - このボックスを選択すると、Oracle ODBC Driverで、FLOAT
データを含むNUMBER
列がBinary Float (デフォルト)ではなくFloatとしてバインドされます。
RULEヒントを無効化 - このボックスの選択を解除すると、カタログ問合せで指定されているRULEヒントが有効になります。デフォルトでは、RULEヒントのオプションは無効です。
OCIDescribeAnyを使用 - このボックスを選択すると、アプリケーションがREF CURSORS
を戻す小さなパッケージ・プロシージャを頻繁にコールする場合にドライバにOCIDescribeAny()
の使用を強制することで、パフォーマンスが向上します。
メイン構成設定オプションの説明は、「「Oracle ODBCドライバ構成」ダイアログ・ボックス」のトピックにあります。
SQL Server移行オプション
図1-7 「Oracle ODBCドライバ構成」ダイアログ・ボックスのSQL Server移行オプション・タブ
次のリストは、前図で示したSQL Server移行オプション・タブにあるフィールドの説明です。
Enable EXEC Syntax - SQL Server EXEC構文のサポートを有効にします。Oracleデータベース・サーバーによって処理される前に、EXEC文で指定されるプロシージャ(またはファンクション)コールは、対応するOracleプロシージャ(またはファンクション)コールに変換されます。デフォルトではこのオプションは無効になっています。
スキーマ - 変換されたOracleプロシージャ(またはファンクション)は、ユーザーのデフォルト・スキーマに定義されます。しかし、同じSQL Serverデータベースからのすべてのプロシージャ(またはファンクション)を、データベース名をスキーマ名としてOracleスキーマに移行する場合、このフィールドは「データベース」に設定する必要があります。同じSQL Serverユーザーに所有されていたすべてのプロシージャ(またはファンクション)を同じOracleスキーマに定義する場合、このフィールドは「オーナー」に設定します。デフォルトでは、このフィールドは空欄になっています。
メイン構成設定オプションの説明は、「「Oracle ODBCドライバ構成」ダイアログ・ボックス」のトピックにあります。
Oracleサーバーは、トランザクション間のロック競合が解消されるまで無期限に待機します。Oracle ODBC Driverのoraodbc.ini
ファイルのLockTimeOut
エントリを設定することで、Oracleサーバーがロックの解消を待機する時間を制限できます。LockTimeOut
パラメータに入力する値は、Oracleサーバーがリクエストしたロックを取得できない場合にタイムアウトになるまでの秒数です。次の例では、Oracleサーバーは60秒後にタイムアウトになります。
[Oracle ODBC Driver Common]
LockTimeOut=60
Oracle ODBC Driverでは、データソースに接続するために、使用するコンピュータにOCIクライアント・ソフトウェアがインストールされていて、対応するリスナーがOracleサーバーで実行されていることが必要です。Oracle Net Services for Windowsは、ダイナミック・リンク・ライブラリ(DLL)に基づくアプリケーションです。Oracle Net Servicesの詳細は、Oracle Net Servicesのマニュアルを参照してください。
接続処理の一部として、アプリケーションがユーザーに情報を要求することがあります。アプリケーションからOracleデータソースについての情報を要求された場合は、次の手順を実行します。
「TNSサービス名」ボックスで、TNSサービス名の名前を入力します。
「ユーザー名」ボックスに、Oracleデータベースにアクセスするために使用する名前を入力します。
「パスワード」ボックスに、Oracleデータベースにアクセスするために使用するパスワードを入力します。
「OK」をクリックします。
アプリケーションは、データソース内のデータにアクセスするためにはデータソースに接続する必要があります。データソースに接続するタイミングは、アプリケーションによって異なります。たとえば、アプリケーションがユーザーの要求時にのみデータソースに接続する場合もあれば、起動時に自動的に接続する場合もあります。アプリケーションがいつデータソースに接続するかは、そのアプリケーションのマニュアルを参照してください。
追加情報にアクセスするには、次のリンクのいずれかをクリックします。
全ユーザー向け関連項目
プログラマ向け関連項目
注意: この情報は、Microsoft Windowsユーザー用です。
Oracle ODBC Driverを使用して初めてデータベースまたは表にアタッチしようとするときに、次の問題が発生することがあります。
Oracle ODBC Driverを正常に動作させるために、システム・パスにOracleHome
/bin
を設定する必要がある
コマンド・プロンプトでPATH
コマンドを使用して確認します。
マシンまたはサーバー・システムに必要なソフトウェアがない
マシンに設定されているクライアント/サーバー接続が正しくない
\orant\bin
または\Oracle\ora90\bin
ディレクトリにあるtnsping.exe
を使用すると、特定のデータベース・サービスへの接続を確認できます。次に例を示します。C:/ORANT/BIN>tnsping database-service-name
TNSサービス名がOracle Net Configuration Assistant (NETCA)で入力された名前と一致しない
注意: データソース構成画面上のプルダウン・メニューですべての有効なTNSサービス名リストを表示して選択することができます。 |
ユーザーにデータベースへのアクセス権がない
システム・エラー: ODBC DSNの作成時に182または193が発生
mfc42.dll
との互換性の不一致。OracleHome
/bin
がPATH
に含まれていること、およびOracleHome
/bin
以外のパスに重複するoci.dll
が存在しないことを確認します。それでもエラーが発生する場合は、正常に動作しているマシンからmfc42.dll
をコピーします。トランスレータ ライブラリを読み込めない(システム エラー コード31)
mfc42.dll
が存在する場合があります。Oracle ODBCはmfc42.dll
の新しいバージョン(バージョン6.0.8665.0)に対して作成されます。mfc42.dll
がエラーを引き起こしています。MDAC 2.5 SP1をインストールしてもこの問題は解消されません。より新しいバージョンのmfc42.dll
(バージョン6.0.8665.0以上)を入手し、%
WINNT
%/System32
ディレクトリ内の古いmfc42.dll
を次の方法で置換します。
注意: このDLLは、Microsoft社のDLLです。 |
Oracle Net Servicesを使用してOracle ODBC DriverのTNSサービス名を作成するには、Oracle Net Servicesと同時にインストールされるOracle Net Configuration Assistant (NETCA)を使用します。NETCAによって、Oracle ODBC DriverのTNSサービス名のエントリがtnsnames.oraファイルに作成されます。
Oracle ODBC DriverはSQL-92のエントリ・レベル仕様のスーパーセットであるSQL-99のコア仕様と広く互換性があります。Oracleの文法に加えて、ODBC仕様の付録Cで概要を説明しているベンダー固有のエスケープ・シーケンスもサポートしています。ODBCの設計に従って、Oracle ODBC Driverは固有のSQL構文をOracleデータベースに渡します。
上級ユーザー向け関連項目
プログラマ向け関連項目
Oracleデータベースのデータ型はOracle ODBC DriverによってODBCのSQLデータ型にマップされます。
注意: Microsoft ODBC 3.52 Software Development Kit and Programmers ReferenceのAppendix Dにあるすべての変換は、適切な情報型を指定したSQLGetInfo のコールでリストされるODBC SQLデータ型についてサポートされています。 |
上級ユーザー向け関連項目
プログラマ向け関連項目
DATEおよびTIMESTAMP
OracleのDATE
データ型およびTIMESTAMP
データ型のセマンティクスは、同じ名前を持つODBCデータ型に正確には対応していません。OracleのDATE
データ型には日付情報および時間情報の両方が、SQL_DATE
データ型には日付情報のみが含まれます。またOracleのTIMESTAMP
データ型にも日付情報および時間情報が含まれますが、ここでは小数秒まで正確に表示されます。ODBCドライバでは、OracleのDATE
およびTIMESTAMP
列の両方のデータ型がSQL_TIMESTAMP
としてレポートされ、情報の紛失が回避されています。また、ODBCドライバにより、SQL_TIMESTAMP
パラメータがOracleのTIMESTAMP
値としてバインドされます。
浮動小数点のデータ型
リリース10.1以降のOracleサーバーに接続すると、ODBCドライバにより、Oracleの浮動小数点のデータ型であるBINARY_FLOAT
およびBINARY_DOUBLE
が、ODBCデータ型であるSQL_REAL
およびSQL_DOUBLE
にそれぞれマップされます。以前のリリースでは、SQL_REAL
およびSQL_DOUBLE
がOracleの汎用数値データ型にマップされていました。
関連トピック
Oracle ODBC DriverおよびOracleデータベースでは、データ型について制限があります。表1-3に、これらの制限を示します。
表1-3 Oracle ODBC DriverおよびOracleデータベースがデータ型に課す制限
制限されるデータ型 | 説明 |
---|---|
リテラル |
OracleデータベースではSQL文内のリテラルが4,000バイトに制限されます。 |
SQL_LONGVARCHARおよびSQL_WLONGVARCHAR |
|
SQL_LONGVARCHARおよびSQL_LONGVARBINARY |
Oracleデータベースでは1つの表ではLONGデータ列を1つしか使用できません。LONGデータ型には |
エラーが発生すると、Oracle ODBC Driverは固有のエラー番号、SQLSTATE
(ODBCエラー・コード)およびエラー・メッセージを戻します。Oracle ODBC Driverが検出したエラーとOracleサーバーが戻したエラーの両方から、Oracle ODBC Driverがこの情報を導出します。
固有のエラー
データソースで発生したエラーについては、Oracle ODBC DriverはOracleサーバーから戻された固有のエラーを戻します。Oracle ODBC Driverまたはドライバ・マネージャがエラーを検出した場合は、Oracle ODBC Driverは0 (ゼロ)という固有のエラーを戻します。
SQLSTATE
データソースで発生したエラーについては、Oracle ODBC Driverは戻された固有のエラーを適切なSQLSTATE
にマップします。Oracle ODBC Driverがエラーを検出した場合は、Oracle ODBC Driverが適切なSQLSTATE
を生成します。ドライバ・マネージャがエラーを検出した場合は、ドライバ・マネージャが適切なSQLSTATE
を生成します。
エラー・メッセージ
データソースで発生したエラーについては、Oracle ODBC DriverはOracleサーバーから戻されたメッセージに基づくエラー・メッセージを戻します。Oracle ODBC Driverまたはドライバ・マネージャで発生したエラーについては、Oracle ODBC DriverはSQLSTATE
に関連するテキストに基づくエラー・メッセージを戻します。
エラー・メッセージのフォーマットは次のとおりです。
[vendor] [ODBC-component] [data-source] error-message
大カッコ([ ])内の接頭辞によってエラーのソースが識別されます。表1-4に、Oracle ODBC Driverが戻すこれらの接頭辞の値を示します。エラーがデータソースで発生したときは、[vendor]および[ODBC-component]という接頭辞によって、ベンダーと、データソースからエラーを受け取るODBCコンポーネントの名前が識別されます。
表1-4 Oracle ODBC Driverが戻す接頭辞のエラー・メッセージ値
エラー・ソース | 接頭辞 | 値 |
---|---|---|
ドライバ・マネージャ |
[vendor][ODBC-component][data-source] |
[Microsoft/unixODBC][ODBC Driver Manager]N/A |
Oracle ODBC Driver |
[vendor][ODBC-component][data-source] |
[ORACLE][ODBC Driver]N/A |
Oracleサーバー |
[vendor][ODBC-component][data-source] |
[ORACLE][ODBC Driver]N/A |
たとえば、次に示すフォーマットのようにエラー・メッセージに[Ora]という接頭辞が含まれない場合、そのエラーはOracle ODBC Driverのエラーであり、自明であるために接頭辞が省略されています。
[Oracle][ODBC]Error message text here
次に示すフォーマットのようにエラー・メッセージに[Ora]という接頭辞が含まれる場合、Oracle ODBC Driverのエラーではありません。エラー・メッセージに接頭辞[Ora]が含まれていても、実際のエラーはいくつかのソースの1つで発生している可能性があることに注意してください。
[Oracle][ODBC][Ora]Error message text here
エラー・メッセージのテキストが次に示す接頭辞で始まる場合は、そのエラーについての詳しい情報がOracleサーバーのマニュアルに記載されています。
ORA-
Oracle Net Servicesエラーおよびトレース・ロギングは、OCIソフトウェアがインストールされたWindowsシステムのORACLE_HOME
\NETWORK
ディレクトリまたはUNIXシステムのORACLE_HOME
/NETWORK
ディレクトリの下、具体的にはそれぞれlogディレクトリとtraceディレクトリにあります。データベース・ロギングは、Oracleサーバー・ソフトウェアがインストールされたWindowsシステムのORACLE_HOME
\RDBMS
ディレクトリまたはUNIXシステムのORACLE_HOME
/rdbms
ディレクトリにあります。
サーバーのエラー・メッセージの詳細は、Oracleサーバーのマニュアルを参照してください。
表1-5にSQLDriverConnect
関数コールの接続文字列引数に組み込むことができるキーワードを示します。指定されていないキーワードは、データソースのAdministratorのエントリから読み込まれます。接続文字列に指定される値はAdministratorのエントリに格納されている値を上書きします。SQLDriverConnect
関数の詳細は、Microsoft ODBC 3.52 Software Development Kit and Programmers Referenceを参照してください。
表1-5 SQLDriverConnect関数コールの接続文字列引数に組み込むことができるキーワード
キーワード | 意味 | コメント |
---|---|---|
DSN |
ODBCデータソース名 |
ユーザー指定名。 |
DBQ |
TNSサービス名 |
ユーザー指定名。 |
UID |
ユーザーIDまたはユーザー名 |
ユーザー指定名。 |
PWD |
パスワード |
ユーザー指定パスワード。空のパスワードに対しては、PWD=;と指定。 |
DBA |
データベース属性 |
W=書込みアクセス。R=読取り専用アクセス。 |
APA |
アプリケーション属性 |
T=スレッド・セーフティ有効。F=スレッド・セーフティ無効。 |
RST |
結果セット |
T=結果セット有効。F=結果セット無効。 |
QTO |
問合せタイムアウトのオプション |
T=クエリー・タイムアウト有効。F=クエリー・タイムアウト無効。 |
CSR |
カーソル・クローズ |
T=カーソル・クローズ有効。F=カーソル・クローズ無効。 |
BNF |
|
T= |
DRH |
RULEヒントを無効化 |
T=RULEヒントを無効化。F=RULEヒントを有効化。 |
BAM |
バッチ自動コミット・モード |
IfAllSuccessful=すべての文が正常終了した場合のみ、コミット(以前の動作)。UpToFirstFailure=最初の失敗の文までコミット(V7 ODBCの動作)。AllSuccessful=すべての正常終了した文をコミット(Oracleデータベースに接続されている場合のみ。他のデータベースの場合、V7と同じ動作)。 |
FBS |
フェッチ・バッファ・サイズ |
ユーザー指定の数値(バイト単位で0以上を指定)。デフォルトは60,000バイトです。 |
FEN |
フェイルオーバー |
T=フェイルオーバー有効。F=フェイルオーバー無効。 |
FRC |
フェイルオーバー再試行数 |
ユーザー指定の数値。デフォルトは10です。 |
FDL |
フェイルオーバー遅延 |
ユーザー指定の数値。デフォルトは10です。 |
LOB |
LOB書込み |
T=LOB有効。F=LOB無効。 |
MTS |
Microsoft Transaction Serverサポート |
T=無効。F=有効。 |
FWC |
|
T=強制 |
EXC |
EXEC構文 |
T=EXEC構文有効。F=EXEC構文無効。 |
XSM |
スキーマ・フィールド |
Default=デフォルト。Database=データベース名。Owner=所有者名。 |
MDI |
メタデータIDのデフォルトの設定 |
T= |
DPM |
|
T= |
BTD |
|
T= |
NUM |
数値の設定 |
NLS=Oracle NLS数値設定を使用(小数点および3桁区切りの決定)。MS=Microsoftの地域設定を使用。US=US設定を使用。 |
ODA |
|
T=アプリケーションが F= |
STE |
SQLでORAエラーを変換 Oracle ODBC DriverがOracleエラー・コードを変換するかどうかを指定 |
T=ORAエラーを変換。 F=ORAエラーを変換しない。デフォルトでは、 |
TSZ |
トークン・サイズ |
ユーザー指定の数値。 トークン・サイズを4 KB (4096バイト)から開始する最も近い1 KB (1024バイト)の倍数に設定します。デフォルト・サイズは8 KB (8192バイト)です。設定できる最大値は128 KB (131068バイト)です。 |
次のキーワードが接続文字列に指定された場合、Oracle ODBC DriverはAdministratorで定義されているどの値も読み取りません。
DRIVER={Oracle ODBC Driver}
有効な接続文字列の例:
1) DSN=Personnel;UID=Kotzwinkle;PWD=;2) DRIVER={Oracle ODBC Driver};UID=Kotzwinkle;PWD=whatever;DBQ=instl_alias;DBA=W;
追加情報にアクセスするには、次のリンクのいずれかをクリックします。
全ユーザー向け関連項目
プログラマ向け関連項目
表1-6 SQLDriverConnect接続文字列で必要なキーワード
キーワード | 説明 |
---|---|
DSN |
データソース名。 |
DBQ |
TNSサービス名。「Oracle ODBC DriverのTNSサービス名の作成」を参照してください。詳細は、Oracle Net Servicesのマニュアルを参照してください。 |
UID |
ユーザーのログインIDまたはユーザー名。 |
PWD |
ユーザー指定のパスワード。 |
Oracleサーバーは、トランザクション間のロック競合が解消されるまで無期限に待機します。データソースに接続する前にODBC SQLSetConnectAttr
関数をコールすることによって、ロック解消をOracleサーバーが待機する時間の長さを制限できます。ODBC SQLSetStmtAttr
関数のSQL_ATTR_QUERY_TIMEOUT
属性に0 (ゼロ)以外の値を指定します。
ODBC SQLSetConnectAttr
関数を使用してロック・タイムアウト値を指定すると、その値によってoraodbc.iniファイルに指定されている値が上書きされます。oraodbc.ini
ファイルに値を指定する方法の詳細は、「ロック・タイムアウトを短縮する」を参照してください。
Windowsプラットフォームの場合、プログラムをリンクするときは、インポート・ライブラリodbc32.lib
とリンクする必要があります。
UNIXプラットフォームの場合は、ODBCアプリケーションをlibodbc.so
にリンクする必要があります。
ODBC SQLSpecialColumns
関数は表の列に関する情報を戻します。Oracle ODBC Driverでは、Oracle表に対応付けられているOracleのROWIDについての情報が戻されます。
ROWIDはSQL文のWHERE
句で使用できます。ただし、ROWID値はパラメータ・マーカー内で使用する必要があります。
Oracleの参照カーソル(結果セット)によって、アプリケーションはストアド・ファンクションやストアド・プロシージャを使用してデータを取り出せるようになります。次にODBCを介して結果セットを使用可能にする方法を示します。
ストアド・プロシージャのコールにはODBC構文を使用する必要があります。ネイティブのPL/SQLはODBCからはサポートされていません。次にパッケージ内のおよびパッケージなしのプロシージャまたはファンクションのコール方法を示します。ここでのパッケージ名をRSETとします。
Procedure call:
{CALL Example1(?)}
{CALL RSET.Example1(?)}
Function Call:
{? = CALL Example1(?)}
{? = CALL RSET.Example1(?)}
PL/SQLの参照カーソル・パラメータは、プロシージャのコール時に省略されます。たとえば、Example2プロシージャが4つのパラメータを持つと仮定します。パラメータ1と3は参照カーソルで、パラメータ2と4は文字列です。コールは次のように指定されます。
{CALL RSET.Example2("Literal 1", "Literal 2")}
次のサンプル・アプリケーションでは、Oracle ODBC Driverを使用して結果セットを返す方法を示します。
/*
* Sample Application using Oracle reference cursors via ODBC
*
* Assumptions:
*
* 1) Oracle Sample database is present with data loaded for the EMP table.
*
* 2) Two fields are referenced from the EMP table ename and mgr.
*
* 3) A data source has been setup to access the sample database.
*
*
* Program Description:
*
* Abstract:
*
* This program demonstrates how to return result sets using
* Oracle stored procedures
*
* Details:
*
* This program:
* Creates an ODBC connection to the database.
* Creates a Packaged Procedure containing two result sets.
* Executes the procedure and retrieves the data from both result sets.
* Displays the data to the user.
* Deletes the package then logs the user out of the database.
*
*
* The following is the actual PL/SQL this code generates to
* create the stored procedures.
*
DROP PACKAGE ODBCRefCur;
CREATE PACKAGE ODBCRefCur AS
TYPE ename_cur IS REF CURSOR;
TYPE mgr_cur IS REF CURSOR;
PROCEDURE EmpCurs(Ename IN OUT ename_cur, Mgr IN OUT mgr_cur, pjob IN VARCHAR2);
END;
/
CREATE PACKAGE BODY ODBCRefCur AS
PROCEDURE EmpCurs(Ename IN OUT ename_cur, Mgr IN OUT mgr_cur, pjob IN VARCHAR2)
AS
BEGIN
IF NOT Ename%ISOPEN
THEN
OPEN Ename for SELECT ename from emp;
END IF;
IF NOT Mgr%ISOPEN
THEN
OPEN Mgr for SELECT mgr from emp where job = pjob;
END IF;
END;
END;
/
*
* End PL/SQL for Reference Cursor.
*/
/*
* Include Files
*/
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
/*
* Defines
*/
#define JOB_LEN 9
#define DATA_LEN 100
#define SQL_STMT_LEN 500
/*
* Procedures
*/
void DisplayError( SWORD HandleType, SQLHANDLE hHandle, char *Module );
/*
* Main Program
*/
int main()
{
SQLHENV hEnv;
SQLHDBC hDbc;
SQLHSTMT hStmt;
SQLRETURN rc;
char *DefUserName ="scott";
char *DefPassWord ="tiger";
SQLCHAR ServerName[DATA_LEN];
SQLCHAR *pServerName=ServerName;
SQLCHAR UserName[DATA_LEN];
SQLCHAR *pUserName=UserName;
SQLCHAR PassWord[DATA_LEN];
SQLCHAR *pPassWord=PassWord;
char Data[DATA_LEN];
SQLINTEGER DataLen;
char error[DATA_LEN];
char *charptr;
SQLCHAR SqlStmt[SQL_STMT_LEN];
SQLCHAR *pSqlStmt=SqlStmt;
char *pSalesMan = "SALESMAN";
SQLINTEGER sqlnts=SQL_NTS;
/*
* Allocate the Environment Handle
*/
rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv );
if (rc != SQL_SUCCESS)
{
printf( "Cannot Allocate Environment Handle/n");
printf( "/nHit Return to Exit/n");
charptr = gets ((char *)error);
exit(1);
}
/*
* Set the ODBC Version
*/
rc = SQLSetEnvAttr( hEnv,
SQL_ATTR_ODBC_VERSION,
(void *)SQL_OV_ODBC3,
0);
if (rc != SQL_SUCCESS)
{
printf( "Cannot Set ODBC Version/n");
printf( "/nHit Return to Exit/n");
charptr = gets ((char *)error);
exit(1);
}
/*
* Allocate the Connection handle
*/
rc = SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc );
if (rc != SQL_SUCCESS)
{
printf( "Cannot Allocate Connection Handle/n");
printf( "/nHit Return to Exit/n");
charptr = gets ((char *)error);
exit(1);
}
/*
* Get User Information
*/
lstrcpy( (char *) pUserName, DefUserName );
lstrcpy( (char *) pPassWord, DefPassWord );
/*
* Data Source name
*/
printf( "/nEnter the ODBC Data Source Name/n" );
charptr = gets ((char *) ServerName);
/*
* User Name
*/
printf ( "/nEnter User Name Default [%s]/n", pUserName);
charptr = gets ((char *) UserName);
if (*charptr == '/0')
{
lstrcpy( (char *) pUserName, (char *) DefUserName );
}
/*
* Password
*/
printf ( "/nEnter Password Default [%s]/n", pPassWord);
charptr = gets ((char *)PassWord);
if (*charptr == '/0')
{
lstrcpy( (char *) pPassWord, (char *) DefPassWord );
}
/*
* Connection to the database
*/
rc = SQLConnect( hDbc,
pServerName,
(SQLSMALLINT) lstrlen((char *)pServerName),
pUserName,
(SQLSMALLINT) lstrlen((char *)pUserName),
pPassWord,
(SQLSMALLINT) lstrlen((char *)pPassWord));
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_DBC, hDbc, "SQLConnect");
}
/*
* Allocate a Statement
*/
rc = SQLAllocHandle( SQL_HANDLE_STMT, hDbc, &hStmt );
if (rc != SQL_SUCCESS)
{
printf( "Cannot Allocate Statement Handle/n");
printf( "/nHit Return to Exit/n");
charptr = gets ((char *)error);
exit(1);
}
/*
* Drop the Package
*/
lstrcpy( (char *) pSqlStmt, "DROP PACKAGE ODBCRefCur");
rc = SQLExecDirect(hStmt, pSqlStmt, lstrlen((char *)pSqlStmt));
/*
* Create the Package Header
*/
lstrcpy( (char *) pSqlStmt, "CREATE PACKAGE ODBCRefCur AS/n");
lstrcat( (char *) pSqlStmt, " TYPE ename_cur IS REF CURSOR;/n");
lstrcat( (char *) pSqlStmt, " TYPE mgr_cur IS REF CURSOR;/n/n");
lstrcat( (char *) pSqlStmt, " PROCEDURE EmpCurs (Ename IN OUT ename_cur,");
lstrcat( (char *) pSqlStmt, "Mgr IN OUT mgr_cur,pjob IN VARCHAR2);/n/n");
lstrcat( (char *) pSqlStmt, "END;/n");
rc = SQLExecDirect(hStmt, pSqlStmt, lstrlen((char *)pSqlStmt));
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLExecDirect");
}
/*
* Create the Package Body
*/
lstrcpy( (char *) pSqlStmt, "CREATE PACKAGE BODY ODBCRefCur AS/n");
lstrcat( (char *) pSqlStmt, " PROCEDURE EmpCurs (Ename IN OUT ename_cur,");
lstrcat( (char *) pSqlStmt, "Mgr IN OUT mgr_cur, pjob IN VARCHAR2)/n AS/n BEGIN/n");
lstrcat( (char *) pSqlStmt, " IF NOT Ename%ISOPEN/n THEN/n");
lstrcat( (char *) pSqlStmt, " OPEN Ename for SELECT ename from emp;/n");
lstrcat( (char *) pSqlStmt, " END IF;/n/n");
lstrcat( (char *) pSqlStmt, " IF NOT Mgr%ISOPEN/n THEN/n");
lstrcat( (char *) pSqlStmt, " OPEN Mgr for SELECT mgr from emp where job = pjob;/n");
lstrcat( (char *) pSqlStmt, " END IF;/n");
lstrcat( (char *) pSqlStmt, " END;/n");
lstrcat( (char *) pSqlStmt, "END;/n");
rc = SQLExecDirect(hStmt, pSqlStmt, lstrlen((char *)pSqlStmt));
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLExecDirect");
}
/*
* Bind the Parameter
*/
rc = SQLBindParameter(hStmt,
1,
SQL_PARAM_INPUT,
SQL_C_CHAR,
SQL_CHAR,
JOB_LEN,
0,
pSalesMan,
0,
&sqlnts);
/*
* Call the Store Procedure which executes the Result Sets
*/
lstrcpy( (char *) pSqlStmt, "{CALL ODBCRefCur.EmpCurs(?)}");
rc = SQLExecDirect(hStmt, pSqlStmt, lstrlen((char *)pSqlStmt));
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLExecDirect");
}
/*
* Bind the Data
*/
rc = SQLBindCol( hStmt,
1,
SQL_C_CHAR,
Data,
sizeof(Data),
&DataLen);
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLBindCol");
}
/*
* Get the data for Result Set 1
*/
printf( "/nEmployee Names/n/n");
while ( rc == SQL_SUCCESS )
{
rc = SQLFetch( hStmt );
if ( rc == SQL_SUCCESS )
{
printf("%s/n", Data);
}
else
{
if (rc != SQL_NO_DATA)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLFetch");
}
}
}
printf( "/nFirst Result Set - Hit Return to Continue/n");
charptr = gets ((char *)error);
/*
* Get the Next Result Set
*/
rc = SQLMoreResults( hStmt );
if (rc != SQL_SUCCESS)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLMoreResults");
}
/*
* Get the data for Result Set 2
*/
printf( "/nManagers/n/n");
while ( rc == SQL_SUCCESS )
{
rc = SQLFetch( hStmt );
if ( rc == SQL_SUCCESS )
{
printf("%s/n", Data);
}
else
{
if (rc != SQL_NO_DATA)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLFetch");
}
}
}
printf( "/nSecond Result Set - Hit Return to Continue/n");
charptr = gets ((char *)error);
/*
* Should Be No More Results Sets
*/
rc = SQLMoreResults( hStmt );
if (rc != SQL_NO_DATA)
{
DisplayError(SQL_HANDLE_STMT, hStmt, "SQLMoreResults");
}
/*
* Drop the Package
*/
lstrcpy( (char *) pSqlStmt, "DROP PACKAGE ODBCRefCur");
rc = SQLExecDirect(hStmt, pSqlStmt, lstrlen((char *)pSqlStmt));
/*
* Free handles close connections to the database
*/
SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
SQLDisconnect( hDbc );
SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
SQLFreeHandle( SQL_HANDLE_ENV, hEnv );
printf( "/nAll Done - Hit Return to Exit/n");
charptr = gets ((char *)error);
return(0);
}
/*
* Display Error Messages
*/
void DisplayError( SWORD HandleType, SQLHANDLE hHandle, char *Module )
{
SQLCHAR MessageText[255];
SQLCHAR SQLState[80];
SQLRETURN rc=SQL_SUCCESS;
LONG NativeError;
SWORD RetLen;
SQLCHAR error[25];
char *charptr;
rc = SQLGetDiagRec(HandleType,
hHandle,
1,
SQLState,
&NativeError,
MessageText,
255,
&RetLen);
printf( "Failure Calling %s/n", Module );
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
printf( "/t/t/t State: %s/n", SQLState);
printf( "/t/t/t Native Error: %d/n", NativeError );
printf( "/t/t/t Error Message: %s/n", MessageText );
}
printf( "/nHit Return to Exit/n");
charptr = gets ((char *)error);
exit(1);
}
このオプションを有効にすると、変更なしに変換可能な場合、Oracle ODBC Driverによって、SQL Server EXEC
文の構文が対応するOracleプロシージャ・コールに変換されます。
SQL Serverプロシージャの絶対名は最大4つの識別子から構成されます。
サーバー名
データベース名
所有者名
プロシージャ名
名称のフォーマットは次のとおりです。
[[[server.][database].][owner_name].]procedure_name
SQL ServerデータベースからOracleへの移行時、それぞれのSQL Serverプロシージャ(またはファンクション)定義は、対応するOracle構文に変換され、Oracleスキーマに定義されます。移行されたプロシージャは次の3つの方法のうちのいずれか1つの方法で再編(およびスキーマ内で作成)されます。
全プロシージャは、1つのスキーマに移行されます(デフォルト・オプション)。
1つのSQL Serverデータベースに定義されたすべてのプロシージャは、そのデータベース名のスキーマに移行されます。
1人のユーザーに所有されるすべてのプロシージャは、そのユーザー名のスキーマに移行されます。
これら3つのプロシージャ移行編成を行うには、変換するプロシージャに対し、いずれかのスキーマ名オプションを指定します。変換されたOracleプロシージャ・コール内のオブジェクト名は、大/小文字の区別はしません。
Oracle Real Application Clusters (Oracle RAC)データベース環境で接続障害が発生したときに、SQLSetConnectAttr
関数のSQL_ORCLATTR_FAILOVER_CALLBACK
およびSQL_ORCLATTR_FAILOVER_HANDLE
属性が設定されている場合、イベント通知が有効になります。どちらの属性も、SQLSetConnectAttr
関数を使用して設定されます。新規属性のシンボルは、ファイルsqora.hで定義されています。
SQL_ORCLATTR_FAILOVER_CALLBACK
属性は、障害イベントが発生したときにコールするルーチンのアドレスを指定するために使用されます。
SQL_ORCLATTR_FAILOVER_HANDLE
属性は、コールバック・ルーチンでパラメータの1つとして渡されるコンテキスト・ハンドルを指定するために使用されます。この属性は、ODBCアプリケーションで障害イベントが発生している接続を判別するために必要です。
コールバック・ルーチンの関数プロトタイプは次のとおりです。
void failover_callback(void *handle, SQLINTEGER fo_code)
'handle'パラメータは、SQL_ORCLATTR_FAILOVER_HANDLE
属性により設定された値です。この属性が設定されていない場合、NULLが戻されます。
fo_code
パラメータにより、発生している障害イベントが識別されます。障害イベントは、OCIプログラミング・インタフェースで定義されているイベントに直接マップされます。発生する可能性があるイベントのリストを次に示します。
ODBC_FO_BEGIN
ODBC_FO_ERROR
ODBC_FO_ABORT
ODBC_FO_REAUTH
ODBC_FO_END
この機能の使用方法を示したサンプル・プログラムは次のとおりです。
/*
NAME
ODBCCallbackTest
DESCRIPTION
Simple program to demonstrate the connection failover callback feature.
PUBLIC FUNCTION(S)
main
PRIVATE FUNCTION(S)
NOTES
Command Line: ODBCCallbackTest filename [odbc-driver]
*/
#include <windows.h>
#include <tchar.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <sql.h>
#include <sqlext.h>
#include "sqora.h"
/*
** Function Prototypes
*/
void display_errors(SQLSMALLINT HandleType, SQLHANDLE Handle);
void failover_callback(void *Handle, SQLINTEGER fo_code);
/*
** Macros
*/
#define ODBC_STS_CHECK(sts) \
if (sts != SQL_SUCCESS) \
{ \
display_errors(SQL_HANDLE_ENV, hEnv); \
display_errors(SQL_HANDLE_DBC, hDbc); \
display_errors(SQL_HANDLE_STMT, hStmt); \
return FALSE; \
}
/*
** ODBC Handles
*/
SQLHENV *hEnv = NULL; // ODBC Environment Handle
SQLHANDLE *hDbc = NULL; // ODBC Connection Handle
SQLHANDLE *hStmt = NULL; // ODBC Statement Handle
/*
** Connection Information
*/
TCHAR *dsn = _T("odbctest");
TCHAR *uid = _T("scott");
TCHAR *pwd = _T("tiger");
TCHAR *szSelect = _T("select * from emp");
/*
** MAIN Routine
*/
main(int argc, char **argv)
{
SQLRETURN rc;
/*
** Allocate handles
*/
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, (SQLHANDLE *)&hEnv);
ODBC_STS_CHECK(rc)
rc = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
ODBC_STS_CHECK(rc);
rc = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, (SQLHANDLE *)&hDbc);
ODBC_STS_CHECK(rc);
/*
** Connect to the database
*/
rc = SQLConnect(hDbc, dsn, (SQLSMALLINT)_tcslen(dsn),
uid, (SQLSMALLINT)_tcslen(uid),
pwd, (SQLSMALLINT)_tcslen(pwd));
ODBC_STS_CHECK(rc);
/*
** Set the connection failover attributes
*/
rc = SQLSetConnectAttr(hDbc, SQL_ORCLATTR_FAILOVER_CALLBACK, &failover_callback, 0);
ODBC_STS_CHECK(rc);
rc = SQLSetConnectAttr(hDbc, SQL_ORCLATTR_FAILOVER_HANDLE, hDbc, 0);
ODBC_STS_CHECK(rc);
/*
** Allocate the statement handle
*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, (SQLHANDLE *)&hStmt);
ODBC_STS_CHECK(rc);
/*
** Wait for connection failovers
*/
while (TRUE)
{
Sleep(5000);
rc = SQLExecDirect(hStmt,szSelect, _tcslen(szSelect));
ODBC_STS_CHECK(rc);
rc = SQLFreeStmt(hStmt, SQL_CLOSE);
ODBC_STS_CHECK(rc);
}
/*
** Free up the handles and close the connection
*/
rc = SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
ODBC_STS_CHECK(rc);
rc = SQLDisconnect(hDbc);
ODBC_STS_CHECK(rc);
rc = SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
ODBC_STS_CHECK(rc);
rc = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
ODBC_STS_CHECK(rc);
return TRUE;
}
/*
** Failover Callback Routine
*/
void failover_callback(void *Handle, SQLINTEGER fo_code)
{
switch (fo_code) {
case ODBC_FO_BEGIN:
printf("ODBC_FO_BEGIN recevied\n");
break;
case ODBC_FO_ERROR:
printf("ODBC_FO_ERROR recevied\n");
break;
case ODBC_FO_ABORT:
printf("ODBC_FO_ABORT recevied\n");
break;
case ODBC_FO_REAUTH:
printf("ODBC_FO_REAUTH recevied\n");
break;
case ODBC_FO_END:
printf("ODBC_FO_END recevied\n");
break;
default:
printf("Invalid or unknown ODBC failover code recevied\n");
break;
};
return;
}
/*
** Retrieve the errors associated with the handle passed
** and display them.
*/
void display_errors(SQLSMALLINT HandleType, SQLHANDLE Handle)
{
SQLTCHAR MessageText[256];
SQLTCHAR SqlState[5+1];
SQLSMALLINT i=1;
SQLINTEGER NativeError;
SQLSMALLINT TextLength;
SQLRETURN sts = SQL_SUCCESS;
if (Handle == NULL) return;
/* Make sure all SQLState text is null terminated */
SqlState[5] = '\0';
/*
** Fetch and display all diagnostic records that exist for this handle
*/
while (sts == SQL_SUCCESS)
{
NativeError = 0;
TextLength = 0;
sts = SQLGetDiagRec(HandleType, Handle, i, SqlState, &NativeError,
(SQLTCHAR *)&MessageText, sizeof(MessageText),
&TextLength);
if (sts == SQL_SUCCESS)
{
printf("[%s]%s\n", SqlState, MessageText);
if (NativeError != 0)
{
printf("Native Error Code: %d\n", NativeError);
}
i++;
}
}
return;
}
このオプションは、サード・パーティODBCアプリケーションをOracleデータベースに移行し、前のベンダーでサポートされている暗黙的結果機能を使用する場合に使用します。Oracle ODBC Driverでは、ストアド・プロシージャまたは匿名PL/SQLブロックでの暗黙的結果がサポートされます。現在のリリースでは、暗黙的結果はSELECT
文でのみ戻されます。
次のコード例は、暗黙的結果に匿名SQLスクリプトを使用したODBCテスト・ケースの例を示しています。
const char *query1="declare \
c1 sys_refcursor; \
c2 sys_refcursor; \
begin \
open c1 for select empno,ename from emp where rownum<=3; \
dbms_sql.return_result(c1); \
open c2 for select empno,ename from emp where rownum<=3; \
dbms_sql.return_result(c2); end; ";
int main( )
{
...
...
//Allocate all required handles and establish a connection to the database.
//Prepare and execute the above anonymous PL/SQL block
SQLPrepare (hstmt, (SQLCHAR *) query1, SQL_NTS);
SQLExecute(hstmt);
//Bind the columns for the results from the first SELECT statement in an anonymous block.
SQLBindCol (hstmt, 1, SQL_C_ULONG, &eno, 0, &jind);
SQLBindCol (hstmt, 2, SQL_C_CHAR, empname, sizeof (empname),&enind);
//Fetch implicit results through the SQLFetch( ) call.
while((retCode = SQLFetch(hstmt)) != SQL_NO_DATA)
{
//Do whatever you want to do with the data.
}
retCode = SQLMoreResults(hstmt);
if(retCode == SQL_SUCCESS)
{
printf("SQLMoreResults returned with SQL_SUCCESS\n");
//Bind the columns for the results from the second SELECT statement in an anonymous block.
SQLBindCol (hstmt, 1, SQL_C_ULONG, &eno, 0, &jind);
SQLBindCol (hstmt, 2, SQL_C_CHAR, empname, sizeof (empname),&enind);
//Fetch implicit results through the SQLFetch( ) call.
while((retCode = SQLFetch(hstmt)) != SQL_NO_DATA)
{
//Do whatever you want to do with data.
}
}
}
Oracle ODBC Driverのリリース9.2.0.0.0以降では、すべてのコア、レベル2およびレベル1関数をサポートしています。
さらに、Oracle ODBC Driverのリリース9.2.0.0.0以降では、変換DLLをサポートしています。
次のトピックでは、Oracle ODBC Driverで実装されているODBC API関数について説明します。
上級ユーザー向け関連項目
プログラマ向け関連項目
表1-7 Oracle ODBC Driverで特定の関数を実装する方法
関数 | 説明 |
---|---|
|
SQLConnectには、DBQ、ユーザーIDおよびパスワードのみが必要です。 |
|
SQLDriverConnectは、DSN、DBQ、UIDおよびPWDキーワードを使用します。 |
|
暗黙的結果のODBCサポートを実装します。これは、リリース12.1で新規に実装されたAPIです。詳細は、 |
|
|
|
次の項を参照してください。 |
すべてのカタログ関数 |
|
比較の述語に比較の第2式としてパラメータ・マーカーがあり、そのパラメータの値がSQLBindParameter
によってSQL_NULL_DATA
に設定されている場合、比較は失敗します。これはODBC SQLのNULL述語構文と一致しています。
プログラマにとって特に注意が必要なのは、CHAR
、VARCHAR
およびVARCHAR2
データ型の実装です。
SQLGetTypeInfo
は、SQL_VARCHAR
のfSqlType値に対し、Oracleデータベース・データ型であるVARCHAR2
を戻します。また、SQLGetTypeInfo
は、SQL_CHAR
のfSqlType値に対しては、Oracleデータベース・データ型であるCHAR
を戻します。
MicrosoftまたはunixODBC ODBCドライバ・マネージャ(ドライバ・マネージャ)によって、Unicodeをサポートしているかどうかに関係なく、すべてのODBCドライバがUnicode対応しているように動作します。これにより、下位のODBCドライバでUnicodeが使用可能かどうかに依存せずに、ODBCアプリケーションを作成することができます。
ドライバ・マネージャがANSI ODBCドライバ用にUnicodeサポートをエミュレートできるのは、Unicodeデータとローカル・コード・ページとの間の変換に限られています。ドライバ・マネージャがUnicodeからローカル・コード・ページに変換するとき、データが失われる可能性があります。完全なUnicodeサポートは、ODBCドライバがUnicodeをサポートしないかぎり不可能です。Oracle ODBC DriverはUnicodeをフル・サポートしています。
ODBC APIは、"W"と"A"という決まった接尾辞によって、UnicodeおよびANSIエントリ・ポイントの両方をサポートします。ODBCアプリケーションの開発者は、明示的に接尾辞によってエントリ・ポイントをコールする必要はありません。UNICODEおよび_UNICODEプリプロセッサ定義を指定して、ODBCアプリケーションをコンパイルすると、適切な関数コールを行います。たとえば、SQLPrepare
コールはSQLPrepareW
としてコンパイルされます。
アプリケーションが入力パラメータをUnicodeでエンコードするように指定したり、列データをUnicodeで返すように要求できるようにするために、Cデータ型であるSQL_C_WCHAR
がODBCインタフェースに追加されました。SQL_C_TCHAR
マクロはUnicodeとANSIの両方でビルドする必要のあるアプリケーションに便利です。SQL_C_TCHAR
マクロは、Unicodeアプリケーションの場合はSQL_C_WCHAR
にコンパイルされ、ANSIアプリケーションの場合はSQL_C_CHAR
にコンパイルされます。
SQLデータ型のSQL_WCHAR
、SQL_WVARCHAR
およびSQL_WLONGVARCHAR
は、表内でUnicodeと定義されている列を表すために、ODBCインタフェースに追加されています。これらの値は、SQLDescribeCol
、SQLColAttribute
、SQLColumns
およびSQLProcedureColumns
コールから返されます。
Unicodeエンコードは、SQL列型NCHAR
、NVARCHAR2
およびNCLOB
についてサポートされています。また、SQL列型CHAR
およびVARCHAR2
についても、キャラクタ・セマンティクスが列定義で指定されている場合は、Unicodeエンコードがサポートされます。
Oracle ODBC DriverはこれらのSQL列型をサポートしており、これらをODBC SQLデータ型にマップします。
表1-8 サポートされるSQLデータ型および対応するODBC SQLデータ型
SQLデータ型 | ODBC SQLデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
脚注1 キャラクタ・セマンティクスが列定義で指定されている場合およびデータベースのキャラクタ・セットがUnicodeの場合、CHAR
はSQL_WCHAR
にマップされます。
脚注2 キャラクタ・セマンティクスが列定義で指定されている場合およびデータベースのキャラクタ・セットがUnicodeの場合、VARCHAR2
はSQL_WVARCHAR
にマップされます。
ドライバ・マネージャは、ODBCドライバがUnicodeをサポートしていないことを検出すると、次を実行します。
ANSI ODBCドライバをコールする前にUnicode用関数コールをANSI用関数コールに変換します。文字列引数はUnicodeからローカル・コード・ページに変換されます。たとえば、SQLPrepareW
コールはSQLPrepare
コールに変換されます。SQL文パラメータの文字列はUnicodeからローカル・コード・ページに変換されます。
文字データのリターン・パラメータを、ローカル・コード・ページからUnicodeに変換します。たとえば、SQLColAttribute
を使用して列名を戻す場合です。
SQL_C_WCHAR
でバインドされた列に対し、データをローカル・コード・ページからUnicodeコード・ページに変換します。
SQL_C_WCHAR
でバインドされた入力パラメータに対し、データをUnicodeからローカル・コード・ページに変換します。
SQLGetData
関数を使用すると、ODBCアプリケーションは、データのフェッチ後に、受け取る列のデータ型を指定できます。OCIでは、Oracle ODBC Driverがフェッチ前にデータ型を指定する必要があります。OCIの場合、Oracle ODBC Driverは、データベース内で定義されている列のデータ型の情報を使用し、OCI経由で列データをフェッチする最適な方法を決定します。
文字データを持つ列がSQLBindCol
でバインドされていない場合、Oracle ODBC Driverは列をフェッチするためにUnicodeなのかローカル・コード・ページなのか決定する必要があります。ドライバは、デフォルトとして列をUnicodeで受け取ることが可能ですが、結果として不要な変換を2回行うことになります。たとえば、データベースでデータがANSIでエンコードされている場合、Oracle ODBC Driverにデータを送る際にANSIからUnicodeへ変換されるとします。ODBCアプリケーションがSQL_C_CHAR
としてデータを要求すると、元のエンコーディングに戻すために、さらに変換が行われることになります。
データのフェッチでは、Oracleクライアントのデフォルトのエンコーディングが使用されます。しかし、ODBCアプリケーションは、WCHAR
データ型として列またはパラメータをバインドすることにより、このデフォルトを上書きして、Unicodeとしてデータをフェッチする場合があります。
Oracle ODBC Driver自体がTCHARマクロを使用しているので、これを利用するために、ユーザーのODBCアプリケーション・プログラムではTCHARを使用することをお薦めします。
次のプログラムではTCHARの使用方法を示します。TCHARはUNICODEおよび_UNICODEを指定してコンパイルする場合は、WCHAR
データ型になります。
例1 データベースへの接続
SQLConnect
に対してUnicodeリテラルを使用する以外、他との違いはありません。
HENV envHnd;
HDBC conHnd
;
HSTMT stmtHnd;
RETCODE rc;
rc = SQL_SUCCESS;
// ENV is allocated
rc = SQLAllocEnv(&envHnd);
// Connection Handle is allocated
rc = SQLAllocConnect(envHnd, &conHnd);
rc = SQLConnect(conHnd, _T("stpc19"), SQL_NTS, _T("scott"), SQL_NTS, _T("tiger"),
SQL_NTS);
.
.
.
if (conHnd)
SQLFreeConnect(conHnd);
if (envHnd)
SQLFreeEnv(envHnd);
例2 単純なデータ取出し
次の例では、従業員名と職種をEMP
表から取り出します。TCHAR対応のデータを各ODBC関数に指定する必要がある以外、ANSIの場合との違いはありません。Unicodeアプリケーションの場合は、SQLBindCol
をコールするときにバッファの長さをBYTE
長で指定する必要があります(例: sizeof(ename)
)。
/*
** Execute SQL, bind columns, and Fetch.
** Procedure:
**
** SQLExecDirect
** SQLBindCol
** SQLFetch
**
*/
static SQLTCHAR *sqlStmt = _T("SELECT ename, job FROM emp");
SQLTCHAR ename[50];
SQLTCHAR job[50];
SQLINTEGER enamelen, joblen;
_tprintf(_T("Retrieve ENAME and JOB using SQLBindCol 1.../n[%s]/n"), sqlStmt);
// Step 1: Prepare and Execute
rc = SQLExecDirect(stmtHnd, sqlStmt, SQL_NTS); // select
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 2: Bind Columns
rc = SQLBindCol(stmtHnd,
1,
SQL_C_TCHAR,
ename,
sizeof(ename),
&enamelen);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
rc = SQLBindCol(stmtHnd,
2,
SQL_C_TCHAR,
job,
sizeof(job),
&joblen);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
do
{
// Step 3: Fetch Data
rc = SQLFetch(stmtHnd);
if (rc == SQL_NO_DATA)
break;
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
_tprintf(_T("ENAME = %s, JOB = %s/n"), ename, job);
} while (1);
_tprintf(_T("Finished Retrieval/n/n"));
例3 SQLGetDataを使用したデータ取出し(フェッチ後のバインド)
この例では、SQLGetData
の使用方法を説明します。ODBCプログラミングに精通していない場合は、OCIプログラムの場合と異なり、SQLGetData
を使用することで、データをバインドする前にフェッチすることが可能です。Unicode固有の点に関しては、ANSIアプリケーションとの違いはありません。
/*
** Execute SQL, bind columns, and Fetch.
** Procedure:
**
** SQLExecDirect
** SQLFetch
** SQLGetData
*/
static SQLTCHAR *sqlStmt = _T("SELECT ename,job FROM emp"); // same as Case 1.
SQLTCHAR ename[50];
SQLTCHAR job[50];
_tprintf(_T("Retrieve ENAME and JOB using SQLGetData.../n[%s]/n"), sqlStmt);
if (rc != SQL_SUCCESS)
{
_tprintf(_T("Failed to allocate STMT/n"));
goto exit2;
}
// Step 1: Prepare and Execute
rc = SQLExecDirect(stmtHnd, sqlStmt, SQL_NTS); // select
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
do
{
// Step 2: Fetch
rc = SQLFetch(stmtHnd);
if (rc == SQL_NO_DAT
break;
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 3: GetData
rc = SQLGetData(st
mtHnd,
1,
SQL_C_TCHAR,
(SQLPOINTER)ename,
sizeof(ename),
NULL);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
rc = SQLGetData(stmtHnd,
2,
SQL_C_TCHAR,
(SQLPOINTER)job,
sizeof(job),
NULL);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
_tprintf(_T("ENAME = %s, JOB = %s/n"), ename, job);
} while (1);
_tprintf(_T("Finished Retrieval/n/n"));
例4 単純なデータ更新
この例では、データ更新の方法を説明します。同様に、SQLBindParameter
に対するデータ長は、Unicodeアプリケーションの場合でもBYTE
長で指定します。
/
*
** Execute SQL, bind columns, and Fetch.
** Procedure:
**
** SQLPrepare
** SQLBindParameter
** SQLExecute
*/
static SQLTCHAR *sqlStmt = _T("INSERT INTO emp(empno,ename,job) VALUES(?,?,?)");
static SQLTCHAR *empno = _T("9876"); // Emp No
static SQLTCHAR *ename = _T("ORACLE"); // Name
static SQLTCHAR *job = _T("PRESIDENT"); // Job
_tprintf(_T("Insert User ORACLE using SQLBindParameter.../n[%s]/n"), sqlStmt);
// Step 1: Prepar
rc = SQLPrepare(stmtHnd, sqlStmt, SQL_NTS); // select
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 2: Bind Parameterrc = SQLBindParameter(stmtHnd,
1,
SQL_PARAM_INPUT,
SQL_C_TCHAR,
SQL_DECIMAL,
4, // 4 digit
0,
(SQLPOINTER)empno,
0,
NULL);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
rc = SQLBindParameter(stmtHnd,
2,
SQL_PARAM_INPUT,
SQL_C_TCHAR,
SQL_CHAR,
lstrlen(ename)*sizeof(TCHAR),
0,
(SQLPOINTER)ename,
lstrlen(ename)*sizeof(TCHAR),
NULL);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
rc = SQLBindParameter(stmtHnd,
3,
SQL_PARAM_INPUT,
SQL_C_TCHAR,
SQL_CHAR,
lstrlen(job)*sizeof(TCHAR),
0,
(SQLPOINTER)job,
lstrlen(job)*sizeof(TCHAR),
NULL);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 3: Execute
rc = SQLExecute(stmtHnd);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
例5 LONGデータ(CLOB)の更新と取出し
この例は、OracleのCLOB
のような大きなデータの更新と取出しをする、最も複雑な場合の例です。データ長は常にBYTE
長であるため、BYTE
長を導出するにはstrlen(TCHAR data)*sizeof(TCHAR)
が必要です。
/*
** Execute SQL, bind columns, and Fetch.
** Procedure:
**
** SQLPrepare
** SQLBindParameter
** SQLExecute
** SQLParamData
** SQLPutData
**
** SQLExecDirect
** SQLFetch
** SQLGetData
*/
static SQLTCHAR *sqlStmt1 = _T("INSERT INTO clobtbl(clob1) VALUES(?)");
static SQLTCHAR *sqlStmt2 = _T("SELECT clob1 FROM clobtbl");
SQLTCHAR clobdata[1001];
SQLTCHAR resultdata[1001];
SQLINTEGER ind = SQL_DATA_AT_EXEC;
SQLTCHAR *bufp;
int clobdatalen, chunksize, dtsize, retchklen;
_tprintf(_T("Insert CLOB1 using SQLPutData.../n[%s]/n"), sqlStmt1);
// Set CLOB Data
{
int i;
SQLTCHAR ch;
for (i=0, ch=_T('A'); i< sizeof(clobdata)/sizeof(SQLTCHAR); ++i, ++ch)
{
if (ch > _T('Z'))
ch = _T('A');
clobdata[i] = ch;
}
clobdata[sizeof(clobdata)/sizeof(SQLTCHAR)-1] = _T('/0');
}
clobdatalen = lstrlen(clobdata); // length of characters
chunksize = clobdatalen / 7; // 7 times to put
// Step 1: Prepare
rc = SQLPrepare(stmtHnd, sqlStmt1, SQL_NTS);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 2: Bind Parameter with SQL_DATA_AT_EXEC
rc = SQLBindParameter(stmtHnd,
1,
SQL_PARAM_INPUT,
SQL_C_TCHAR,
SQL_LONGVARCHAR,
clobdatalen*sizeof(TCHAR),
0,
(SQLPOINTER)clobdata,
clobdatalen*sizeof(TCHAR),
&ind);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 3: Execute
rc = SQLExecute(stmtHnd);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 4: ParamData (initiation)
rc = SQLParamData(stmtHnd, (SQLPOINTER*)&bufp); // set value
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
for (dtsize=0, bufp = clobdata;
dtsize < clobdatalen;
dtsize += chunksize, bufp += chunksize)
{
int len;
if (dtsize+chunksize<clobdatalen)
len = chunksize;
else
len = clobdatalen-dtsize;
// Step 5: PutData
rc = SQLPutData(stmtHnd, (SQLPOINTER)bufp, len*sizeof(TCHAR));
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
}
// Step 6: ParamData (temination)
rc = SQLParamData(stmtHnd, (SQLPOINTER*)&bufp);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
rc = SQLFreeStmt(stmtHnd, SQL_CLOSE);
_tprintf(_T("Finished Update/n/n"));
rc = SQLAllocStmt(conHnd, &stmtHnd);
if (rc != SQL_SUCCESS)
{
_tprintf(_T("Failed to allocate STMT/n"));
goto exit2;
}
// Clear Result Data
memset(resultdata, 0, sizeof(resultdata));
chunksize = clobdatalen / 15; // 15 times to put
// Step 1: Prepare
rc = SQLExecDirect(stmtHnd, sqlStmt2, SQL_NTS); // select
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 2: Fetch
rc = SQLFetch(stmtHnd);
checkSQLErr(envHnd, conHnd, stmtHnd, rc);
for(dtsize=0, bufp = resultdata;
dtsize < sizeof(resultdata)/sizeof(TCHAR) && rc != SQL_NO_DATA;
dtsize += chunksize-1, bufp += chunksize-1)
{
int len; // len should contain the space for NULL termination
if (dtsize+chunksize<sizeof(resultdata)/sizeof(TCHAR))
len = chunksize;
else
len = sizeof(resultdata)/sizeof(TCHAR)-dtsize;
// Step 3: GetData
rc = SQLGetData(stmtHnd,
1,
SQL_C_TCHAR,
(SQLPOINTER)bufp,
len*sizeof(TCHAR),
&retchklen);
}
if (!_tcscmp(resultdata, clobdata))
{
_tprintf(_T("Succeeded!!/n/n"));
}
else
{
_tprintf(_T("Failed!!/n/n"));
}
この項では、ODBCアプリケーションのパフォーマンスを向上させるためのいくつかの一般的なプログラミングのヒントを記述しています。
アプリケーションがデータソースからの接続および切断を頻繁に繰り返す場合、接続のプーリングを有効にします。再接続する場合に比べ、プールされた接続を使用する方がはるかに効果的です。
文を処理する回数を最小限にします。可能であれば、バインド・パラメータを使用して異なるパラメータ値に文を再使用できるようにします。SQLExecute
ごとに文を処理するのに比べ、一度文を処理して数回実行する方がはるかに効果的です。
アプリケーションで取得しない列をSELECT
文に含めないでください(特にLONG
列)。データベース・サーバー・プロトコルの性質上、アプリケーションが列をバインドする場合、またはSQLGetData
をバインドする場合のいずれの場合も、LONG
列がSELECT
文に含まれている場合は、ODBCドライバはLONG列全体の内容をフェッチする必要があります。
データソースを更新しないトランザクションを実行中の場合は、ODBC SQLSetConnectAttr
関数のSQL_ATTR_ACCESS_MODE
属性をSQL_MODE_READ_ONLY
に設定します。
ODBCのエスケープ句を使用していない場合は、ODBC SQLSetConnectAttr
関数またはODBC SQLSetStmtAttr
関数のSQL_ATTR_NOSCAN
属性をTRUEに設定します。
非常に多くの行がある表からデータを取り出すには、ODBC SQLFetch
関数のかわりにODBC SQLFetchScroll
関数を使用します。
同じSQL文が複数回使用される場合には、OCI文キャッシュを有効にします(StatementCache=T
)。
NUMBER
列をFLOAT
としてバインドすると問合せの実行が高速になります(BindAsFLOAT=T
)。
LONG
またはLONG RAW
のフェッチ中に、MaxLargeData=<value>
に設定するとパフォーマンスが最適化されます。
Ref Cursor
を戻す小さなパッケージ・プロシージャに対して大量のコールが行われるアプリケーションでUseOCIDescribeAny=T
と設定すると、パフォーマンスが向上します。
このトピックでは、次のODBCデータソース構成オプションのパフォーマンスに関連する事項を説明します。
結果セットの有効化
このオプションは、プロシージャ・コールからの結果セット(たとえば、RefCursor
)の戻しのサポートを有効にします。デフォルトでは結果セットが戻されます。
ODBCドライバは、RefCursor
パラメータが含まれるかどうかを判断するために、データベース・サーバーへ問い合せてプロシージャのパラメータ・セットおよびそれらのデータ型を判断する必要があります。プロシージャが最初に処理および実行される際、この問合せが追加のネットワーク・ラウンド・トリップを発生させます。
LOBの有効化
このオプションは、LOBの挿入および更新を有効にします。デフォルトは有効です。
ODBCドライバは、LOBのパラメータが存在するかどうかを判断するために、INSERT
文またはUPDATE
文で各パラメータのデータ型をデータベース・サーバーに問い合せる必要があります。INSERT
またはUPDATE
文が最初に処理および実行される際、この問合せが追加のネットワーク・ラウンド・トリップを発生させます。
TIMESTAMPをDATEとしてバインド
SQL_TIMESTAMP
パラメータを適切なOracleデータ型でバインドします。このオプションがTRUE
に設定されている場合、SQL_TIMESTAMP
はOracleのDATE
データ型でバインドされます。このオプションがFALSE
に設定されている場合、SQL_TIMESTAMP
はOracleのTIMESTAMP
データ型でバインドされます(デフォルト)。
カーソル・クローズの有効化
ODBC関数のSQL_CLOSE
オプション(SQLFreeStmt
)は、文に関連するカーソルをクローズし、すべての未使用の結果を破棄すると想定されています。アプリケーションは、SQLPrepare
なしで文を再実行しカーソルを再開させることができます。この結果、通常アプリケーションがしばらく休止状態になりますが、再び同じSQL文を再利用します。アプリケーションが休止状態の場合に、関連するサーバー・リソースを使用可能にする場合があります。
Oracle ODBC Driverが階層化されているOracle Call Interface(OCI)は、カーソル・クローズ機能をサポートしていません。デフォルトでは、SQL_CLOSE
オプションはOracle ODBC Driverには影響がありません。カーソルおよび関連のリソースは、データベース・サーバー上にオープンされた状態で存在します。
このオプションを有効に設定した場合、データベース・サーバー上の関連カーソルをクローズさせることができます。ただし、解析済のSQL文は破棄されてしまいます。ODBCアプリケーションは、SQLPrepare
コールなしで再び文を実行することができます。ただし、実際にはODBCドライバは文を解析してからすべて実行することになります。このオプションを有効にした場合、一度文を解析し、それを繰り返して実行するアプリケーションのパフォーマンスには重大な影響があります。
サーバーの関連リソースを解放することが確実に必要である場合のみ、このオプションを有効にしてください。
スレッド・セーフティの有効化
アプリケーションがシングル・スレッドの場合、このオプションを無効にできます。デフォルトでは、ODBCドライバは、すべての内部構造(環境、接続、文)へのアクセスがスレッド・セーフティであることを保証しています。シングル・スレッドのアプリケーションは、このオプションを無効にすることにより、スレッド・セーフティのオーバーヘッドの一部を回避できます。このオプションを無効にすることにより、多少のパフォーマンスの改善がみられます。
フェッチ・バッファ・サイズ
「Oracle ODBCドライバ構成」ダイアログ・ボックスの「Oracle」オプション・タブの「フェッチ・バッファ・サイズ」をバイト単位で設定します。この値は、単一の問合せでアプリケーション・プログラムがリクエストする行数に関係なく、ODBCドライバがOracleデータベースからクライアントのキャッシュに一度にプリフェッチしてパフォーマンスを向上させるデータの行数を決定するために必要なメモリー量です。
通常一度に20行未満をフェッチするアプリケーションでは、低速なネットワーク接続上で動作する場合や非常に負荷の高いサーバーにアクセスする場合には特に、レスポンス時間が向上します。これを大きく設定しすぎると、実際にはレスポンス時間が悪化したり、メモリーを大量に消費したりすることがあります。デフォルトは64,000バイトです。アプリケーションに最適な値を選択します。
注意: LONG およびLOBデータ型がある場合、ODBCドライバのプリフェッチ行数は、フェッチ・バッファ・サイズに依存しません。LONG およびLOBデータ型では、パフォーマンスの改善が見込めず、過度のメモリー消費を引き起こす可能性があります。ODBCドライバは、LONG およびLOBデータ型が含まれる場合、フェッチ・バッファ・サイズを無視し、プリフェッチ行数を使用します。 |
索引を含むDATE
列をWHERE
句で使用すると、データベースのパフォーマンスに影響する場合があります。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE = ?
この例ではHIREDATE
列の索引を使用して、瞬時に問合せを実行できます。ただし、HIREDATE
は実際にはDATE
値であり、ODBCドライバによりTIMESTAMP
のパラメータ値が提供されるため、Oracleサーバーの問合せオプティマイザには変換機能を適用する必要があります。誤った結果(パラメータ値にゼロ以外の小数秒が含まれる場合に起こる可能性があります)を回避するには、オプティマイザでHIREDATE
列への変換を適用し、次の文で終わるようにします。
SELECT * FROM EMP WHERE TO_TIMESTAMP(HIREDATE) = ?
残念ながら、これによりHIREDATE
列の索引の使用は無効になり、かわりにサーバーによる表のスキャンが順次実行されます。表に多くの列が含まれる場合、これには時間がかかります。この状況を回避するため、ODBCドライバには「TIMESTAMPをDATEとしてバインド」
接続オプションが用意されています。このオプションが有効になっている場合、SQL_TIMESTAMP
パラメータはODBCドライバによりOracleのTIMESTAMP
データ型ではなくDATE
データ型でバインドされます。これにより、問合せオプティマイザでDATE
列の索引が使用できるようになります。
注意: このオプションは、DATE 列をTIMESTAMP 列としてバインドするMicrosoft Accessや、その他同種のプログラムでの使用のみを目的としています。実際にTIMESTAMP 列が存在する場合、またはデータの喪失が起こりうる場合には使用しないでください。Microsoft Accessでは、主キーとして選択されたあらゆる列を使用して、このような問合せが実行されています。 |
関連トピック
API
Application Program Interface。アプリケーションから基盤となっているプログラムまたはシステムの利用(つまり通信)を可能にする、プログラム関数またはコールのセット。
クライアント(Client)
クライアントは、定められたインタフェースを使用してサーバーが提供するTNSサービスを選択し、データにアクセスするためのソフトウェア・プログラムです。サーバーは、応答としてクライアントの要求の受信および処理を行い、その結果をクライアントに戻します。ODBCクライアント・アプリケーションは、ODBCドライバのAPIを使用してODBC関数をコールし、SQL文の送信および結果の取得を行います。
準拠レベル(Conformance Levels)
アプリケーションの中には、特定のレベルの機能をサポートしているドライバ、または特定のレベルの規格に合致しているドライバ以外は使用できないものがあります。たとえば、行セット内のカーソル位置を設定し、アプリケーションがその行セット内のデータを更新できるようにする機能です。これはApplication Program Interface (API)の準拠レベル1の機能の一部です。
ODBCドライバは、Core APIレベルとレベル1、レベル2の一部に準拠し、さらにSQL-99のコア仕様と広く互換性があります。ドライバは、定められた準拠レベルより上のレベルの機能の一部をサポートしている場合があります。
各準拠レベルに含まれる機能の詳細は、『Microsoft ODBC 3.52 Software Development Kit and Programmers Reference』を参照してください。
データソース(Data Source)
データソースには、ユーザーのアクセス対象のデータに関する情報と、そのデータへのアクセス方法に関する情報が含まれています。Oracle ODBC Driverにおいては、データソースはOracleデータベースの特定のインスタンスおよびOracleデータベースとの通信に使用するOracle Net Servicesコンポーネントの別名です。
DLL
ダイナミック・リンク・ライブラリ。1つ以上のアプリケーションが共通のタスクを実行できるようにするルーチンのセット。ODBCドライバは、WindowsプラットフォームではDLLで、UNIXプラットフォームでは共有オブジェクト(.so)ファイルです。
ドライバ・マネージャ
ドライバ・マネージャは、MicrosoftおよびunixODBCにより提供され、アプリケーションがODBC SQLConnect
またはODBC SQLDriverConnect
関数をコールするときに、アプリケーションに代わってドライバをロードします。
ネットワーク・トランスポート(Network Transports)
ネットワークは通信ソフトウェアとハードウェアから構成され、マシン上のOCIクライアントはネットワークを通じて別のコンピュータ・システム上のOracleサーバーと通信します。OCIクライアントからのメッセージ・リクエストとサーバーからのレスポンス・リクエストは、様々なネットワーク・トランスポートをサポートできるOracle Net Services通信リンク上を移動します。
ODBC
Open Database Connectivityの略。ドライバ・マネージャと複数のODBCドライバのセットで構成され、SQLを標準言語として使用してアプリケーションがデータにアクセスできるようにします。
ODBCアプリケーション(ODBC Application)
ODBCアプリケーションは処理を実行し、ODBC関数をコールしてSQL文を送信し、結果を取得します。アプリケーションは、それぞれ異なるデータソースにアクセスする複数のデータ・ドライバにアクセスできます。
ODBCドライバ(ODBC Driver)
MicrosoftのOpen Database Connectivity (ODBC)は、1つのアプリケーションが多くの異なるデータソースにアクセスできるようにする標準インタフェースを提供します。アプリケーションのソース・コードは、データソースごとに再コンパイルする必要がありません。ODBCドライバは、Windowsプラットフォーム上のダイナミック・リンク・ライブラリ(DLL)またはUNIXプラットフォーム上の共有オブジェクト(SO)であり、アプリケーションはこれをオンデマンドで呼び出してデータソースにアクセスできます。ODBCドライバは、アプリケーションを特定のデータソースにリンクし、ODBC関数コールの処理、特定のデータソースへのSQLリクエストの送信およびアプリケーションへの結果の返信を行います。リクエストが関連データソースでサポートされる構文に準拠するように、ODBCドライバが必要に応じてアプリケーションのリクエストを変更します。ドライバ・マネージャとODBCドライバは、アプリケーションからはODBC関数コールを処理する1つの単位のように見えます。Oracle ODBC Driverでは、Oracleデータベースにのみ読取りおよび書込みアクセスできます。
サード・パーティのオープン・ソース・ドライバ・マネージャ(DM)で動作するUNIXプラットフォーム用のODBCドライバもあります。Oracle ODBC Driverは、UNIXプラットフォームではunixODBC.org
で提供されるDMを使用して認定されています。プラットフォームの詳細は、ODBC_Readme_Unix.html
ファイルを参照してください。
Oracle
Oracleは、高パフォーマンス、高可用性、スケーラブル、汎用、マルチユーザーのデータベース管理システムであり、様々なコンピュータ・オペレーティング・システムで稼働するオブジェクトで拡張されたリレーショナル・モデルに基づいています。Oracle Database 12gは、あらゆる規模の組織のビジネス・ニーズとITニーズを満たすように調整されたエディションから選択できます。フル・セットのユーティリティと業界標準のSQLデータ定義、さらにOracleデータベースを作成、問合せおよびメンテナンスできるデータ操作言語がサポートされます。Oracleは、VLDB、ハイエンドOLTPおよびデータ・ウェアハウス・アプリケーションをサポートし、Oracle Enterprise Manager GUIを使用した拡張管理機能とOracle Advanced Securityを使用した拡張セキュリティを含んでいます。
また、Oracleには、重要なトランザクション処理、データ・ウェアハウス、コンテンツ管理アプリケーションの最も厳しい要件を満たす様々なEnterprise Editionオプションが用意されています。これらのオプションに含まれるのは、Oracle Active Data Guard、Oracle Advanced Compression、Oracle Advanced Security、Oracle Database Vault、Oracle Data Mining、Oracle In-Memory Database Cache、Oracle Label Security、Oracle OLAP、Oracle Partitioning、Oracle Real Application Clusters、Real Application Testing、Oracle Spatial、Oracle Total Recall、Oracle Warehouse BuilderのEnterprise ETLオプション、Oracle Warehouse BuilderのData Qualityオプション、Oracle Warehouse Builderの接続、およびOracle Content Database Suiteです。
また、Oracleには、独特なトップダウンのアプリケーション管理方法でOracleデータベースを管理する、統合された管理ソリューションが備わっています。新しい自動管理機能により、時間がかかり、ミスの起きやすい管理タスクがなくなるため、データベース管理者は、パフォーマンスや可用性に関する問題ではなく、戦略的な運営目標に集中することができます。Oracleのデータベース管理パックには、Oracle Change Management Pack、Oracle Configuration Management Pack、Oracle Data Masking Pack、Oracle Diagnostic Pack、Oracle Provisioning and Patch Automation Pack、およびOracle Tuning Packが含まれます。
Oracleには、Oracle Audit Vault、Oracle Secure Backup、Oracle Programmer、Oracle TimesTen In-Memory Database、Oracle Berkeley DB、およびOracle Database Liteなどの様々な関連製品もあります。
Oracle Call Interface
Oracle Call Interface (OCI)は、標準ソフトウェア・ルーチン(プログラム・コール・インタフェース)のセットで、Oracleサーバーへのアクセスに使用します。OCIを使用することにより、高水準言語に直接Oracleコールを埋め込むことができます。
Oracle Net Services
オラクル社のネットワーク製品ファミリ。クライアント、サーバーおよびゲートウェイを透過的に統合し、業界標準または専用のネットワーク・プロトコルを使用して、統一された情報資源を配信します。
Oracle Net Configuration Assistant (NETCA)
各TNSサービス名のtnsnames.ora
ファイル内のエントリを更新することによって、Oracle Net Servicesネットワークを簡単に構成および保守するためのユーティリティ。
SQL
Structured Query Language。国際的に受け入れられているリレーショナル・システムの規格であり、問合せだけでなく、データ定義、操作、セキュリティおよび参照整合性の一部の機能も扱っています。
TCP/IP
Transmission Control Protocol/Internet Protocol。TCP/IPは、プロセス間通信メカニズムの1つで、ネットワーク間でデータを共有するアプリケーションが使用します。TCPを利用すると、1つのマシン上のプロセスから別のマシン上のプロセスへデータ・ストリームを送信できます。TCPを実装したソフトウェアは、通常、オペレーティング・システムに常駐し、IPを使用してインターネット経由で情報を送信します。
この項の内容は次のとおりです。
Oracle ODBC Driver, リリース12.1.0.1.0
Copyright © 1993, 2013 Oracle.All rights reserved.
このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。
ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。
このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。
U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.
このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。
OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。
IntelおよびIntel XeonはIntel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。
このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。
オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc
を参照してください。
Oracleサポートへのアクセス
Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info
またはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs
(聴覚障害者向け)を参照してください。