ヘッダーをスキップ

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

戻る | 次へ |

SQL99、SQL92、SQL89またはMIAを指定した場合、SQLモジュール・プロセッサにより、その更新可能ビューのANSI/ISO SQL規格がコンパイル時に作成されるすべてのビューに適用されます。指定された更新可能ビューに関するANSI/ISO SQL規格に準拠しないビューは、更新できません。

指定された更新可能ビューに関するANSI/ISO SQL規格では、SELECT文で次の条件が満たされる必要があります。

- DISTINCTキーワードは指定されません。

- 選択リストに指定できるのは列名のみです。各列名は1回のみ指定できます。max(column_name)またはcolumn_name +1などのファンクションおよび式は選択リストに指定できません。

- FROM句が参照できるのは1つの表のみです。この表は、更新可能な実表または派生表である必要があります。

- WHERE句には副問合せが含まれません。

- GROUP BY句は指定されません。

- HAVING句は指定されません。

SQLV40を指定した場合、SQLではANSI/ISO規格は更新可能ビューに適用されません。かわりに、次の条件を満たすビューは更新可能とみなされます。

- DISTINCTキーワードは指定されません。

- FROM句が参照できるのは1つの表のみです。この表は、更新可能な実表または派生表である必要があります。

- WHERE句には副問合せが含まれません。

- GROUP BY句は指定されません。

- HAVING句は指定されません。

## 例

> 例1: 異なるキャラクタ・セットの文字列を指定するモジュールの宣言

> データベースのキャラクタ・セットがプログラムに指定されたキャラクタ・セットに一致すると仮定すると、次の例は、COLOURS表から1つの行を取得する単純なSQLのプリコンパイルされたCプログラムを示します。

>     /* This SQL precompiled program does some simple tests of character length
>     *  and character sets.
>     */
>     #include stdio
>     #include descrip

>     main()
>     {

>     /* Specify CHARACTER LENGTH CHARACTERS in the DECLARE MODULE statement.
>     *  In addition, specify the NAMES, NATIONAL, and DEFAULT character sets.
>     */
>     EXEC SQL DECLARE MODULE CCC_COLOURS
>              NAMES ARE DEC_KANJI
>              NATIONAL CHARACTER SET KANJI
>              SCHEMA RDB$SCHEMA
>              AUTHORIZATION SQL_SAMPLE
>              CHARACTER LENGTH CHARACTERS
>              DEFAULT CHARACTER SET DEC_KANJI
>              ALIAS RDB$DBHANDLE;

>     /* If you do not specify character sets in the DECLARE ALIAS statement, SQL
>     *  uses the character sets of the compile-time database.
>     */
>     EXEC SQL DECLARE ALIAS FILENAME MIA_CHAR_SET;

>     int      SQLCODE;

>     /* Because the default character set is DEC_KANJI, you do not need to qualify
>     *  the variable dec_kanji_p with the character set, but you must declare
>     *  char in lowercase.
>     */
>     char  dec_kanji_p[31];

>     /* When you declare a parameter with lowercase char, SQL considers the
>     *  character set unspecified and allocates single-octet characters.
>     */
>     char  english_p[31];

>     /* When you specify the character set, SQL allocates single- or multi-octet
>     *  characters, depending upon the character set.
>     */
>     char  CHARACTER SET DEC_MCS  french_p[31];
>     char  CHARACTER SET KANJI    japanese_p[31];
>        .
>        .
>        .

>     /* Select one row from the COLOURS table. */
>     EXEC SQL SELECT ENGLISH, FRENCH, JAPANESE, ROMAJI,
>                     KATAKANA, HINDI, GREEK, ARABIC, RUSSIAN
>              INTO :english_p, :french_p, :japanese_p, :dec_kanji_p,
>                   :katakana_p, :devanagari_p, :isolatingreek_p,
>                   :isolatinarabic_p, :isolatincyrillic_p
>              FROM COLOURS LIMIT TO 1 ROW;

>          if (SQLCODE != 0)
>              SQL$SIGNAL();

>     printf ("\nENGLISH: %s", english_p);
>     printf ("\nFRENCH: %s", french_p);
>     printf ("\nJAPANESE: %s", japanese_p);
>     printf ("\nROMAJI: %s", dec_kanji_p);
>     printf ("\nKATAKANA: %s", katakana_p);
>     printf ("\nHINDI: %s", devanagari_p);
>     printf ("\nGREEK: %s", isolatingreek_p);
>     printf ("\nARABIC: %s", isolatinarabic_p);
>     printf ("\nRUSSIAN: %s", isolatincyrillic_p);

>     EXEC SQL   ROLLBACK;
>     }

