ヘッダーをスキップ


 
目次


戻る
 
 

ベータ版: 2015年07月24日

Oracle ODBC Driverヘルプ

バージョン12.2

Oracle ODBC Driverの使用方法

このOracle ODBC Driver情報には、次の項があります。

Oracle ODBC Driverについて

ODBCとは

Open Database Connectivity (ODBC)は、1つのアプリケーションが多くの異なるデータソースにアクセスできるようにする標準インタフェースを提供します。アプリケーションのソース・コードは、データソースごとに再コンパイルする必要がありません。データベース・ドライバは、アプリケーションを特定のデータソースにリンクします。データベース・ドライバは、アプリケーションが特定のデータソースにアクセスするためにオンデマンドで呼び出すことのできるダイナミック・リンク・ライブラリです。したがって、アプリケーションはデータベース・ドライバが存在する任意のデータソースにアクセスできます。

ODBCインタフェースには次のものが定義されています。

図1-1に、ODBCモデルのコンポーネントを示します。ODBCアプリケーションは、ODBC APIを介してドライバ・マネージャをコールします。ドライバ・マネージャは、Microsoftドライバ・マネージャまたはunixODBCドライバ・マネージャです。ドライバ・マネージャは、ここでもODBC APIを使用してODBCドライバをコールします。ODBCドライバは、データベースAPIを使用し、ネットワーク通信リンク経由でデータベースにアクセスします。図1-1は、異なる3つのデータベースにアクセスするODBCアプリケーションを示したものです。

図1-1 ODBCモデルのコンポーネント

図1-1の説明が続きます
「図1-1 ODBCモデルのコンポーネント」の説明

関連トピック

Oracle ODBC Driverとは

すべてのユーザー

Oracle ODBC Driver

Oracle ODBC Driverとは

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アーキテクチャを示したものです。

図1-2 Oracle ODBC Driverアーキテクチャ

図1-2の説明が続きます
「図1-2 Oracle ODBC Driverアーキテクチャ」の説明

* Oracle ODBCリソースDLLファイル(sqresxx.dllxxは言語の略称)には、言語に関連する全情報が含まれています。使用されるデフォルトのリソース・ファイルは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は、VARCHAR2NVARCHAR2およびRAWデータで32 KBデータ列をサポートするようになりました。32 KB列の作成の詳細は、Oracle Database PL/SQL言語リファレンスおよびOracle Database SQL言語リファレンスを参照してください。

  • odbc.iniファイルまたは接続レベル属性の新しいパラメータ:

    • SQL_TRANSLATE_ERRORS= T/F [デフォルトはF (false)]

      SQL翻訳フレームワーク機能を使用している移行済のサード・パーティODBCアプリケーションでは、サーバーから返されるエラーがネイティブ・データベース形式を取ると予想されます。ユーザーは、SQL翻訳フレームワーク・モードで稼働している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

リリース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.iniUseOCIDescribeAnyの値を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ソフトウェアの機能は次のとおりです。

  • TIMESTAMPDATEとしてバインド(BTD接続文字列)

    新規の「TIMESTAMPDATEとしてバインド」接続オプションが追加されました。これにより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データ型識別子

  • 共有接続

  • 共有環境

  • SQLSetConnectAttrSQL_LOGIN_TIMEOUT属性

表1-1 Oracle ODBC DriverでサポートされていないSQL関数

文字列関数 数値関数 日付/時刻関数

BIT_LENGTH

ACOS

CURRENT_DATE

CHAR_LENGTH

ASIN

CURRENT_TIME

CHARACTER_LENGTH

ATAN

CURRENT_TIMESTAMP

DIFFERENCE

ATAN2

EXTRACT

OCTET_LENGTH

COT

TIMESTAMPDIFF

POSITION

DEGREES



RADIANS



RAND



ROUND



インストールによって作成されるファイル

表1-2 Oracle ODBC Driverキットでインストールされるファイル

説明 Windowsインストールのファイル名 UNIXインストールのファイル名

