ヘッダーをスキップ

Oracle Database アプリケーション開発者ガイド-基礎編
10gリリース2(10.2)

B19248-02
目次
目次
索引
索引

戻る 次へ

15 Oracle XAを使用したアプリケーションの開発

この章では、Oracle XAライブラリの使用方法について説明します。通常、このライブラリはトランザクション・モニターで作業するアプリケーションで使用します。XAの機能は、トランザクションが複数のデータベースと相互処理するアプリケーションで最も効果的です。

この章の内容は次のとおりです。

X/Open DTP

X/Open Distributed Transaction Processing(DTP)アーキテクチャは、複数のアプリケーション・プログラム(AP)が複数の異なるリソース・マネージャ(RM)から提供されるリソースを共有できるようにするための、標準のアーキテクチャまたはインタフェースを定義しています。APとRM間の作業を調整し、グローバル・トランザクションを実現します。

Oracle XAライブラリは、X/Openソフトウェア・アーキテクチャのXAインタフェース仕様に準拠しています。Oracle XAライブラリは外部インタフェースであり、Oracle以外のクライアント側トランザクション・マネージャ(TM)がグローバル・トランザクションを調整可能にすることで分散トランザクションにOracle Database以外のRMを組み込めるようにします。たとえば、クライアント・アプリケーションでは、Oracle DatabaseトランザクションとNTFSファイル・システム内のトランザクションを1つのグローバル・トランザクションとして管理できます。

図15-1に、X/Open DTPモデルの例を示します。

図 15-1    DTPモデルの例


画像の説明

DTP用語

この項では、分散トランザクション処理における重要な用語を紹介します。

リソース・マネージャ(RM)

リソース・マネージャは、障害発生後に通常の状態に戻すことができる共有かつリカバリ可能なリソースを制御します。たとえば、リレーショナル・データベース、トランザクション・キューおよびトランザクション・ファイル・システムなどです。Oracle DatabaseはRMであり、障害発生後にREDOログおよびロールバック・セグメントを使用して一貫性のある状態に復帰します。

分散トランザクション

分散トランザクションは、複数の分散リソースに対する更新を伴い、分散RM間で「すべてまたはなし」のセマンティクスを必要とするクライアント・トランザクションであり、グローバル・トランザクションとも呼ばれます。

ブランチ

ブランチは、1つのRMに含まれる1つの作業単位です。複数のブランチが1つのグローバル・トランザクションを構成します。Oracle Databaseの場合、各ブランチはデータベース・サーバー内のローカル・トランザクションにマップします。

トランザクション・マネージャ(TM)

トランザクション・マネージャは、トランザクション境界を指定するためのAPIを提供し、コミットおよびリカバリを管理します。TMでは、分散RM間で「すべてまたはなし」のセマンティクスを提供する2フェーズ・コミット・エンジンが実装されます。

外部TMとは、Oracle Databaseの外部に常駐する中間層コンポーネントです。通常、データベースには固有の内部TMがあります。業界標準に準拠したTMを使用することで、Oracle Databaseは単一のトランザクション内で他の異機種間RMと共存できます。

トランザクション処理モニター(TPM)

TMは、通常、TPMベンダーが提供します。TPMは、トランザクション要求を発行するクライアント・プロセスとその要求を処理するバックエンド・サーバー間の要求フローを調整します。TPMは、基本的にネットワーク上に分散されているアプリケーション・サーバーやRMなどのように、様々な種類のバックエンド・プロセスに対してサービスを要求するトランザクションを調整します。

TPMは、分散トランザクションを完了するために必要なコミットまたはロールバックを同期化します。TPMのTM部分が、分散コミットおよび分散ロールバックの発生するタイミングを制御します。このため、分散APでTPMを利用する場合、TPMのTM部分が2フェーズ・コミット・プロトコルを制御します。RMを使用して、TMはこのタスクを実行します。

TMは分散コミットまたはロールバックを制御するため、XAインタフェースを介してOracle Database(または他のRM)と直接通信する必要があります。TMは、トランザクション内のすべてのRMに関する情報をもとに、「XAライブラリ・サブルーチン」で説明するOracle XAライブラリ・サブルーチンを使用してOracle Databaseにトランザクションの処理方法を指示します。

2フェーズ・コミット・プロトコル

Oracle XAライブラリ・インタフェースは、2フェーズ・コミット・プロトコルに従います。各イベントの順序は次のとおりです。

  1. 準備フェーズでは、TMは各RMに対して、トランザクションの任意の部分をコミットできるように要求します。これが可能な場合は、RMは準備ができた状態を記録し、TMに肯定的に応答します。可能でない場合は、RMはすべての作業をロールバックし、TMに否定的に応答し、そのトランザクションに関する情報を消去します。プロトコルによって、アプリケーションまたはRMは、準備フェーズが完了する前にトランザクションを一方的にロールバックできます。

  2. フェーズ2では、TMはコミット決定を記録し、トランザクションに参加しているすべてのRMに対してコミットまたはロールバックを発行します。TMは、すべてのRMがフェーズ1に対して肯定的に応答した場合にのみ、RMのコミットを発行できます。

アプリケーション・プログラム(AP)

アプリケーション・プログラムは、トランザクションの境界を定義し、トランザクションを構成するアクションを指定します。たとえば、APはプリコンパイラでもOCIプログラムでもかまいません。APは、RMのネイティブ・インタフェース(たとえばSQL)を使用して、RMのリソースを操作します。

TXインタフェース

アプリケーション・プログラムは、TMを介し、TXと呼ばれるインタフェースを使用してすべてのトランザクション制御操作を開始および完了します。APがXAインタフェースを直接使用することはありません。APが中間層で分岐するブランチを認識することはありません。アプリケーション・スレッドがブランチの作業を明示的に結合、休止、一時停止および再開するかわりに、トランザクション処理モニターのTM部分がAPのためにグローバル・トランザクションのブランチを管理します。最終的に、APはTMをコールしてすべてをコミットするか、または何もコミットしません。


注意

TXインタフェースおよびその関連のサブルーチンのネーミング規則はベンダー固有です。たとえば、tx_openコールは、使用中のシステムではtp_openと呼ばれている場合があります。また、トランザクションRPCへの入力時など、このコールが暗黙的な場合もあります。詳細は、トランザクション処理モニターに付属のマニュアルを参照してください。 


密結合と疎結合