# DECLARE PROCEDURE文

> データベース定義文で使用するプロシージャ・インタフェースを宣言します。

> DECLARE PROCEDURE文の詳細は、「DECLAREルーチン文」を参照してください。プロシージャ宣言の詳細は、「DECLAREルーチン文」を参照してください。

# DECLAREルーチン文

> データベース定義文で使用するルーチン・インタフェースを宣言します。ルーチンはファンクションかプロシージャのいずれかです。

> 宣言されたルーチンは、CREATE TABLE文、CREATE VIEW文およびCREATE MODULE文などのDDL文のファンクションまたはプロシージャに対するコールのテンプレートとして動作します。テンプレートによってRdbは、ルーチンに正しく名前が付けられており、正しい数のパラメータが渡されており、さらにそのパラメータに互換性のある引数が渡されていることが検証できます。ファンクションでは、返されたデータ型を使用して、COMPUTED BY、AUTOMATICおよびその他の格納された値式のデータ型を計算します。

## 環境

> DECLAREルーチン文は次の環境で使用できます。

> - 対話型SQL内

> - 動的SQLで動的に実行される文として

## 形式

## 引数

> ### DEFAULT value-expr

> INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。

> ### FUNCTION

> ファンクション定義を宣言します。

> このファンクションはINパラメータのリストをオプションで受け入れ、常に値を返し、値式の要素として名前で参照されます。

> ### LANGUAGE SQL

> ルーチンをコールする言語を指定します。

> ### mechanism-clause

> 外部ルーチンの受渡しメカニズムを定義します。次のリストでは、受渡しメカニズムについて説明します。

> - BY DESCRIPTOR
>   『OpenVMS Calling Standard』を実装した言語コンパイラでコンパイルしたルーチンに対して、文字データをパラメータ・アクセス・モードで渡すことができます。

> - BY LENGTH
>   LENGTH受渡しメカニズムは、DESCRIPTOR受渡しメカニズムと同一のものです。

> - BY REFERENCE
>   実際のデータへの参照として、パラメータ・アクセス・モードでデータを渡すことができます。
>   これはパラメータのデフォルトの受渡しメカニズムです。また、文字データを返すファンクション値のデフォルトの受渡しメカニズムでもあります。

> - BY VALUE
>   データを値として、INパラメータ・アクセス・モードでルーチンに渡し、ファンクションで値を返すことができます。
>   これは文字以外のデータを返すファンクション値のデフォルトの受渡しメカニズムです。

> ### parameter-list

> ルーチンのオプションのパラメータです。それぞれのパラメータについて、パラメータ・アクセス・モード（IN、OUTおよびINOUT）、パラメータ名、データ型、受渡しメカニズム（DESCRIPTOR、LENGTH、REFERENCEまたはVALUEによる）を指定できます。

> パラメータ・アクセス・モード（IN、OUTおよびINOUT）はオプションであり、パラメータへのアクセス方法（読取り、書込み、またはその両方）を指定します。INは読取り専用、OUTは書込み専用、INOUTは読取りおよび書込みを表します。パラメータ・アクセス・モードはINにデフォルト設定されます。