Oracle ODBCデータベース・アクセスDLL

sqora32.dll

libsqora.so.12.1

Oracle ODBC Driver設定DLL

sqoras32.dll

なし

Oracle ODBCリソースDLL

sqresus.dll

なし

日本語用のOracle ODBCリソースDLL

sqresja.dll

なし

Oracle ODBC Driverメッセージ・ファイル

oraodbcus.msb

oraodbcus.msb

日本語用のOracle ODBC Driverメッセージ・ファイル

oraodbcja.msb

oraodbcja.msb

Oracle ODBC Driverリリース・ノート

Oracle Databaseリリース12.1ドキュメント・ライブラリのOracle ODBC Driverリリース・ノート

Oracle Databaseリリース12.1ドキュメント・ライブラリのOracle ODBC Driverリリース・ノート

Oracle ODBC Driver Instant Clientリリース・ノート

ODBC_IC_Readme_Win.html

ODBC_IC_Readme_Unix.html

Oracle ODBC Driverヘルプ・ファイル

sqora.chm

sqora.chm

日本語用のOracle ODBC Driverヘルプ・ファイル

sqora.chm

sqora.chm

Oracle ODBC Driver Instant Clientインストール・スクリプト

odbc_install.exe

odbc_update_ini.sh

Oracle ODBC Driver Instant Clientアンインストール・スクリプト

odbc_uninstall.exe

なし


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]を使用した取消し

構成タスク

Oracle Net Servicesの構成

データソースを構成する前に、ネットワーク・データベース・サービスを構成して各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は、データソースを追加する際にユーザーが入力する情報を使用してデータにアクセスします。次の手順を実行します。

  1. 「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース (ODBC)」を選択します。インストールされているドライバのリストが表示されます。

  2. 新規データ ソースの作成ウィンドウで「追加」をクリックし、インストール済ドライバのリストで「Oracle ODBC Driver」を選択します。

  3. 「終了」をクリックします。「Oracle ODBCドライバ構成」ダイアログ・ボックスが表示されます。データソース名とTNSサービス名は必ず入力する必要があります。このダイアログ・ボックスでその他の必要な情報を入力することも、フィールドを空白のままにして、アプリケーションを実行するときに情報を指定することもできます。

  4. データを入力したら、「OK」をクリックするか[Enter]を押します。

データソースはいつでも変更または削除できます。次の項では、データソースの追加、変更または削除方法を説明します。

Oracleデータソースを変更するには

  1. 「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース(ODBC)」を選択します。

  2. 「ODBC データ ソース アドミニストレータ」ダイアログ・ボックスで、データソースのリストからデータソースを選択し、「構成」をクリックします。「Oracle ODBCドライバ構成」ダイアログ・ボックスが表示されます。

  3. 「Oracle ODBCドライバ構成」ダイアログ・ボックスで、必要に応じてオプション値を変更し、「OK」をクリックします。

Oracleデータソースを削除するには

  1. 「スタート」メニューから「プログラム」→「管理ツール」→「データ ソース(ODBC)」を選択します。

  2. 「ODBC データ ソース アドミニストレータ」ダイアログ・ボックスで、データソースのリストから削除するデータソースを選択します。

  3. 「削除」「はい」の順にクリックして、削除を確定します。

関連トピック

Oracleデータソースへの接続

Oracle ODBC Driverの最初の使用

「Oracle ODBCドライバ構成」ダイアログ・ボックス


注意:

「Oracle ODBCドライバ構成」ダイアログ・ボックスを使用できるのは、Microsoft Windowsユーザーのみです。

図1-3 「Oracle ODBCドライバ構成」ダイアログ・ボックス

図1-3の説明が続きます
「図1-3 「Oracle ODBCドライバ構成」ダイアログ・ボックス」の説明

次のリストは、前図に示した「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ドライバ構成」ダイアログ・ボックスの下半分にあるオプション・タブの説明は、次のリンクのいずれかをクリックします。

アプリケーション・オプション