RMですべての分離セマンティクスについて単一エンティティとみなされるアプリケーション・スレッドは、密結合となります。密結合ブランチは、相互の変更を認識する必要があります。さらに、外部クライアントは、密結合セットの変更をすべて認識するか、まったく認識しない必要があります。アプリケーション・スレッドが密結合されていない場合は、疎結合となります。

動的登録と静的登録

Oracle Databaseは、動的登録と静的登録の両方をサポートします。動的登録の場合、RMは最初にアプリケーション・コールバックを実行します。静的登録の場合、関係のないRMがあっても、最初に、各RMに対してxa_start()をコールする必要があります。

必須のパブリック情報

Oracle Databaseは、リソース・マネージャとして、表15-1に示す情報を発行する必要があります。

表 15-1    Oracle Databaseが発行する必要のあるXA機能 
XA機能  Oracle Databaseの詳細 

xa_switch_t構造体 

Oracle Databaseのxa_switch_t構造体名は、静的登録の場合はxaosw、動的登録の場合はxaoswdです。これらの構造体には、RMのエントリ・ポイントおよびその他の情報が含まれています。 

xa_switch_tリソース・マネージャ 

xa_switch_t構造体内のOracle DatabaseのRM名はOracle_XAです。 

クローズ文字列 

xa_close()で使用されるクローズ文字列は無視され、NULLとして扱われます。 

オープン文字列 

xa_open()で使用されるオープン文字列の書式の詳細は、「xa_open()文字列の定義」を参照してください。 

ライブラリ 

Oracle XAを使用するアプリケーションをリンクするのに必要なライブラリには、プラットフォーム固有の名前が付けられています。TPM固有のライブラリをリンクする必要があることを除けば、通常のプリコンパイラまたはOCIプログラムをリンクする手順と同じです。

sqllibを使用していない場合は、必ず$ORACLE_HOME/rdbms/lib/xaonsl.oまたは$ORACLE_HOME/rdbms/lib32/xaonsl.o(32ビット・アプリケーションを64ビット・プラットフォーム上で作成する場合)をリンクしてください。 

要件 

ありません。XAをサポートする機能はStandard EditionおよびEnterprise Editionに含まれています。 

Oracle XAライブラリ・インタフェース・サブルーチン

Oracle XAライブラリ・サブルーチンを使用することで、TMはトランザクションの処理方法をOracle Databaseに指示できます。一般に、TMはxa_open()を使用してリソースをオープンする必要があります。通常、リソースはAPでtx_openをコールした結果としてオープンされます。一部のTMでは、アプリケーションが開始したときに、暗黙的にxa_open()をコールします。

同様に、アプリケーションがリソースの使用を完了したときに発生するクローズがあります(xa_close()を使用)。このクローズが発生するのは、APがtx_closeをコールしたとき、またはアプリケーションが終了したときです。

TMはRMに対して、次のように他の複数のタスクを実行するように指示します。

XAライブラリ・サブルーチン

表15-2に、XAライブラリ・サブルーチンを示します。

表 15-2    XAライブラリ・サブルーチン 
XAサブルーチン  説明 

xa_open() 

RMに接続します。 

xa_close() 

RMとの接続を切断します。 

xa_start() 

新規トランザクションを開始し、指定のトランザクションID(XID)に対応付けるか、またはプロセスと既存トランザクションを対応付けます。 

xa_end() 

指定されたXIDからプロセスを切断します。 

xa_rollback() 

指定されたXIDに対応付けられているトランザクションをロールバックします。 

xa_prepare() 

指定されたXIDに対応付けられているトランザクションを準備します。これは、2フェーズ・コミット・プロトコルの第1のフェーズです。 

xa_commit() 

指定されたXIDに対応付けられているトランザクションをコミットします。これは、2フェーズ・コミット・プロトコルの第2のフェーズです。 

xa_recover() 

準備されたヒューリスティックにコミットまたはロールバックされたトランザクションのリストを取得します。 

xa_forget() 

指定されたXIDに対応付けられているヒューリスティックに完了したトランザクションの情報を消去します。 

一般に、APでは、xa_open()文字列で実行されるロールを理解する以外に、表15-2に示したサブルーチンについて考慮する必要はありません。

XAインタフェースの拡張

表15-3に示すように、Oracle DatabaseのXAインタフェースには、いくつかの関数が追加されています。

表 15-3    Oracle DatabaseのXAインタフェースに追加された関数 
関数  説明 

OCISvcCtx *xaoSvcCtx(text *dbname) 

指定されたXA接続のOCIサービス・ハンドルを戻します。dbnameパラメータは、xa_open()文字列で渡されたDBパラメータと同じである必要があります。OCIアプリケーションでは、接続ハンドルを取得するために、sqlld2コールのかわりにこのルーティングを使用できます。このため、OCIアプリケーションはsqllibライブラリにリンクする必要はありません。サービス・ハンドルは、OCISvcCtxToLda()(OCIバージョン8)を使用してOCIバージョン7のログイン・データ領域(LDA)に変換できます。クライアント・アプリケーションは、OCIコールを完了した後で、OCILdaToSvcCtx()を使用してOracle7のLDAをサービス・ハンドルに変換する必要があります。 

OCIEnv *xaoEnv(text *dbname) 

指定されたXA接続のOCI環境ハンドルを戻します。dbnameパラメータは、xa_open()文字列で渡されたDBパラメータと同じである必要があります。 

int xaosterr(OCISvcCtx *SvcCtx,sb4 error) 

Oracle Databaseエラー・コードをXAエラー・コードに変換します(動的登録にのみ適用可能)。最初のパラメータは、データベースで作業を実行するために使用するサービス・ハンドルです。2番目のパラメータは、Oracle Databaseから戻されるエラー・コードです。この関数は、OCIコマンドから戻されたエラーがxa_start()の違反によって発生したものかどうかを判断するために使用します。この関数は、エラーがXAモジュールによって生成されたものでない場合はXA_OKを戻し、エラーがXAモジュールによって生成されたものである場合は有効なXAエラーを戻します。 

XAアプリケーションの開発およびインストール

この項では、Oracle XAアプリケーションの開発およびインストールについて説明します。

DBAまたはシステム管理者の責任