> INパラメータ・アクセス・モードのみ、ファンクションに対してパラメータで指定できます。いずれかのパラメータ・アクセス・モード（IN、OUTおよびINOUT）を、プロシージャに対してパラメータで指定できます。

> パラメータ名には、接頭辞としてコロン（:）が付きます。パラメータ名はルーチン・パラメータ内で一意である必要があります。

> データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。

> パラメータは、LIST OF BYTE VARYINGデータ型としては宣言できません。

> ### PROCEDURE

> プロシージャ定義を宣言します。

> このプロシージャはIN、OUTまたはINOUTパラメータのリストをオプションで受け入れ、CALL文において名前で参照されます。

> ### RETURNS result-data-type

> ### RETURNS domain-name

> ファンクション（戻り）値について説明します。データ型と受渡しメカニズム（BY DESCRIPTOR、LENGTH、REFERENCEまたはVALUE）を指定できます。定義では、ファンクション値はOUTアクセス・モード値です。

> データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。

> ファンクション値は、LIST OF BYTE VARYINGデータ型としては宣言できません。

> ### routine-name

> 外部ルーチン名です。この名前は外部ルーチンおよびスキーマのストアド・ルーチンで一意にする必要があり、別名で、または（マルチスキーマ・データベースの場合は）スキーマ名で修飾できます。

> ### STORED NAME IS identifier

> マルチスキーマ・データベースに定義する際、ルーチンへのアクセスに使用される名前です。ストアド名を使用すると、1つのデータベース内では複数のスキーマを認識しないインタフェースを使用して、マルチスキーマ定義にアクセスできます。複数のスキーマに対応しないデータベース内では、ルーチンのストアド名は指定できません。ストアド名の詳細は、第2.2.18項を参照してください。

## 使用方法

> - 同じルーチン名で追加のDECLARE文が実行される場合は、既存の定義と同じである必要があります。

> - CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文を使用して作成されるルーチンは、パラメータ数、データ型（ドメインは基本データ型に置換可能、基本データ型はドメインに置換可能）、受渡しメカニズム（BY VALUE、BY REFERENCE、BY LENGTH、BY DESCRIPTOR）およびモード（IN、OUTおよびINOUT）が正確に一致する必要があります。

> - パラメータにDEFAULT句を指定して、ルーチンの最小および最大のパラメータ数を計算できるようにする必要があります。ただし、このDEFAULT値は使用されず、NULL、つまりプレースホルダとして指定される場合があります。

> - 宣言されたルーチンは、CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文に置換されるまで、セッションの一部分として残ります。
>   CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文がロールバックされた場合、置換される宣言ルーチンも削除されます。したがって、そのような場合は新しいDECLAREが必要になります。

> - CREATE文で実際のルーチン本体（ストアドまたは外部）が定義される前にセッションが切断された場合、そのようなルーチンを参照するデータベース・オブジェクトを使用しようとすると失敗します。
>   これはDROP ... CASCADEの使用後に確認される動作と類似しています。つまり、これらのオブジェクトを作成することによって修正する必要がある未解決の参照があります。

> - SQL EXPORT、IMPORTおよびRMU Extractなどのツールは、DECLAREルーチン機能を使用して、生成されるデータベース定義操作での前方参照を可能にします。
>   RMU Extractの場合は、/ITEM=FORWARD_REFERENCE修飾子を使用してDECLARE文の出力を有効にする必要があります。SQL EXPORTの場合、これがデフォルト設定であり、EXPORTコマンドまたはIMPORTコマンドでNO FORWARD_REFERENCES句を使用して無効にできます。

## 例

> 例1: ドメインの定義および外部ファンクションの参照

>     SQL> create domain MONEY as integer (2);
>     SQL>
>     SQL> create function INTEREST_PAID
>     cont>    (in :amt MONEY)
>     cont>    returns MONEY;
>     cont>    external
>     cont>       language C
>     cont>       parameter style GENERAL;
>     SQL>
>     SQL> alter domain MONEY
>     cont>    add
>     cont>       check (INTEREST_PAID (value) > 0)
>     cont>       not deferrable;