Oracleオプション

Workaroundsオプション

SQL Server移行オプション

アプリケーション・オプション

図1-4 「Oracle ODBCドライバ構成」ダイアログ・ボックスの「アプリケーション」オプション・タブ

図1-4の説明が続きます
「図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」オプション・タブ

図1-5の説明が続きます
「図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エラーを変換 - SQL翻訳フレームワーク機能を使用している移行済のサード・パーティ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」オプション・タブ

図1-6の説明が続きます
「図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_IDSQL_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移行オプション・タブ

図1-7の説明が続きます
「図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ドライバ構成」ダイアログ・ボックス」のトピックにあります。

oraodbc.iniファイルの変更

ロック・タイムアウトの短縮

Oracleサーバーは、トランザクション間のロック競合が解消されるまで無期限に待機します。Oracle ODBC Driverのoraodbc.iniファイルのLockTimeOutエントリを設定することで、Oracleサーバーがロックの解消を待機する時間を制限できます。LockTimeOutパラメータに入力する値は、Oracleサーバーがリクエストしたロックを取得できない場合にタイムアウトになるまでの秒数です。次の例では、Oracleサーバーは60秒後にタイムアウトになります。

[Oracle ODBC Driver Common]
LockTimeOut=60

データソースへの接続

Oracleデータソースへの接続

Oracle ODBC Driverでは、データソースに接続するために、使用するコンピュータにOCIクライアント・ソフトウェアがインストールされていて、対応するリスナーがOracleサーバーで実行されていることが必要です。Oracle Net Services for Windowsは、ダイナミック・リンク・ライブラリ(DLL)に基づくアプリケーションです。Oracle Net Servicesの詳細は、Oracle Net Servicesのマニュアルを参照してください。

接続処理の一部として、アプリケーションがユーザーに情報を要求することがあります。アプリケーションからOracleデータソースについての情報を要求された場合は、次の手順を実行します。

  1. 「TNSサービス名」ボックスで、TNSサービス名の名前を入力します。

  2. 「ユーザー名」ボックスに、Oracleデータベースにアクセスするために使用する名前を入力します。

  3. 「パスワード」ボックスに、Oracleデータベースにアクセスするために使用するパスワードを入力します。

  4. 「OK」をクリックします。

アプリケーションは、データソース内のデータにアクセスするためにはデータソースに接続する必要があります。データソースに接続するタイミングは、アプリケーションによって異なります。たとえば、アプリケーションがユーザーの要求時にのみデータソースに接続する場合もあれば、起動時に自動的に接続する場合もあります。アプリケーションがいつデータソースに接続するかは、そのアプリケーションのマニュアルを参照してください。

追加情報にアクセスするには、次のリンクのいずれかをクリックします。

全ユーザー向け関連項目

データソースの構成

プログラマ向け関連項目

SQLDriverConnectの実装

データソース構成オプション

トラブルシューティング

Oracle ODBC Driverの最初の使用

注意: この情報は、Microsoft Windowsユーザー用です。