DBAまたはシステム管理者の責任は次のとおりです。

  1. アプリケーション開発者の支援によってオープン文字列を定義します。「xa_open()文字列の定義」を参照してください。

  2. DBA_PENDING_TRANSACTIONSビューが存在することを確認し、xa_open()文字列で指定したすべてのOracleユーザーに対して、このビューのSELECT権限を付与します。

    Oracle Databaseリリース7のクライアント・アプリケーションの場合は、Oracle XAライブラリで使用されるすべてのOracle Databaseアカウントに対して、V$XATRANS$ビューのSELECT権限を付与する必要があります。このビューは、XAライブラリのインストール時に作成されています。必要な場合は、Oracle DatabaseユーザーSYSとしてSQLスクリプトxaview.sqlを実行し、このビューを手動で作成できます。

    関連項目

    catxpend.sqlスクリプトの位置は、使用中のプラットフォーム固有のOracle Databaseのマニュアルを参照してください。 

  3. オープン文字列情報を使用して、RMをTPM構成にインストールします。TPMベンダーの指示に従ってください。

    DBAまたはシステム管理者は、Oracle Databaseに接続するプロセスをTPMシステムが開始することを認識する必要があります。TPMのマニュアルを参照して、このプロセスのためにどのような環境が存在するのか、ユーザーIDは何であるかを判断してください。この環境で$ORACLE_HOMEおよび$ORACLE_SIDに正しい値が設定されていることを確認してください。

  4. XAトレース・ファイルが書き込まれるディレクトリに対する書込み許可を、そのユーザーIDに対して付与します。

    関連項目

    デフォルトとは異なるOracleシステム識別子(SID)またはトレース・ディレクトリを指定する方法の詳細は、「xa_open()文字列の定義」を参照してください。 

  5. Oracle XAアプリケーションをオンラインにするために、適切なデータベース・インスタンスを起動します。このタスクは、TPMサーバーを開始する前に実行する必要があります。

アプリケーション開発者の責任

アプリケーション開発者の責任は次のとおりです。

  1. DBAまたはシステム管理者の支援によってオープン文字列を定義します。「xa_open()文字列の定義」を参照してください。

  2. アプリケーションを開発します。

    プリコンパイラ用のトランザクション指向のSQL文に関する特別な制限事項を守ってください。

    関連項目

    「プリコンパイラとOCIのXAインタフェース」 

  3. TPMベンダーの指示に従ってアプリケーションをリンクします。

xa_open()文字列の定義

オープン文字列は、トランザクション・モニターがデータベースをオープンするために使用します。オープン文字列内の最大文字数は256文字です。

この項の内容は次のとおりです。

xa_open()文字列の構文

例15-1に示す構文を使用してオープン文字列を定義できます。

例 15-1    xa_open()文字列

ORACLE_XA{+required_fields...} [+optional_fields...]

次の文字列は、サンプル・パラメータ設定を示しています。

ORACLE_XA+DB=MANAGERS+SqlNet=SID1+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog
ORACLE_XA+DB=PAYROLL+SqlNet=SID2+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog
ORACLE_XA+SqlNet=SID3+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog

次の各項では、required_fieldsおよびoptional_fieldsプレースホルダに有効なパラメータについて説明します。


注意

  • オープン文字列の作成時には、必須フィールドおよびオプションのフィールドをどのような順序でも入力できます。

  • すべてのフィールド名は大/小文字が区別されません。その値の大/小文字が区別されるかどうかは、プラットフォームによって異なります。

  • 実際の情報文字列の一部にプラス文字(+)を使用することはできません。

 

xa_open()文字列の必須フィールド

例15-1に示したrequired_fieldsプレースホルダは、表15-4に示す名前/値ペアのいずれかを指します。

表 15-4    xa_open()文字列の必須フィールド 
構文要素  説明 

Acc=P// 

ユーザーおよびパスワード情報が明示的には提供されないこと、およびオペレーティング・システム認証フォームが使用されることを示します。 詳細は、『Oracle Database管理者ガイド』を参照してください。
 

Acc=P/user/password 

有効なOracle Databaseアカウントのユーザー名とパスワードを指定します。たとえば、Acc=P/hr/hrはユーザーがhrでパスワードがhrであることを示します。「DBAまたはシステム管理者の責任」で説明したとおり、hrにDBA_PENDING_TRANSACTIONS表のSELECT権限があることを確認してください。 

SesTm=session_time_limit 

システムによりトランザクションが異常終了されるまでの、あるサービスから次のサービスまで、あるいはサービスからトランザクションのコミットまたはトランザクションまでの最大許容秒数を指定します。たとえば、SesTM=15は、セッション・アイドル時間の上限が15秒であることを示します。

たとえば、TPMでクライアントとサーバー間にリモート・プロシージャ・コールが使用されている場合は、SesTMは、あるRPCの完了から次のRPCの初期化の間、tx_commitまたはtx_rollbackとの間に適用されます。

値が0(ゼロ)の場合は、制限がないことを示します。値0(ゼロ)はできるだけ指定しないでください。問題があった場合に、リソースを長時間拘束することがあります。また、子プロセスにSesTM=0がある場合、親プロセスが終了した後は、SesTM設定の効果がなくなります。 

xa_open()文字列のオプション・フィールド

例15-1に示したoptional_fieldsプレースホルダは、表15-5に示す名前/値ペアのいずれかを指します。

表 15-5    xa_open()文字列のオプション・フィールド 
構文要素  説明 

NoLocal= true | false 

ローカル・トランザクションが許可されるかどうかを指定します。デフォルト値はfalseです。アプリケーションでローカル・トランザクションを禁止する必要がある場合は、値をtrueに設定します。 

DB=db_name 

Oracle Databaseプリコンパイラがデータベースの識別に使用する名前を示します。たとえば、DB=payrollは、データベース名がpayrollであり、アプリケーション・サーバー・プログラムがこの名前をAT句で使用することを示しています。

Oracle Databaseプリコンパイラのデフォルトのデータベースのみを使用する(SQL文でAT句を使用しない)APでは、オープン文字列のDB=db_name句を省略する必要があります。明示的に指定したデータベースを使用するアプリケーションは、DB=db_nameフィールドにそのデータベース名を指定する必要があります。Oracle Databaseバージョン7のOCIプログラムでは、OCIサービス・コンテキストと等価のログイン・データ領域(Lda_Def)の正しいコンテキストを取得するために、sqlld2()関数をコールする必要があります。バージョン8のOCIプログラムでは、xaoSvcCtx()関数をコールして、OCISvcCtxサービス・コンテキストを取得する必要があります。