> ALTER DOMAINが完了すると、もう片方の前にファンクションもドメインも定義できません。次は、RMU Extractコマンドからの出力の実行結果の一部を示しています。

>     SQL> create domain MONEY
>     cont>     INTEGER (2)
>     cont>     check((INTEREST_PAID(value) > 0))
>     cont>     not deferrable;
>     %SQL-F-RTNNOTDEF, function or procedure INTEREST_PAID is not defined
>     SQL>
>     SQL> commit work;
>     SQL> create function INTEREST_PAID (
>     cont>     in    :AMT
>     cont>         MONEY
>     cont>         by reference)
>     cont>     returns
>     cont>         MONEY by value
>     cont>     language SQL;
>     cont>     external
>     cont>         language C
>     cont>         parameter style GENERAL
>     cont>     deterministic
>     cont>     called on null input
>     cont>     ;
>     %SQL-F-NO_SUCH_FIELD, Domain MONEY does not exist in this database or schema
>     SQL> commit work;

> RMU Extractでは、次のようにFORWARD_REFERENCES項目をコマンドラインに追加することによってこの問題を回避しています。

>     $ RMU/EXTRACT/ITEM=(ALL,FORWARD_REFERENCES) databasename/OUTPUT=script.SQL

> スクリプトにはこれでファンクションINTEREST_PAIDの前方宣言が含まれるため、スクリプトの実行は成功します。

>     SQL> declare function INTEREST_PAID (
>     cont>     in    :AMT
>     cont>         INTEGER (2))
>     cont>     returns
>     cont>         INTEGER (2)
>     cont>     ;
>     SQL>
>     SQL> create domain MONEY
>     cont>     INTEGER (2)
>     cont>     check((INTEREST_PAID(value) > 0))
>     cont>     not deferrable;
>     SQL>
>     SQL> commit work;
>     SQL> create function INTEREST_PAID (
>     cont>     in    :AMT
>     cont>         MONEY
>     cont>         by reference)
>     cont>     returns
>     cont>         MONEY by value
>     cont>     language SQL;
>     cont>     external
>     cont>         language C
>     cont>         parameter style GENERAL
>     cont>     deterministic
>     cont>     called on null input
>     cont>     ;
>     SQL> commit work;

# DECLARE STATEMENT文

> 動的SQLのPREPARE文で後から使用する文名を記録します。SQLでは、DECLARE STATEMENT文は不要で、そのプリコンパイル時にコードは生成されません。これらは完全にオプションです。

## 環境

> DECLARE STATEMENT文はプリコンパイルするホスト言語プログラムでのみ発行できます。

## 形式

## 引数

> ### statement-name STATEMENT

> 次のいずれかの埋込み動的文で後から参照する文の名前を指定します。

> - PREPARE

> - DECLARE CURSOR

> - DESCRIBE

## 例

> 例1: PL/Iプログラムでの文名の宣言

> この例は、文名DYNAMIC_STATEMENTを宣言するプログラム行を示しています。この例の後の行ではDECLARE CURSOR文、PREPARE文およびDESCRIBE文がDYNAMIC_STATEMENT文を参照する方法を示しています。明示的に文を宣言する必要がないため、DECLARE STATEMENT文は常にオプションです。

>     EXEC SQL DECLARE DYNAMIC_STATEMENT STATEMENT;
>     /* Declare the SQL Communications Area. */
>     EXEC SQL INCLUDE SQLCA;
>     /* Declare the SQL Descriptor Area. */
>     EXEC SQL INCLUDE SQLDA;

>     /* The program declares the host language variable
>        STATEMENT_STRING and stores in it the
>        character string containing a SELECT
>        statement to be executed dynamically. */
>                     .
>                     .
>                     .
>     EXEC SQL DECLARE CURSOR1 CURSOR FOR DYNAMIC_STATEMENT;
>     EXEC SQL PREPARE OBJECT_STATEMENT FROM STATEMENT_STRING;
>     EXEC SQL DESCRIBE OBJECT_STATEMENT INTO SQLDA;