Oracle ODBC Driverを使用して初めてデータベースまたは表にアタッチしようとするときに、次の問題が発生することがあります。

  • Oracle ODBC Driverを正常に動作させるために、システム・パスにOracleHome/binを設定する必要がある

    コマンド・プロンプトでPATHコマンドを使用して確認します。

  • マシンまたはサーバー・システムに必要なソフトウェアがない


    問題: Oracle ODBC Driverの処理が失敗する。
    原因: マシンにOCIソフトウェアがインストールされていないか、サーバー・システムにOracleデータベース・ソフトウェアがインストールされていない。
    推奨処置: クライアントマシンに必要なOCIソフトウェアをインストールするか、サーバー・システムにOracleデータベース・ソフトウェアをインストールします(必要な場合は両方)。
  • マシンに設定されているクライアント/サーバー接続が正しくない


    問題: マシンからサーバー・システムに接続できない。
    原因: 必要なトランスポート・ソフトウェアがインストールされていないか、正しく構成されていない。
    推奨処置: テストとして、たとえばTCP/IPを使用している場合、Oracleデータベースが存在するサーバーにマシンがpingできることを確認します。\orant\binまたは\Oracle\ora90\binディレクトリにあるtnsping.exeを使用すると、特定のデータベース・サービスへの接続を確認できます。次に例を示します。
    C:/ORANT/BIN>tnsping database-service-name
  • TNSサービス名がOracle Net Configuration Assistant (NETCA)で入力された名前と一致しない


    問題: ユーザーがOracle ODBC Driverの設定を試行すると、TNSサービス名についてのエラー・メッセージが戻される。
    原因: TNSサービス名がNETCAで入力された名前と一致しない。
    推奨処置: Oracle ODBC Driverのセットアップ・ウィンドウのTNSサービス名を、NETCAのTNSサービス名と一致するように変更します。

    注意:

    データソース構成画面上のプルダウン・メニューですべての有効なTNSサービス名リストを表示して選択することができます。

  • ユーザーにデータベースへのアクセス権がない


    問題: ユーザーがOracle ODBC Driverを使用中にOracleデータベースへアクセスしようとすると、アクセス拒否のエラー・メッセージが戻される。
    原因: ユーザーにOracleデータベースへのアクセス権がない。
    推奨処置: Oracleデータベースへアクセスするための適切な権限がユーザーに割り当てられていることを確認します。
  • システム・エラー: ODBC DSNの作成時に182または193が発生


    問題: ODBC Administratorを使用したデータソース名の作成時に、Oracle ODBC Driverを選択後システム・エラー182または193が発生する。
    原因: Microsoftから提供されるmfc42.dllとの互換性の不一致。
    推奨処置: OracleHome/binPATHに含まれていること、およびOracleHome/bin以外のパスに重複するoci.dllが存在しないことを確認します。それでもエラーが発生する場合は、正常に動作しているマシンからmfc42.dllをコピーします。
  • トランスレータ ライブラリを読み込めない(システム エラー コード31)


    問題: Oracle ODBC Driverを搭載したWindows上で、Microsoft ODBC AdministratorでOracle ODBC DSNを追加または削除すると、「トランスレータ ライブラリを読み込めません(システム エラー コード31)」が発生する。
    原因: Windowsマシンでは、旧バージョンの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は、Microsoft社のDLLです。

期限切れパスワード

この項には、期限切れパスワードに関する情報が含まれます。

期限切れパスワードの動作

データベースの接続時にパスワードが期限切れの場合、パスワードを変更するよう要求されます。正常にパスワードが変更されると、データベースに接続されます。ただし、SQL_DRIVER_NOPROMPTパラメータ値を使用してSQLDriverConnectコールでデータベースに接続すると、Oracle ODBC Driverはパスワードを変更するよう要求しません。かわりにエラーとなり、パスワードが期限切れであることを示すエラー番号およびメッセージを表示します。

上級ユーザー

Oracle ODBC DriverのTNSサービス名の作成

Oracle Net Servicesを使用してOracle ODBC DriverのTNSサービス名を作成するには、Oracle Net Servicesと同時にインストールされるOracle Net Configuration Assistant (NETCA)を使用します。NETCAによって、Oracle ODBC DriverのTNSサービス名のエントリがtnsnames.oraファイルに作成されます。

SQL文

Oracle ODBC DriverはSQL-92のエントリ・レベル仕様のスーパーセットであるSQL-99のコア仕様と広く互換性があります。Oracleの文法に加えて、ODBC仕様の付録Cで概要を説明しているベンダー固有のエスケープ・シーケンスもサポートしています。ODBCの設計に従って、Oracle ODBC Driverは固有のSQL構文をOracleデータベースに渡します。

上級ユーザー向け関連項目

データ型

プログラマ向け関連項目

ODBC SQL構文の実装

データ型

Oracleデータベースのデータ型はOracle ODBC DriverによってODBCのSQLデータ型にマップされます。