db_nameはsidではありません。オープンするデータベースを検索するためには使用されません。このオープン文字列でオープンされたデータベースと、SQL文を実行するためにAPで使用される名前とを対応付けます。sidは、TPMアプリケーション・サーバーのORACLE_SID環境変数か、オープン文字列のOracle Net句で指定したsidから設定されます。Oracle Net句については、この項で後述します。

一部のTPMベンダーは、同じオープン文字列を使用するサーバー・グループの名前を指定する方法を提供しています。グループ名とdb_nameの両方に対して同じ名前を選択する方が便利な場合があります。  

LogDir=log_dir 

Oracle XAライブラリのエラーとトレース情報が格納されるローカル・マシン上のパス名を示します。デフォルトは、ORACLE_HOMEが設定されている場合は$ORACLE_HOME/rdbms/logで、それ以外の場合は現行のディレクトリを指定します。たとえば、LogDir=/xa_traceは、/xa_traceディレクトリにロギング情報があることを示しています。指定したディレクトリが存在し、アプリケーション・サーバーでそのディレクトリに確実に書き込めるようにしてください。  

Objects= true | false 

アプリケーションをオブジェクト・モードで初期化するかどうかを指定します。デフォルト値はfalseです。アプリケーションが、OCIRawAssignBytes()などのオブジェクト・モードを必要とする特定のAPIコールを使用する必要がある場合、trueを指定します。 

MaxCur=maximum_#_of_
open_cursors
 

データベースのオープン時に割り当てられるカーソルの数を指定します。これは、プリコンパイラ・オプションmaxopencursorsと同じ用途で機能します。たとえば、MaxCur=5は、プリコンパイラで5つのオープン・カーソルがキャッシュされることを示します。このパラメータは、ソース・コード内またはコンパイル時に指定したプリコンパイラ・オプションmaxopencursorsをオーバーライドすることに注意してください。 

SqlNet=db_link 

システムにログインするために使用するOracle Netデータベース・リンクを示します。この文字列は、tnsnames.oraのエントリである必要があります。たとえば、文字列SqlNet=inst1_dispの場合は、tnsnames.oraに定義されていれば、インスタンス1の共有サーバーに接続できます。

サーバー環境変数を制御できない場合は、SqlNetパラメータを使用してORACLE_SIDを指定できます。また、サーバーが複数のOracle Databaseインスタンスにアクセスする必要があるときにも、このパラメータを使用する必要があります。実際にリモート・データベースにアクセスせずにOracle Net文字列を使用するには、パイプ・ドライバを使用します。たとえば、SqlNet=localsid1と指定します。localsid1は、tnsnames.oraファイルで定義されている別名です。 

Loose_Coupling=true | false 

ロックが共有されるかどうかを示します。同じグローバル・トランザクション内の複数のOracle Databaseトランザクション・ブランチには、密結合または疎結合のどちらの方法も使用できます。ブランチが疎結合の場合は、ロックを共有できません。疎結合ブランチの場合は、値をtrueに設定します。ブランチが密結合の場合は、ロックを共有できます。密結合ブランチの場合は、値をfalseに設定します。デフォルト値はfalseです。ただし、Oracle Real Application Clustersを実行中の異なるRACインスタンス上にブランチがあるときは、値がfalseに設定されていても疎結合となります。 詳細は、「XAアプリケーションでのトランザクション・ブランチの管理」を参照してください。 

SesWt=session_wait_
limit
 

XA_RETRYが戻される前にOracle Databaseが別のセッションに使用されているトランザクション・ブランチを待機する秒数を示します。デフォルト値は60秒です。 

Threads=true | false 

アプリケーションがマルチスレッドかどうかを指定します。デフォルト値はfalseです。アプリケーションがマルチスレッドである場合、設定はtrueです。 

プリコンパイラとOCIのXAインタフェース

この項では、プリコンパイラおよびOracle Call Interface(OCI)でOracle XAライブラリを使用する方法について説明します。この項の内容は次のとおりです。

プリコンパイラでのOracle XAライブラリの使用

カーソルは、Oracle XAアプリケーションで使用する場合はトランザクションの存続期間のみ有効です。明示的カーソルは、トランザクションが開始した後にオープンし、コミットまたはロールバックの前にクローズする必要があります。

プリコンパイラとのインタフェースでは、次の2つのオプションがあります。

次の例では、プリコンパイラPro*C/C++を使用しています。

デフォルトのデータベースでのプリコンパイラの使用

デフォルトのデータベースでプリコンパイラにインタフェースするには、オープン文字列で使用されるDB=db_nameフィールドが存在しないことを確認してください。このフィールドが存在しない場合は、デフォルトの接続が指定されます。プロセスごとに1つのデフォルト接続のみが使用できます。

次に、デフォルトのPro*C/C++接続を識別するオープン文字列の例を示します。

ORACLE_XA+SqlNet=maildb+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/logs

DB=db_nameが存在せず、空のデータベースID文字列を示していることに注意してください。

SQL文の構文は次のようになります。

EXEC SQL UPDATE Emp_tab SET Sal = Sal*1.5;
指定されたデータベースでのプリコンパイラの使用

指定されたデータベースでプリコンパイラにインタフェースするには、オープン文字列にDB=db_nameフィールドを含めます。参照するすべてのデータベースは、対応するオープン文字列で指定した同一のdb_nameを参照する必要があります。

アプリケーションには、デフォルト・データベースの他に、名前を指定されたデータベースが1つ以上含まれることがあります。たとえば、あるデータベースで従業員の給与を更新し、別のデータベースでその従業員の部門番号(DEPTNO)を、第3のデータベースでその従業員の管理者を更新するとします。このような場合は、TMに次のようなオープン文字列を構成します。

例 15-2    オープン文字列構成のサンプル

ORACLE_XA+DB=MANAGERS+SqlNet=SID1+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog
ORACLE_XA+DB=PAYROLL+SqlNet=SID2+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog
ORACLE_XA+SqlNet=SID3+ACC=P/scott/tiger
  +SesTM=10+LogDir=/usr/local/xalog

例15-2の最後のオープン文字列にDB=db_nameフィールドがないことに注意してください。

アプリケーション・サーバー・プログラムでは、次のような宣言を入力します。