>     /* The program sets up pointers in the
>        SQLDATA field of the SQLDA to the data
>        area (host language variables or dynamic
>        memory, for example) to receive the data
>        from the cursor. */
>                     .
>                     .
>                     .
>     EXEC SQL OPEN CURSOR1;

>     DO WHILE (SQLCODE = 0);
>             EXEC SQL FETCH CURSOR1 USING DESCRIPTOR SQLDA;

>     /* The program prints or otherwise
>     processes rows of the result tables. */
>                     .
>                     .
>                     .

>     END;

>     EXEC SQL CLOSE CURSOR1;

# DECLARE TABLE文

> プログラムで明示的に表定義またはビュー定義を宣言します。DECLARE TABLE文で名前を付けた表では、明示的な宣言と定義を比較するためのスキーマのチェックは実行されません。

> 明示的な表宣言は次のような場合に便利です。

> - プログラムのソース・コードの定義を記録する場合

> - SQLのプログラムのプリコンパイル時に存在しない、次のような表を参照可能にする場合

>   - プログラムの他のモジュールで作成された表

>   - 動的に作成された表

> - プリコンパイラのパフォーマンスを向上させる場合（SQLではスキーマにアタッチして表定義を取得する必要がないため）

> - プログラムが表からの値の保持または表への値の保持に使用するホスト構造体に宣言が正しく対応しているかどうかのチェックを簡易化する場合

> - プログラムが一部の列しか使用する必要がない場合に、表のスキーマ定義に含まれている列のサブセットのみを宣言する場合

## 環境

> DECLARE TABLE文は次の環境で使用できます。

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - コンテキスト・ファイル内

> - SQLモジュールのDECLAREセクションの一部として

## 形式

## 引数

> ### character-set-name

> 有効なキャラクタ・セット名です。キャラクタ・セットの詳細は、第2.1節を参照してください。

> ### col-constraint

> 列制約です。列制約の詳細は、「CREATE TABLE文」を参照してください。

> ### column-name

> 定義する列の名前です。

> ### data-type

> 定義する列のデータ型です。データ型の詳細は、第2.3節を参照してください。

> ### date-time-data-types

> 日付、時間および間隔のデータ型です。日時データ型の詳細は、第2.3.2項を参照してください。

> ### declare-col-definition

> 表の列に対する定義です。列定義は、スキーマの表定義に対応する必要があります。

> 列定義の詳細は、「CREATE TABLE文」を参照してください。

> ただし、DECLARE TABLE文ではドメイン名を参照できません。定義がドメイン名を参照する表の場合、ドメインのデータ型とサイズをドメイン名のかわりに使用する必要があります。

> ### frac

> ### interval-qualifier

> ### prec

> ### seconds-prec

> 日時データ型の精度を指定します。詳細は、第2.3.2項を参照してください。

> ### references-clause

> 詳細は、「CREATE TABLE文」を参照してください。

> ### sql-and-dtr-clause

> オプションのSQLおよびDATATRIEVEフォーマット句です。フォーマット句の詳細は、第2.5節を参照してください。

> ### table-name

> ### view-name

> 宣言する表定義またはビュー定義の名前です。

> ### table-constraint

> 表全体に適用される制約を定義します。表制約の指定方法の詳細は、「CREATE TABLE文」を参照してください。

## 使用方法

> SQLでは、埋込みSQL文のプリコンパイル、または表を参照するモジュール・プロシージャの処理の際に、DECLARE TABLE文の宣言を使用します。したがって、宣言の列はスキーマ定義の列と一致する必要があります。ただし、DECLARE TABLE文の宣言が対応している表定義またはビュー定義は、プログラムがDECLARE TABLE文を発行するまでは存在している必要がありません。プログラムが表を作成できるのは宣言された後です。

