ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# 4.1 プログラムへのSQL文の埋込み

ホスト言語プログラムにSQL文を埋め込む場合は、いくつかの要素について考慮します。以降の項では、2フェーズ・コミットのプロトコルの使用方法と、DECLARE MODULE文の句を埋め込んでキャラクタ・セット、引用ルール、デフォルトの日付書式などを指定する方法について説明します。

## 4.1.1 ホスト言語コードへのモジュール句の埋込み

DECLARE MODULE文のモジュール句をホスト言語プログラムに組み込むと、次の要素を制御できます。

- 言語設定: 文字長、二重引用符、キーワードとしての識別子、読取り専用ビュー、およびDATEデータ型とCURRENT_TIMESTAMPデータ型の解釈を1つの句で指定できます。

- キャラクタ・セット: リテラル、各国語、デフォルト、識別子を指定して、モジュールのキャラクタ・セットを表示します。

- スキーマ名: モジュールのデフォルト・スキーマ名を指定します。

- 認可識別子: モジュールの認可識別子を指定します。

- モジュール言語オプション: モジュールの別名、個別の言語設定（文字長、引用ルールなど）、パラメータ名の先頭に付けるコロン、およびモジュール実行の権限チェックを指定します。

DECLARE MODULE文のモジュール句の使用方法の詳細は、「DECLARE MODULE文」を参照してください。

## 4.1.2 埋込みプログラムの2フェーズ・コミットのプロトコルの使用

プリコンパイルされたSQLの使用時には、2フェーズ・コミットのプロトコルを明示的に使用できます。これを実行するには、アプリケーションがトランザクション・マネージャを明示的にコールして、コンテキスト構造体を宣言する必要があります。コンテキスト構造体には、その要素の1つとして分散トランザクション識別子（TID）が含まれます。さらに、分散トランザクションに関与する大部分の実行SQL文では、USING CONTEXT句が指定されている必要があります。USING CONTEXT句は、コンテキスト構造体をSQL文に関連付けます。第2.9節には、コンテキスト構造体を取得しない非実行可能文がリストされています。

次の構文図は、分散トランザクションの一部である埋込みSQL文の形式を示しています。

たとえば、次の埋込みSQL文は、分散トランザクションの一部としてカーソルをオープンします。

    EXEC SQL USING CONTEXT :DISTR_TRANS OPEN CURSOR1

分散トランザクションではバッチ更新トランザクションを使用できないため、バッチ更新トランザクションを開始する前にSQL$DISABLE_CONTEXT論理名をTRUEに定義する必要があります。（分散トランザクションでは、トランザクションがロールバック可能であることが必要です。バッチ更新トランザクションではリカバリ・ユニット・ジャーナル・ファイル（.ruj）への書込みが行われないため、ロールバックできません。）

バッチ更新トランザクションを使用して分散トランザクションの開始を試行した場合の結果は、次に示すように、DECdtmシステム・サービスのコールを暗黙的または明示的のどちらで行うか、およびトランザクションの開始に何のSQL文を使用するかによって異なります。

- バッチ更新トランザクションを開始してDECdtmシステム・サービスを明示的にコールすると、コンパイル時にエラーが返されます。

- バッチ更新トランザクションを開始してDECdtmシステム・サービスを暗黙的にコールすると、次のアクションが実行されます。

  - BATCH UPDATE句を指定したSET TRANSACTION文を使用すると、非分散トランザクションが開始されます。

  - BATCH UPDATE句を指定したDECLARE TRANSACTION文を使用すると、コンパイル時にエラーが返されます。

2フェーズ・コミットのプロトコルは分散トランザクションにのみ適用されます。分散トランザクションの詳細は、『Oracle Rdb7 Guide to Distributed Transactions』を参照してください。