EXEC SQL DECLARE PAYROLL DATABASE;
EXEC SQL DECLARE MANAGERS DATABASE;

ここでも、デフォルトの接続(DBフィールドを含まない3番目のオープン文字列に対応)には宣言は必要ありません。

更新を実行するときは、次に示すような文を入力します。

EXEC SQL AT PAYROLL UPDATE Emp_Tab SET Sal=4500 WHERE Empno=7788;
EXEC SQL AT MANAGERS UPDATE Emp_Tab SET Mgr=7566 WHERE Empno=7788;
EXEC SQL UPDATE Emp_Tab SET Deptno=30 WHERE Empno=7788;

最後の文は、デフォルトのデータベースを参照しているためAT句はありません。

Oracle Databaseプリコンパイラのリリース1.5.3以上では、次に示す例のように、AT句に文字ホスト変数を使用できます。

EXEC SQL BEGIN DECLARE SECTION;
  DB_NAME1 CHARACTER(10);
  DB_NAME2 CHARACTER(10);
EXEC SQL END DECLARE SECTION;
    ...
SET DB_NAME1 = 'PAYROLL'
SET DB_NAME2 = 'MANAGERS'
    ...
EXEC SQL AT :DB_NAME1 UPDATE...
EXEC SQL AT :DB_NAME2 UPDATE...


注意

XAアプリケーションでは、xa_open()を介して作成された以外の接続を作成しないでください。XA以外の接続で実行されるすべての作業は、グローバル・トランザクションの範囲から外れることになり、個別にコミットする必要があります。 


OCIでのOracle XAライブラリの使用

Oracle XAライブラリを使用するOracle Call Interfaceアプリケーションでは、リソース・マネージャにログインするためにをOCISessionBegin()コールしないでください。ログインは、TPMを介して行うようにしてください。そのようなアプリケーションでは、関数xaoSvcCtx()を実行して、リソース・マネージャへのアクセスに必要なサービス・コンテキスト構造体を取得できます。

環境ハンドルをOCI関数に渡す必要があるアプリケーションでは、そのハンドルを検索するためにxaoEnv()もコールする必要があります。

アプリケーション・サーバーでは同時に複数のOracle DatabaseのRMをオープンできるため、適切なサービス・コンテキストを取得するためには適切な引数を使用して関数xaoSvcCtx()をコールする必要があります。

関連項目

OCISvcCtxハンドルの使用方法の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 

XAを使用したトランザクション制御の管理

XAライブラリを使用する場合、トランザクションは、トランザクションをコミットまたはロールバックするSQL文によっては制御されません。制御は、トランザクションを開始および終了するTMに受け入れられるAPIによって行われます。表15-2に示したXAライブラリ・サブルーチンではなく、表15-6に示したTXインタフェースなど、TMにより提供されるAPIをコールします。

TMは、通常、XAインタフェースを介してトランザクションを制御します。このインタフェースには、表15-2「XAライブラリ・サブルーチン」に示す関数が含まれています。

表 15-6    TXインタフェース関数 
TX関数  説明 

tx_open 

RMにログインします。 

tx_close 

RMからログアウトします。 

tx_begin 

新規トランザクションを開始します。 

tx_commit 

トランザクションをコミットします。 

tx_rollback 

トランザクションをロールバックします。 

ほとんどのTPMアプリケーションは、アプリケーション・クライアントがサービスを要求し、アプリケーション・サーバーがサービスを提供するというクライアント/サーバー・アーキテクチャを使用しています。「プリコンパイラ・アプリケーションの例」に示す例では、そのようなクライアント/サーバー・モデルを使用しています。サービスとは論理作業単位であり、Oracle DatabaseがRMである場合は、関連する作業単位を実行する一連のSQL文で構成されます。

たとえば、「貸方記入」というサービスが口座番号および貸方記入額を受け取ると、このサービスは、データベース内の特定の表にある情報を更新するSQL文を実行します。さらに、サービスはその他のサービスを要求することもあります。たとえば、「振替」サービスの場合は、「貸方記入」および「借方記入」にサービスを要求します。

通常、アプリケーション・クライアントは、トランザクション内で作業を実行するためにアプリケーション・サーバーにサービスを要求します。ただし、一部のTPMシステムでは、アプリケーション・クライアント自身がローカルにサービスを提供できます。「プリコンパイラ・アプリケーションの例」に示すとおり、トランザクション制御文は、クライアントまたはサーバーのどちらの側でも記述できます。

複数のプロセスを同一のトランザクションに参加させるために、TPMは参加プロセス間でトランザクション情報が伝達できる通信APIを提供しています。通信APIの例として、RPC、疑似RPC関数、送信/受信関数があります。

主要ベンダーが異なる通信関数をサポートしているため、次の例では、通信APIを汎用化するために通信疑似関数tpm_serviceを使用しています。

X/Openの準備段階の仕様には、通信関数を提供する代替方法がいくつか取り入れられています。主要TPMベンダーでは、これらの代替方法を1つ以上はサポートしています。

プリコンパイラ・アプリケーションの例

次の例は、プリコンパイラ・アプリケーションを示しています。アプリケーション・サーバーがTPM固有の方法でRMシステムにすでにログインしているとします。例15-3に、アプリケーション・サーバーによって開始されるトランザクションを示します。

例 15-3    アプリケーション・サーバーによって開始されるトランザクション

/***** Client: *****/
tpm_service("ServiceName");              /*Request Service*/

/***** Server: *****/
ServiceName()
{
  <get service specific data>
  tx_begin();                             /* Begin transaction boundary */
  EXEC SQL UPDATE ....;

  /* This application server temporarily becomes */
  /* a client and requests another service. */

  tpm_service("AnotherService");
  tx_commit();                             /* Commit the transaction */
  <return service status back to the client>
}

例15-4に、アプリケーション・クライアントによって開始されるトランザクションを示します。

例 15-4    アプリケーション・クライアントによって開始されるトランザクション

/***** Client: *****/
tx_begin();                            /* Begin transaction boundary */
tpm_service("Service1");
tpm_service("Service2");
tx_commit();                           /* Commit the transaction */

/***** Server: *****/
Service1()
{
  <get service specific data>
  EXEC SQL UPDATE ....;
  <return service status back to the client>
}
Service2()
{
  <get service specific data>
  EXEC SQL UPDATE ....;
  ...
  <return service status back to client>
}