## 例

> 例1: COBOLプログラムでの表EMPLOYEESの宣言

>     EXEC SQL
>     DECLARE EMPLOYEES TABLE
>         (EMPLOYEE_ID                      CHAR (5)
>            CONSTRAINT     EMP_EMPLOYEE_ID_NOT_NULL
>            NOT NULL,
>          LAST_NAME                        CHAR (14),
>          FIRST_NAME                       CHAR (10),
>          MIDDLE_INITIAL                   CHAR (1),
>          ADDRESS_DATA_1                   CHAR (25),
>          ADDRESS_DATA_2                   CHAR (25),
>          CITY                             CHAR (20),
>          STATE                            CHAR (2),
>          POSTAL_CODE                      CHAR (5),
>          SEX                              CHAR (1),
>            CONSTRAINT     EMP_SEX_VALUES
>            CHECK          (
>                           SEX IN ('M', 'F') OR SEX IS NULL
>                           ),
>          BIRTHDAY                         DATE ,
>          STATUS_CODE                      CHAR (1)
>            CONSTRAINT     EMP_STATUS_CODE_VALUES
>            CHECK          (
>                           STATUS_CODE IN ('0', '1', '2')
>                           OR STATUS_CODE IS NULL
>                           )
>          )
>     END_EXEC

# DECLARE TRANSACTION文

> デフォルトのトランザクションの特性を指定します。トランザクションとは、その変更を永続化できる、または1つの単位としてのみ元に戻せる文の集合です。

> トランザクションは、COMMIT文またはROLLBACK文で終了します。COMMIT文でトランザクションを終了する場合、文によるデータベースへのすべての変更は永続化されます。ROLLBACK文でトランザクションを終了する場合、文は有効になりません。

> DECLARE TRANSACTION文で指定された特性は、別のDECLARE TRANSACTION文を発行するまで、（SET TRANSACTION文またはSTART TRANSACTION文によって開始されたものを除き）すべてのトランザクションに影響します。SET TRANSACTION文またはSTART TRANSACTION文に指定された特性は、そのトランザクションにのみ影響します。

> DECLARE TRANSACTION文ではトランザクションは開始されません。DECLARE TRANSACTION文で行われた宣言は、SQLで新規トランザクションが開始されるまで有効になりません。SQLでは、DECLARE TRANSACTION文、COMMIT文またはROLLBACK文に続く最初の実行可能データ操作文またはデータ定義文で新規トランザクションが開始されます。（COMMIT文またはROLLBACK文に続く）データ定義文の場合、直前に終了したトランザクションに対して宣言したトランザクション特性は次に開始するトランザクションに適用されます。

> DECLARE TRANSACTION文に加えて、次の2つの方法のいずれかでトランザクション特性を指定できます。

> - SET TRANSACTION文またはSTART TRANSACTION文を指定した場合、文の宣言は即時に有効になり、新規トランザクションが開始されます。

> - 明示的にトランザクションを宣言または設定せずに、データを取得および更新できます。DECLARE TRANSACTION文、SET TRANSACTION文またはSTART TRANSACTION文を省略した場合、COMMIT文またはROLLBACK文に続く最初の実行可能データ操作文またはデータ定義文で（読取り/書込みオプションを使用して）自動的にトランザクションが開始されます。

> SET TRANSACTION文またはSTART TRANSACTION文のかわりにDECLARE TRANSACTION文を使用するタイミングの例は、「使用方法」を参照してください。

> DECLARE TRANSACTION文で、次のような多数のオプションを指定できます。

> - トランザクション・モード（READ ONLY/READ WRITE/BATCH UPDATE）

> - ロック指定句（RESERVINGオプション）

> - 待機モード（WAIT/NOWAIT）

> - 分離レベル

> - 制約評価の指定句

> - トランザクションに関与する各データベースのすべての先行オプションの複数セット（ON句）

## 環境

> DECLARE TRANSACTION文は次の環境で使用できます。