注意:

Microsoft ODBC 3.52 Software Development Kit and Programmers ReferenceのAppendix Dにあるすべての変換は、適切な情報型を指定したSQLGetInfoのコールでリストされるODBC SQLデータ型についてサポートされています。

上級ユーザー向け関連項目

データ型の実装

データ型の制限

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の汎用数値データ型にマップされていました。

関連トピック

DATEデータ型およびTIMESTAMPデータ型

データ型の制限

Oracle ODBC DriverおよびOracleデータベースでは、データ型について制限があります。表1-3に、これらの制限を示します。

表1-3 Oracle ODBC DriverおよびOracleデータベースがデータ型に課す制限

制限されるデータ型 説明

リテラル

OracleデータベースではSQL文内のリテラルが4,000バイトに制限されます。

SQL_LONGVARCHARおよびSQL_WLONGVARCHAR

SQL_LONGVARCHARデータ(LONG型)のOracleでの制限は2,147,483,647バイトです。SQL_WLONGVARCHARデータ(CLOB型)のOracleでの制限は4GBです。クライアント・ワークステーションのメモリーが制限の要因になります。

SQL_LONGVARCHARおよびSQL_LONGVARBINARY

Oracleデータベースでは1つの表ではLONGデータ列を1つしか使用できません。LONGデータ型にはSQL_LONGVARCHAR(LONG)とSQL_LONGVARBINARY(LONG RAW)があります。かわりにCLOBおよびBLOBを使用することをお薦めします。1つの表で使用できるCLOBおよびBLOB列の数には、制限はありません。


エラー・メッセージ

エラーが発生すると、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-5SQLDriverConnect関数コールの接続文字列引数に組み込むことができるキーワードを示します。指定されていないキーワードは、データソースの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

NUMBERFLOATとしてバインド

T=NUMBERFLOATとしてバインド。F=NUMBERNUMBERとしてバインド。

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

SQL_WCHAR強制サポート

T=強制SQL_WCHAR有効。F=強制SQL_WCHAR無効。

EXC

EXEC構文

T=EXEC構文有効。F=EXEC構文無効。

XSM

スキーマ・フィールド

Default=デフォルト。Database=データベース名。Owner=所有者名。

MDI

メタデータIDのデフォルトの設定

T=SQL_ATTR_METADATA_IDのデフォルトをSQL_TRUEに設定。F=SQL_ATTR_METADATA_IDのデフォルトをSQL_FALSEに設定。

DPM

SQLDescribeParamの無効化

T=SQLDescribeParam無効。F=SQLDescribeParam有効。

BTD

TIMESTAMPDATEとしてバインド

T=SQL_TIMESTAMPをOracle DATEでバインド F=SQL_TIMESTAMPをOracle TIMESTAMPでバインド

NUM

数値の設定

NLS=Oracle NLS数値設定を使用(小数点および3桁区切りの決定)。MS=Microsoftの地域設定を使用。US=US設定を使用。

ODA

OCIDescribeAny( )を使用

T=アプリケーションがREF CURSORSを戻す小さなパッケージ・プロシージャを頻繁にコールする場合にパフォーマンスを向上させるためにOCIDescribeAny( )コールを使用。

F=OCIDescribeAny( )を使用しない。デフォルトでは、OCIDescribeAny( )値の使用はFALSEです。

STE

SQLでORAエラーを変換

Oracle ODBC DriverがOracleエラー・コードを変換するかどうかを指定

T=ORAエラーを変換。

F=ORAエラーを変換しない。デフォルトでは、SQLTranslateErrorsFALSEに設定されます。

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;

追加情報にアクセスするには、次のリンクのいずれかをクリックします。

全ユーザー向け関連項目

Oracleデータソースへの接続

プログラマ向け関連項目

SQLDriverConnectの実装

SQLDriverConnectの実装

表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ファイルに値を指定する方法の詳細は、「ロック・タイムアウトを短縮する」を参照してください。