プリコンパイラまたはOCIアプリケーションのTPMアプリケーションへの移行

既存のプリコンパイラまたはOCIアプリケーションを、Oracle XAライブラリを使用するTPMアプリケーションに移行するには、次の手順に従います。

  1. アプリケーション・クライアントがアプリケーション・サーバーにサービスを要求できるように、アプリケーションを「サービス」のフレームワークに再編成します。TPMには、アプリケーションでtx_open関数およびtx_close関数を使用するように要求するTPMと、ログインおよびログオフを暗黙的に実行するTPMがあります。

    オープン文字列にSqlNetパラメータを指定しないと、アプリケーションはデフォルトのOracle Netドライバを使用します。このため、ORACLE_HOMEおよびORACLE_SID環境変数を正しく定義して、アプリケーション・サーバーを立ち上げる必要があります。これは、TPMに固有の方法で行われます。これを行う方法の詳細は、TPMベンダーのマニュアルを参照してください。

  2. アプリケーションで正規の接続文および切断文を置き換えます。たとえば、接続文EXEC SQL CONNECT(プリコンパイラの場合)またはOCISessionBegin()OCIServerAttach()およびOCIEnvCreate()(OCIの場合)をtx_open()で置き換えます。 切断文EXEC SQL COMMIT/ROLLBACK WORK RELEASE (プリコンパイラの場合)またはOCISessionEnd()/OCIServerDetach(OCIの場合)をtx_close()で置き換えます。

  3. アプリケーションで、グローバル・トランザクションの正規のコミット文またはロールバック文を置き換え、トランザクションを明示的に開始します。

    たとえば、tx_commit()/tx_rollback()によってCOMMIT/ROLLBACKEXEC SQL COMMIT/ROLLBACK WORK(プリコンパイラの場合)またはOCITransCommit()/OCITransRollback()(OCIの場合)を置き換え、tx_begin()をコールすることによってトランザクションを開始します。


    注意

    前述の例は、ローカル・トランザクションではなくグローバル・トランザクションにのみ該当します。ローカル・トランザクションは、Oracle APIでコミットまたはロールバックする必要があります。 


  4. アプリケーションで、トランザクションを終了する前にフェッチ状態をリセットします。一般的には、release_cursor=noを使用します。release_cursor=yesは、文が1回しか実行されないことが確実なときにのみ使用します。

表15-7に、プリコンパイラまたはOCIアプリケーションをTPMアプリケーションに移行するときに、正規のOracle Databaseコマンドを置き換えるTPM関数を示します。

表 15-7    TPM用に置き換えるコマンド 
正規のOracle Databaseコマンド  TPM関数 

CONNECT user/password 

tx_open(暗黙の可能性あり) 

トランザクションの暗黙的な開始 

tx_begin 

SQL 

SQLを実行するサービス 

COMMIT 

tx_commit 

ROLLBACK 

tx_rollback 

切断 

tx_close(暗黙の可能性あり) 

XAライブラリ・スレッド・セーフティの管理

スレッドをサポートするトランザクション・モニターを使用する場合は、Oracle XAライブラリを使用してスレッド・セーフなアプリケーションを作成できます。ただし、注意が必要な問題がいくつかあります。

制御のスレッド(またはスレッド)とは、RMへの一連の接続のことです。スレッド化されていないシステムでは、各プロセスを制御のスレッドとみなすことができます。これは、各プロセスにはRMへの接続がそれぞれ独自にあり、それぞれが独立したRM表をメンテナンスしているためです。スレッド化されているシステムでは、各スレッドにはRMとの自律型接続があり、プライベートなRM表をメンテナンスします。このプライベートな表は新しいスレッドのそれぞれに対して割り当てる必要があり、またスレッドが終了したときは(異常終了であっても)割当てを解除する必要があります。


注意

Oracle Databaseでは、データベースにアクセスする各スレッドに独自の接続が必要です。 


オープン文字列でのスレッドの指定

xa_open()文字列では、Threads=句が指定されます。TMでスレッドを使用できるようにするには、この句をtrueに指定する必要があります。デフォルトはfalseです。ほとんどの場合、スレッドはTMによって作成され、アプリケーションは新しいスレッドがいつ作成されたのか認識しません。このため、サービス・コンテキストは、TMアプリケーション用に作成される各サービス内のスタック上に割り当てることをお薦めします。そのサービス内でOracle Database関連のコールを実行する前に、xaoSvcCtx関数をコールして初期化済のOCIサービス・コンテキストを取得する必要があります。このコンテキストをサービス内でOCIコールに使用できます。

XAのスレッドにおける制限事項

スレッドを使用するときは、次の制限事項が適用されます。

XAアプリケーションのトラブルシューティング

この項では、問題またはシステム障害の発生時に情報を検索する方法を説明します。また、トレース・ファイルおよびペンディング・トランザクションのリカバリについても説明します。 この項の内容は次のとおりです。

XAトレース・ファイルへのアクセス

Oracle XAライブラリでは、すべてのエラーおよびトレース情報がトレース・ファイルに記録されます。この情報は、XAエラー・コードを補足するときに役立ちます。たとえばxa_open()障害が発生したとき、その原因として、オープン文字列が正しくなかったか、Oracle Databaseインスタンスの検索が正常に実行されなかったか、またはログイン認可が正常に実行されなかったかを示します。

トレース・ファイル名はxa_db_namedate.trcです。db_nameはオープン文字列のフィールドDB=db_nameで指定したデータベース名で、dateは情報がトレース・ファイルに記録された日付です。オープン文字列でDB=db_nameを指定しない場合、自動的にデフォルトでNULLという名前になります。

たとえば、xa_NULL06022005.trcは、2005年6月2日に作成されたトレース・ファイルを示しています。RMがオープンされたときに、DBフィールドがオープン文字列に指定されていませんでした。ファイル名xa_Finance12152004.trcは、2004年12月15日に作成されたトレース・ファイルを示しています。RMがオープンされたときに、DBフィールドはオープン文字列で「Finance」と指定されていました。


注意

オープン文字列に同一のDBフィールドおよびLogDirフィールドを持つ複数のOracle XAライブラリRMは、同じ日に発生したすべてのトレース情報を同じトレース・ファイルに記録します。 


トレース・ファイルに次の内容が含まれているとします。

1032.12345.2:  ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
1032.12345.2:  xaolgn:  XAER_INVAL;  logon denied