> - 対話型SQL内

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - コンテキスト・ファイル内

> - SQLモジュールのDECLAREセクションの一部として

> - CREATE MODULE文のモジュール・ヘッダーの一部として

> - 動的SQLで動的に実行される文として

> ホスト言語プログラムでは、個別にコンパイルされた各ソース・ファイルで1つのDECLARE TRANSACTION文のみを設定できます。詳細は、「使用方法」を参照してください。

> DECLARE TRANSACTION文は、標準SQL構文の拡張機能です。プログラムが標準SQL構文に準拠する必要がある場合は、コンテキスト・ファイルに配置することによってDECLARE TRANSACTION文を分離できます。コンテキスト・ファイルの詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

## 形式

## 引数

> DECLARE TRANSACTION文の引数はSET TRANSACTION文の引数と同じです。両方の文の引数の詳細は、「SET TRANSACTION文」を参照してください。

## デフォルト

> DECLARE TRANSACTION文のデフォルトはSET TRANSACTION文のデフォルトと同じです。詳細は、「SET TRANSACTION文」を参照してください。

> 通常は、デフォルトのトランザクション特性に依存しないでください。読取り/書込み、読取り専用またはバッチ更新のオプション、RESERVING句の表のリスト、各表の共有モードおよびロック・タイプを指定して、明示的なDECLARE TRANSACTION文を使用します。DECLARE TRANSACTION文が具体的になるほど、データベース操作が効率的になります。

> DECLARE TRANSACTION文で指定された特性を使用してトランザクションが開始されると、DECLARE TRANSACTION文で指定されていないトランザクション特性は、SQLのデフォルトを取ります。これは、DECLARE TRANSACTIONで指定されていない特性が、前のSET TRANSACTION文またはDECLARE TRANSACTION文で指定されていた場合にも該当します。

## 使用方法

> 次の点はDECLARE TRANSACTIONに固有です。DECLARE TRANSACTION文とSET TRANSACTION文に共通の使用方法は、「SET TRANSACTION文」を参照してください。

> - DECLARE TRANSACTION文は非実行可能文であるため、トランザクションは開始されません。（DECLARE TRANSACTION文での宣言が有効になるのは、新規トランザクションの開始時、つまり、DECLARE TRANSACTION文、COMMIT文またはROLLBACK文に続く最初の実行可能なデータ操作文またはデータ定義文の実行時です。）
>   ホスト言語ソース・ファイルまたはSQLモジュールには、1つのDECLARE TRANSACTION文のみを適用できます。SET TRANSACTION文を使用して、DECLARE TRANSACTION文を使用して最初に指定されたプログラムのトランザクション特性を変更します。
>   DECLARE TRANSACTION文には、次の利点があります。

>   - 対話型SQLセッション、プログラム内のモジュールまたは単一ホスト言語ファイル、またはモジュールから動的に実行される任意の文についてトランザクションのデフォルトを確立できます。たとえば、対話型SQL環境を設定するために作成するSQLINI.SQLファイルには、DECLARE TRANSACTION READ ONLYを指定できます。
>     対話型SQLでは、DECLARE TRANSACTION文によって指定される特性は、別のDECLARE TRANSACTION文を入力するまで有効です。（SET TRANSACTION文が後ろに続くCOMMIT文またはROLLBACK文により、別の特性を使用してトランザクションが開始される場合がありますが、暗黙的に開始される後続のトランザクションには、最後のDECLARE TRANSACTION文に指定されている特性が使用されます。）
>     ただし、SET TRANSACTION文を使用して特性を指定する場合、これらの特性はこのトランザクションにのみ適用されます。これらの特性を再確立するには、この文をすべてのCOMMIT文またはROLLBACK文の後で再入力する必要があります。
>     次の順序は、DECLARE TRANSACTION文の後ろに続くSET TRANSACTION文を示しています。SET TRANSACTION文の後ろにはROLLBACK文が続いています。