odbc32.lib (Windows)またはlibodbc.so (UNIX)とのリンク

Windowsプラットフォームの場合、プログラムをリンクするときは、インポート・ライブラリodbc32.libとリンクする必要があります。

UNIXプラットフォームの場合は、ODBCアプリケーションをlibodbc.soにリンクする必要があります。

ROWIDの情報の取得

ODBC SQLSpecialColumns関数は表の列に関する情報を戻します。Oracle ODBC Driverでは、Oracle表に対応付けられているOracleのROWIDについての情報が戻されます。

WHERE句での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);
}

EXEC構文の有効化

このオプションを有効にすると、変更なしに変換可能な場合、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 RAC環境における接続障害のイベント通知の有効化

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を通じた暗黙的結果機能の使用

このオプションは、サード・パーティ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.
}
}
}

サポートされる機能

API準拠

Oracle ODBC Driverのリリース9.2.0.0.0以降では、すべてのコア、レベル2およびレベル1関数をサポートしています。

さらに、Oracle ODBC Driverのリリース9.2.0.0.0以降では、変換DLLをサポートしています。

次のトピックでは、Oracle ODBC Driverで実装されているODBC API関数について説明します。

上級ユーザー向け関連項目

エラー・メッセージ

プログラマ向け関連項目

ODBC API関数の実装

ODBC API関数の実装

表1-7 Oracle ODBC Driverで特定の関数を実装する方法

関数 説明

SQLConnect

SQLConnectには、DBQ、ユーザーIDおよびパスワードのみが必要です。

SQLDriverConnect

SQLDriverConnectは、DSN、DBQ、UIDおよびPWDキーワードを使用します。

SQLMoreResults

暗黙的結果のODBCサポートを実装します。これは、リリース12.1で新規に実装されたAPIです。詳細は、http://msdn.microsoft.com/en-us/library/ms714673(v=VS.85).aspxを参照してください。

SQLSpecialColumns

SQLSpecialColumnsは、SQL_BEST_ROWID属性を指定してコールされると、常にROWID列を戻します。

SQLProceduresおよびSQLProcedureColumns

次の項を参照してください。

すべてのカタログ関数

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、文字列引数は識別子引数として扱われ、大/小文字の区別はされません。この場合は、アンダースコア("_")やパーセント記号("%")は実際の文字として扱われ、検索文字列として見なされません。この属性がSQL_FALSEに設定されている場合、通常の引数またはパターン値の引数となり文字どおりに扱われ、大/小文字は区別されます。


ODBC SQL構文の実装

比較の述語に比較の第2式としてパラメータ・マーカーがあり、そのパラメータの値がSQLBindParameterによってSQL_NULL_DATAに設定されている場合、比較は失敗します。これはODBC SQLのNULL述語構文と一致しています。

データ型の実装(プログラミング)

プログラマにとって特に注意が必要なのは、CHARVARCHARおよびVARCHAR2データ型の実装です。

SQLGetTypeInfoは、SQL_VARCHARのfSqlType値に対し、Oracleデータベース・データ型であるVARCHAR2を戻します。また、SQLGetTypeInfoは、SQL_CHARのfSqlType値に対しては、Oracleデータベース・データ型であるCHARを戻します。

Unicodeサポート

ODBC環境内のUnicodeサポート

MicrosoftまたはunixODBC ODBCドライバ・マネージャ(ドライバ・マネージャ)によって、Unicodeをサポートしているかどうかに関係なく、すべてのODBCドライバがUnicode対応しているように動作します。これにより、下位のODBCドライバでUnicodeが使用可能かどうかに依存せずに、ODBCアプリケーションを作成することができます。

ドライバ・マネージャがANSI ODBCドライバ用にUnicodeサポートをエミュレートできるのは、Unicodeデータとローカル・コード・ページとの間の変換に限られています。ドライバ・マネージャがUnicodeからローカル・コード・ページに変換するとき、データが失われる可能性があります。完全なUnicodeサポートは、ODBCドライバがUnicodeをサポートしないかぎり不可能です。Oracle ODBC DriverはUnicodeをフル・サポートしています。