表15-8に、各要素の意味を示します。

表 15-8    サンプル・トレース・ファイルの内容 
文字列  説明 

1032 

情報が記録された時刻 

12345 

プロセスID(PID) 

2 

リソース・マネージャID 

xaolgn 

モジュール名 

XAER_INVAL 

XA標準での指定に従って戻されたエラー 

ORA-01017 

戻されたOracle Database情報 

xa_open()文字列DbgFl

通常、XAトレース・ファイルはエラーが検出された場合にのみオープンされます。xa_open()文字列DbgFlは、XAライブラリに関する詳細を記録するトレース機能を提供します。デフォルト値は0(ゼロ)です。次の組合せのいずれかに設定できます。

トレース・ファイルの位置

XAアプリケーションでは、トレース・ファイルの位置が次のアルゴリズムに従って判別されます。

  1. オープン文字列で指定されているLogDirディレクトリ。

  2. オープン文字列にLogDir を指定しないと、Oracle XAアプリケーションは(Oracleホームがアクセス可能な場合は)次のディレクトリにトレース・ファイルを作成しようとします。

    • %ORACLE_HOME%¥rdbms¥trace(Windowsの場合)

    • $ORACLE_HOME/rdbms/log(UNIXの場合)

  3. Oracle XAアプリケーションでは、Oracleホームの位置を判別できない場合、トレース・ファイルは現在の作業ディレクトリに作成されます。

インダウト・トランザクションまたはペンディング・トランザクションの管理

インダウト・トランザクションまたはペンディング・トランザクションとは、準備はできているがデータベースに対してコミットされていないトランザクションです。一般的に、TPMシステムが提供するTMは、インダウト・トランザクションまたはペンディング・トランザクションの障害を解決し、リカバリします。次の状況では、DBAがインダウト・トランザクションをオーバーライドする必要がある場合があります。

前述のような状況でインダウト・トランザクションをオーバーライドする方法の詳細、およびインダウト・トランザクションをコミットまたはロールバックするかどうかを決定する方法の詳細は、TPMのマニュアルを参照してください。

SYSアカウント表を使用したXAトランザクションの監視

Oracle DatabaseのSYSアカウントには次のビューがあり、正規のOracle DatabaseアプリケーションおよびOracle XAアプリケーションによって生成されたトランザクションが含まれています。

Oracle XAアプリケーションによって生成されたトランザクションの場合は、次に示す列情報がDBA_2PC_NEIGHBORS表に適用されます。

db_nameは、オープン文字列で常にDB=db_nameと指定されることに注意してください。オープン文字列にこのフィールドを指定しないと、この列の値はOracle XAアプリケーションが生成するトランザクションについてはNULLxa.oracle.comになります。

たとえば、次のSQL文を使用すると、Oracle XAアプリケーションによって生成されたインダウト・トランザクションの詳細情報を取得できます。

SELECT * 
FROM DBA_2PC_PENDING p, DBA_2PC_NEIGHBORS n
WHERE p.LOCAL_TRAN_ID = n.LOCAL_TRAN_ID
AND n.DBID = 'xa_orcl';

別の方法として、TPMが使用するフォーマットIDがわかっている場合は、DBA_PENDING_TRANSACTIONSまたはV$GLOBAL_TRANSACTIONSを使用できます。DBA_PENDING_TRANSACTIONSでは準備済トランザクションの両方のリストが提供されますが、V$GLOBAL_TRANSACTIONSでは、すべてのアクティブなグローバル・トランザクションのリストが提供されます。

XAの問題および制限事項

この項の内容は次のとおりです。

XAアプリケーションでのデータベース・リンクの使用

Oracle XAアプリケーションは、次の制限事項に違反しないかぎり、データベース・リンク経由で他のOracle Databaseインスタンスにアクセスできます。

この制限事項が満たされている場合、Oracle Databaseはデータベース・リンクを許可し、トランザクション・プロトコルを他のOracle Databaseインスタンスに伝播(準備、ロールバックおよびコミット)します。

共有サーバー構成を使用できない場合は、リモート・データベースにEXEC SQL AT構文を使用してPro*C/C++アプリケーション経由でアクセスします。

init.oraパラメータOPEN_LINKS_PER_INSTANCEは、移行可能なオープン・データベース・リンク接続の数を指定します。これらのdblink接続は、トランザクションのコミット後に接続をキャッシュできるように、XAトランザクションによって使用されます。接続を作成したユーザーがトランザクションを作成したユーザーと同じである場合は、別のトランザクションが自由にデータベース・リンク接続を使用できます。このパラメータは、1つのセッションにおけるリモート・データベースへの同時オープン接続の最大数(データベース・リンクを含む)を指定するinit.oraパラメータOPEN_LINKSとは異なります。OPEN_LINKSパラメータは、XAアプリケーションには適用できません。

XAアプリケーションでのトランザクション・ブランチの管理

同じグローバル・トランザクション内の複数のOracle Databaseトランザクション・ブランチには、密結合または疎結合のどちらの方法も使用できます。トランザクション・ブランチが密結合の場合は、ロックを共有できます。そのため、あるトランザクション・ブランチでのCOMMIT前更新は、同じグローバル・トランザクションに属する他のブランチで参照可能です。疎結合トランザクション・ブランチの場合、ブランチはロックを共有せず、他のブランチでの更新を認識しません。

密結合ブランチの場合、Oracle Databaseは文を実行する前にDXロックを取得します。システムが文の実行前にロックを取得しないため、疎結合トランザクション・ブランチの同時実行性が増します。デメリットは、すべてのトランザクション・ブランチが2フェーズ・コミットを実行する必要があることです。XAの1フェーズ最適化は使用できません。

表15-9に、密結合ブランチと疎結合ブランチのトレードオフを示します。

表 15-9    密結合および疎結合トランザクション・ブランチ 
属性  密結合ブランチ  疎結合ブランチ 

2フェーズ・コミット 

読取り専用最適化

[全ブランチについて準備、最後のブランチについてコミット] 

2フェーズ

[全ブランチについて準備およびコミット] 

シリアライズ 

データベース・コール 

なし 

Oracle Real Application ClustersでのXAの使用

この項の内容は次のとおりです。

Oracle Real Application Clusters(RAC)でのトランザクション・ブランチの管理

Oracle Databaseでは、様々なインスタンスがRACの異なるトランザクション・ブランチで操作できます。たとえば、ノード1がブランチAで操作し、ノード2がブランチBで操作できます。トランザクション・ブランチが異なるインスタンスにある場合は疎結合であり、ロックを共有しません。この場合、Oracle Databaseでは、様々なアプリケーション・スレッドの異なる作業単位が、リソースを共有しない個別エンティティとして処理されます。

また、複数のインスタンスが1つのトランザクション・ブランチで操作する場合もあります。たとえば、次のように1つのトランザクションがノード1およびノード2にあるとします。

ノード1
  1. xa_start()

  2. SQL操作

  3. xa_end() (SUSPEND)

ノード2
  1. xa_start() (RESUME)

  2. xa_prepare()

  3. xa_commit()

  4. xa_end()

前述の順序では、ノード2は物理的に異なるノード(ノード1)にあるブランチを再開しないため、Oracle Databaseではエラーが戻されます。

RACで密結合を実現するには、DTPサービスを使用します。DTPサービスのカーディナリティ(1)により、ロード・バランシングが有効化されているかどうかに関係なく、すべての密結合ブランチが確実に同じインスタンスに置かれます。中間層コンポーネントは、常に1つのRACインスタンスにマップする共通の論理データベース・サービス名を使用して、Oracle Databaseをアドレス指定します。データベース・インスタンスの物理特性は、データベース・サービスの中間名リゾルバによって隠されます。DTPサービスを使用すると、密結合グローバル・トランザクションの参加者はすべて1つのインスタンス上でブランチを作成できます。

たとえば、DTPサービスを使用すると、次の一連のアクションが同じインスタンス上で発生します。

  1. xa_start()

  2. SQL操作

  3. xa_end() (SUSPEND)

  4. xa_start() (RESUME)

  5. SQL操作

  6. xa_prepare()

  7. xa_commit()またはxa_rollback()

さらに、それぞれが同じDTPサービスでOracle RMをアドレス指定する場合は、複数の密結合ブランチが同じインスタンスにあります。

クラスタのインスタンスをすべて活用するには、分散トランザクションを管理する各ノードに1つ以上、複数のDTPサービスを作成します。グローバル分散トランザクションのブランチは、すべて同じインスタンスに存在します。そのため、RACクラスタのすべてのインスタンスおよびノードを利用して多数の分散XAトランザクションのロード・バランシングを実行し、アプリケーションのスループットを最大化できます。

関連項目

Real Application Clusters構成で分散トランザクションを管理する方法については、『Oracle Database Oracle ClusterwareおよびOracle Real Application Clusters管理者および開発者ガイド』を参照してください。 

Real Application Clustersでのインスタンス・リカバリの管理

Oracle Database 10gリリース2(10.2)までは、RACでの障害検出とフェイルオーバーおよびフェイルバックのトリガーはTMで実行されていました。インダウト・トランザクションに関する情報をDBA_2PC_PENDINGに確実に伝播させるために、TMではインダウト・トランザクションの解決に進む前にxa_recover()を起動する必要がありました。インスタンスに障害が発生した場合、XAクライアント・ライブラリはSYS.DBMS_SYSTEM.DIST_TXN_SYNCプロシージャを実行して障害を起こしたインスタンスのUNDOセグメントがリカバリされたことを確認するまで、他のインスタンスにフェイルオーバーできませんでした。現行のリリースでは、処理中のトランザクションに関する十分な情報がTMにあれば、このようにxa_recover()を起動するという要件はありません。


注意

Oracle Database 9iリリース2以降のリリースでは、xa_recover()はリモート・サイトで分散DMLが完了するまで待機する必要があります。 


RACでDTPサービスを使用すると、次のようなメリットがあります。

Real Application ClustersのXIDのグローバル一意性

TMは、トランザクションID(XID)のグローバル一意性を保持する必要があります。XA仕様に従い、RMではTMからXIDを受け入れる必要があります。RACのXAでは指定されたXIDがクラスタ内で一意であるかどうかは判断できません。

たとえば、RACインスタンス1にXID Fmt(x).Tx(1).Br(1)、RACインスタンス2に別のXID Fmt(x).Tx(1).Br(1)があるとします。XIDがRACインスタンス間で一意ではありませんが、どちらもブランチを開始してSQLを実行できます。

SQLに基づくXAの制限事項

この項では、次のSQL操作に関する制限事項について説明します。

ロールバックおよびコミット

グローバル・トランザクションの進行状況の調整および監視はTMに責任があるため、グローバル・トランザクションのロールバックまたはコミットを独立して行うOracle Database固有の文をアプリケーションに入れないでください。ただし、ローカル・トランザクションではロールバックおよびコミットを使用できます。

グローバル・トランザクションの途中で、プリコンパイラ・アプリケーションにEXEC SQL ROLLBACK WORKを使用しないでください。同様に、OCIアプリケーションではOCITransRollback()またはバージョン7で同等のorol()を実行しないでください。グローバル・トランザクションをロールバックするには、tx_rollback()をコールします。

同様に、グローバル・トランザクションの途中で、プリコンパイラ・アプリケーションにEXEC SQL COMMIT WORK文を使用しないでください。OCIアプリケーションでは、OCITransCommit()またはバージョン7で同等のocom()を実行しないでください。たとえば、tx_commit()またはtx_rollback()を使用して、グローバル・トランザクションを終了してください。

DDL文

CREATE TABLEなどのSQL DDL文は、暗黙的なコミットを意味するためOracle XAアプリケーションでは実行できません。

セッション状態

Oracle Databaseでは、セッション状態が複数のTPMサービス間で有効であることを保証しません。たとえば、あるTPMサービスがセッション変数(グローバル・パッケージ変数など)を更新した場合、同じグローバル・トランザクションの一部として実行している別のTPMサービスにはこの変更が認識されないことがあります。セーブポイントは1つのTPMサービス内で使用してください。アプリケーションが、別のTPMサービスで作成されたセーブポイントを参照しないようにしてください。同様に、アプリケーションが、別のTPMサービスで実行されたカーソルからフェッチしないようにしてください。

EXEC SQL

接続および切断にEXEC SQLコマンドを使用しないでください。つまり、EXEC SQL CONNECTEXEC SQL COMMIT WORK RELEASEまたはEXEC SQL ROLLBACK WORK RELEASEを使用しないでください。

その他の制限事項

次の制限事項に注意してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引