ODBC API内での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_WCHARSQL_WVARCHARおよびSQL_WLONGVARCHARは、表内でUnicodeと定義されている列を表すために、ODBCインタフェースに追加されています。これらの値は、SQLDescribeColSQLColAttributeSQLColumnsおよびSQLProcedureColumnsコールから返されます。

Unicodeエンコードは、SQL列型NCHARNVARCHAR2およびNCLOBについてサポートされています。また、SQL列型CHARおよびVARCHAR2についても、キャラクタ・セマンティクスが列定義で指定されている場合は、Unicodeエンコードがサポートされます。

Oracle ODBC DriverはこれらのSQL列型をサポートしており、これらをODBC SQLデータ型にマップします。

表1-8 サポートされるSQLデータ型および対応するODBC SQLデータ型

SQLデータ型 ODBC SQLデータ型

CHAR

SQL_CHARまたはSQL_WCHAR 脚注1 

VARCHAR2

SQL_VARCHARまたはSQL_WVARCHAR 脚注2 

NCHAR

SQL_WCHAR

NVARCHAR2

SQL_WVARCHAR

NCLOB

SQL_WLONGVARCHAR


脚注1 キャラクタ・セマンティクスが列定義で指定されている場合およびデータベースのキャラクタ・セットがUnicodeの場合、CHARSQL_WCHARにマップされます。

脚注2 キャラクタ・セマンティクスが列定義で指定されている場合およびデータベースのキャラクタ・セットがUnicodeの場合、VARCHAR2SQL_WVARCHARにマップされます。

ドライバ・マネージャのUnicode機能

ドライバ・マネージャは、ODBCドライバがUnicodeをサポートしていないことを検出すると、次を実行します。

  • ANSI ODBCドライバをコールする前にUnicode用関数コールをANSI用関数コールに変換します。文字列引数はUnicodeからローカル・コード・ページに変換されます。たとえば、SQLPrepareWコールはSQLPrepareコールに変換されます。SQL文パラメータの文字列はUnicodeからローカル・コード・ページに変換されます。

  • 文字データのリターン・パラメータを、ローカル・コード・ページからUnicodeに変換します。たとえば、SQLColAttributeを使用して列名を戻す場合です。

  • SQL_C_WCHARでバインドされた列に対し、データをローカル・コード・ページからUnicodeコード・ページに変換します。

  • SQL_C_WCHARでバインドされた入力パラメータに対し、データをUnicodeからローカル・コード・ページに変換します。

SQLGetDataのパフォーマンス

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としてデータをフェッチする場合があります。

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プログラミングのヒント

この項では、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データ型およびTIMESTAMPデータ型

索引を含む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.2

Copyright © 1993, 2015 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 Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss,costs,or damages incurred due to the use of this documentation.

このドキュメントの情報は、情報共有の目的のみに使用され、顧客諮問委員会の会員の立場で考慮されるか、ベータ・トライアル版契約のみに準じる必要があります。資料、規約または機能性を配信する義務はなく、購買決定に依存することはできないものとします。このドキュメントに記載されている開発、リリース、およびすべての機能または機能性の時期は、オラクル社の独自の判断に従うものとします。

このドキュメントは、ソフトウェアまたは印刷物などの形式にかかわらず、オラクル社の独占的な財産である機密情報を含みます。この機密資料は、Oracleソフトウェア使用許諾契約に基づいて提供され、その内容に同意する場合のみ使用できます。オラクル社の文書による事前承諾なしに、このドキュメントおよびここに含まれる情報を開示、コピー、再生、またはオラクル社外部の他者に配布することはできません。このドキュメントは使用許諾契約の一部ではなく、オラクル社の子会社またはアフィリエイトとの契約上の合意に組み込まれません。

アクセシビリティ・ステートメント

オラクル社のアクセシビリティへの取組みの詳細は、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 (聴覚障害者向け)を参照してください。