ヘッダーをスキップ

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

戻る | 次へ |

# ATTACH文

> 対話型SQLまたは実行時のプログラムがアクセスするデータベースの名前およびデータ定義のソースを指定します。指定したデータベースは、現在のデータベース環境の一部になります。データベース環境とは、現在の接続の中で一意の別名を持った全データベースの集合です。

> ATTACH文を使用すると、実行時に新規データベースを追加できます。この追加によるコンパイル時の環境への影響はありません。コンパイル時の環境を指定するには、DECLARE ALIAS文を使用します。

> データ定義に使用するためにファイル名またはリポジトリ・パス名を指定できます。

> トランザクションが現在アクティブである場合、SQLでは情報メッセージが返され、指定したデータベース環境の接続へのアタッチは行われません。

> データベースが現在アタッチされている場合、別名を使用せずに別のデータベースにアタッチすると、SQLは現在のデータベース環境をデタッチし、その場所にある指定したデータベース環境にアタッチします。

## 環境

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

> - 対話型SQL内

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

> - SQLモジュールのプロシージャの一部として

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

## 形式

## 引数

> ### ALIAS alias

> データベースにアタッチする名前を指定するアタッチ式の一部に使用します。別名を指定すると、プログラムまたは対話型SQL文で複数のデータベースを参照できるようになります。

> ATTACH文で別名を指定する必要はありません。対話型SQLおよびプリコンパイルされたプログラム内のデフォルトの別名は、RDB$DBHANDLEです。SQLモジュール言語では、デフォルトはモジュール・ヘッダーに指定された別名です。ATTACH文で明示的に指定するか、任意の別名を省略することにより、デフォルトの別名を使用すると、データベースがデフォルト環境の一部になります。デフォルト・データベースを指定すると、そのデータベースを参照する文で別名の使用が不要になります。

> デフォルトの別名がすでに宣言されているときにデフォルトの別名をALIAS句に指定（または、すでに宣言されている任意の別名を指定）すると、対話型SQLでは情報メッセージが発行されます。

> 次の例では、TESTDBは最初にアタッチされたデータベースで、デフォルトの別名が使用されています。2番目にアタッチされたデータベースに別名が指定されていない場合、SQLではそのデータベースにデフォルトの別名を割り当てようとしますが、デフォルトの別名はすでに宣言されていることが検出されます。

>     SQL> ATTACH 'FILENAME testdb';
>     SQL> ATTACH 'FILENAME otherdb';
>     This alias has already been declared.
>     Would you like to override this declaration (No)? N
>     SQL-F-DEFDBDEC, A database has already been declared with the default alias
>     SQL> SHOW DATABASES;
>     Default alias:
>         Oracle Rdb database in file testdb
>     SQL> ATTACH 'FILENAME otherdb';
>     This alias has already been declared.
>     Would you like to override this declaration (No)? Y
>     SQL> SHOW DATABASES;
>     Default alias:
>         Oracle Rdb database in file otherdb

> ### attach-expression

> 環境に追加するデータベースを指定します。

> ### attach-parameter

> プリコンパイルされたSQLのホスト言語変数またはSQLモジュール言語プロシージャの仮パラメータで、接続のデータベース環境を指定します。アタッチ・パラメータには、アタッチ式が含まれている必要があります。

> ### attach-parameter-marker

> 動的SQL文で疑問符（?）によって表されるパラメータ・マーカーです。アタッチ・パラメータ・マーカーでは、接続に対するデータベース環境を指定したパラメータを参照します。アタッチ・パラメータ・マーカーには、アタッチ式が含まれるパラメータを指定する必要があります。

> ### attach-options

> 特定のデータベース・アタッチの特性を指定します。複数の句を指定できます。

> ### attach-string-literal

> 接続に対してデータベース環境を指定する文字列リテラルです。アタッチ文字列リテラルには、一重引用符で囲んだアタッチ式が含まれている必要があります。

> ### database-options

> デフォルトでは、SQLプリコンパイラにより、プログラムのコンパイル時に指定されたデータベースの型からアタッチ先となるデータベースの型が決まります。

> データベース・オプションの詳細は、第2.10節を参照してください。

> ### DBKEY SCOPE IS ATTACH

> ### DBKEY SCOPE IS TRANSACTION

> 削除された行のデータベース・キーをSQLでいつ再使用できるかを制御します。

> - デフォルトのDBKEY SCOPE IS TRANSACTIONの場合、元の行を削除したトランザクションがCOMMIT文で完了すると、ただちに削除された表の行のデータベース・キーをSQLで再使用（および新しく挿入された行を参照）できます。（元の行を削除したユーザーがROLLBACK文を入力すると、この行のデータベース・キーはSQLで再使用できなくなります。）
>   ATTACH文を入力したユーザーの接続中は、DBKEY SCOPE IS TRANSACTION句により、データベース・キーが特定のトランザクション内の同じ行のみを参照することが保証されます。

> - DBKEY SCOPE IS ATTACH句の場合、DBKEY SCOPE IS ATTACHによってアタッチされたすべてのユーザーがデータベースからデタッチされるまでは、SQLでデータベース・キーを再使用（および新しく挿入された行を参照）できません。
>   DBKEY SCOPE IS ATTACHを使用したアタッチによって、すべてのデータベース・ユーザーにこの特性を前提とすることを強制するために必要なステップは1つのみです。

> - DBKEY SCOPE IS ATTACHをサポートするために必要なオーバーヘッド領域による記憶域領域の過度な消費を防止し、新規行を格納する際のパフォーマンス問題を防止するために、DBKEY SCOPE IS TRANSACTIONの使用をお薦めします。
>   ATTACH文を入力したユーザーの接続中は、DBKEY SCOPE IS ATTACH句により、ユーザーがデータベースからデタッチされるまではデータベース・キーが同じ行を参照することが保証されます。

> 詳細は、第2.6.5項を参照してください。

> ### DISPLAY CHARACTER SET support-char-set

> Oracle RdbからSQLへ返されるテキスト文字列で想定されるキャラクタ・セットのエンコーディングおよび特性を指定します。詳細は、「CREATE DATABASE文」の「使用方法」を参照してください。

> ### FILENAME 'attach-spec'

> データベースにアクセスするために必要な完全または部分的な情報が含まれる引用符付き文字列です。

> Oracle Rdbデータベースの場合、アタッチ仕様には、.rdbファイルのファイル仕様が含まれます。

> FILENAME引数を使用する場合、データベース定義に対する変更は、リポジトリではなくデータベース・システム・ファイルにのみ入力されます。FILENAMEを指定する場合、アプリケーションは実行時にこのファイル名を使用してデータベースにアタッチされます。

> node-specおよびfile-specの詳細は、第2.2.8.1項を参照してください。

> ### literal-user-auth

> データベース（特にリモート・データベース）へのアクセスの許可に使用するユーザー名およびパスワードを指定します。

> このリテラルにより、アタッチ式でユーザー名およびパスワードの情報を明示的に指定できます。

> Oracle Rdb for OpenVMSを使用して同一クラスタ内のデータベースにアタッチする場合、ユーザー名およびパスワードを明示的に指定する必要はありません。ユーザーがデータベースにアタッチするときは毎回Oracle Rdbによって暗黙的にユーザー認証が行われます。

> ただし、Oracle Rdb for OpenVMSを使用してリモート・ノード上のデータベースにアタッチする場合は、Oracle Rdbによって提供されている方法の1つを使用してデータベースにアクセスする必要があります。

> リモートOpenVMSノード上のデータベースにアタッチするには、次の方法のいずれかを使用できます。

> - ATTACH文でユーザー名とパスワードを明示的に指定します。

> - 構成ファイルRDB$CLIENT_DEFAULTS.DATに、ユーザー名およびパスワードを明示的に指定します。次の例は、構成ファイル内に情報を組み込む方法を示しています。

>       ! User name to be used for authentication
>       SQL_USERNAME   HELENG

>       ! Password to be used for authentication
>       SQL_PASSWORD  MYPASSWORD

> - リモート・システム上のDECnetプロキシ・アカウントを使用します。

> - ファイル仕様にユーザー名とパスワードを埋め込みます。

> - RDB$REMOTEデフォルト・アカウントを使用します。

> プロキシ・アカウント、ファイル仕様にユーザー名を埋め込む方法、またはRDB$REMOTEアカウントの使用方法の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

> ### MULTISCHEMA IS ON

> ### MULTISCHEMA IS OFF

> MULTISCHEMA IS ON句を使用すると、データベースのアタッチ中にマルチスキーマ・ネーミングが有効になります。MULTISCHEMA IS OFF句を使用すると、データベースのアタッチ中にマルチスキーマ・ネーミングが無効になります。アタッチ時のデフォルトのマルチスキーマ・ネーミングには、データベース定義において指定された設定が使用されます。

> マルチスキーマ・ネーミングを使用できるのは、マルチスキーマ属性を使用して作成されたデータベースにアタッチする場合のみです。マルチスキーマ属性を使用せずに作成されたテータベースでMULTISCHEMA IS ON句を指定した場合、次の例に示すように、SQLでは次の例に示すエラー・メッセージが返されます。

>     SQL> ATTACH 'ALIAS PERS_ALIAS FILENAME personnel MULTISCHEMA IS ON';
>     %SQL-F-NOPHYSMULSCH, The physical multischema attribute was not specified for
>     the database

> ### PATHNAME path-name

> データベース定義のソースを指定するリポジトリのフルパス名または相対パス名です。PATHNAME引数を使用する場合、データベース定義に対する変更は、リポジトリとデータベース・システム・ファイルの両方に入力されます。システム上にリポジトリがあり、データ定義文を使用する予定がある場合、Oracle Rdbでは、PATHNAME引数の使用をお薦めします。

> PATHNAMEを指定する場合、アプリケーションはリポジトリから抽出されたデータベース・ファイル名にアタッチされます。

> ### PRESTARTED TRANSACTIONS ARE ON

> ### PRESTARTED TRANSACTIONS ARE OFF

> Oracle Rdbで事前起動済トランザクションを有効にするか無効にするかを指定します。

> データベースに長期間アタッチされているサーバー・プロセスがアプリケーションに使用されるためにスナップショット・ファイルが大きくなりすぎる場合、PRESTARTED TRANSACTIONS ARE OFF句を使用してください。PRESTARTED TRANSACTIONS ARE OFF句を使用する場合、SET TRANSACTION文ごとにトランザクション順序番号（TSN）を予約する必要があるために、追加のI/Oが使用されます。

> Oracle Rdbでは、ほとんどのアプリケーションについて、事前起動済トランザクションを有効にすることをお薦めします。デフォルトはPRESTARTED TRANSACTIONS ARE ONです。PRESTARTED TRANSACTIONS ARE ON句を使用する場合や、PRESTARTED TRANSACTIONS句を指定しない場合、これより前の読取り/書込みトランザクションに対するCOMMIT文またはROLLBACK文により、次のトランザクションのTSNが自動的に予約され、I/Oが削減されます。

> RDMS$BIND_PRESTART_TXN論理名を定義することにより、事前起動済トランザクションのデフォルト設定をアプリケーションの外部で定義できます。この論理名は、PRESTARTED TRANSACTION句によってオーバーライドされます。詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。詳細は、ALTER文およびCREATE DATABASE文のPRESTARTED TRANSACTIONS ARE ENABLED句に関する項も参照してください。

> ### RESTRICTED ACCESS

> ### NO RESTRICTED ACCESS

> データベースへのアクセスを制限します。これにより、データベースにアクセスしたときに、データベースから切断されるまで他のすべてのユーザーをロックアウトできます。データベースへのアクセス制限を設定するには、DBADM権限が必要です。

> 指定しない場合、デフォルトはNO RESTRICTED ACCESSです。

> ### ROWID SCOPE IS ATTACH

> ### ROWID SCOPE IS TRANSACTION

> ROWIDキーワードは、DBKEYキーワードのシノニムです。詳細は、この引数リストですでに説明したDBKEY SCOPE IS引数の項を参照してください。

> ### USER 'username'

> データベース・システムでの権限チェックに使用されるオペレーティング・システムのユーザー名を指定する文字列リテラルです。ユーザー名のリテラルは引用符で囲まれたattach-string内に含まれているため、対話型SQLではユーザー名を一重引用符で2重に囲む必要があります。

> この句では、SYSTEM_USER値式の値も設定します。

> ### USING 'password'

> USER句で指定されているユーザー名に対するユーザーのパスワードを指定する文字列リテラルです。パスワードのリテラルは引用符で囲まれたattach-string内に含まれているため、対話型SQLではユーザー名を一重引用符で2重に囲む必要があります。

## 使用方法

> - 同じOracle Rdbデータベースに2回アタッチすると、デッドロック・エラーによりSHOW文が失敗する場合があります。このエラーはCOMMIT文を発行することにより回避できます。次に例を示します。

>       SQL> ATTACH 'FILENAME corporate_data';
>       SQL> ATTACH 'ALIAS CORP2 FILENAME corporate_data';
>       SQL> SHOW DATABASES
>       Default alias:
>           Oracle Rdb database in file corporate_data
>       Alias CORP2:
>           Oracle Rdb database in file corporate_data
>       SQL> SHOW TABLES;
>       User tables in database with filename corporate_data
>            DAILY_HOURS
>            DEPARTMENTS
>            PAYROLL
>            .
>            .
>            .
>            PERSONNEL.WEEKLY_WAGES          A view.
>            RECRUITING.CANDIDATES
>            RECRUITING.COLLEGES
>            RECRUITING.DEGREES
>            RECRUITING.RESUMES

>       User tables in database with alias CORP2
>       %RDB-F-DEADLOCK, request failed due to resource deadlock
>       -RDMS-F-DEADLOCK, deadlock on record 41:413:1
>       SQL> COMMIT;
>       SQL> SHOW TABLES;
>            User tables in database with filename corporate_data
>            DAILY_HOURS
>            DEPARTMENTS
>            PAYROLL
>            .
>            .
>            .
>            User tables in database with alias CORP2
>            "CORP2.ADMINISTRATION".ACCOUNTING.DAILY_HOURS
>            "CORP2.ADMINISTRATION".ACCOUNTING.DEPARTMENTS
>            "CORP2.ADMINISTRATION".ACCOUNTING.PAYROLL
>            .
>            .
>            .
>            "CORP2.ADMINISTRATION".RECRUITING.COLLEGES
>            "CORP2.ADMINISTRATION".RECRUITING.DEGREES
>            "CORP2.ADMINISTRATION".RECRUITING.RESUMES

## 例

> 例1: 対話型SQLでのファイル名によるデータベースのアタッチとアクセス制限の指定

> この対話型SQL文では、ファイル仕様mf_personnelにより定義されたデータベースが現在の接続にアタッチされ、そのテータベースに対して別名pers_aliasが宣言されます。SHOW DATABASE文を使用してデータベース設定を表示します。

>     SQL> ATTACH 'ALIAS pers_alias FILENAME mf_personnel -
>     cont> RESTRICTED ACCESS';

> 例2: 対話型SQLでのパス名によるデータベースのアタッチ

> この対話型SQL文では、リポジトリから抽出されたデータベース・ファイル名にアタッチされます。SHOW DATABASE文を使用してデータベース設定を表示します。

>     SQL> ATTACH
>     cont> 'ALIAS PERS PATHNAME DISK3:[REPOSITORY.DEPT2]PERSONNEL';

> 例3: プログラムでのアタッチ・パラメータの使用

> このSQLモジュール言語プロシージャの抜粋では、アタッチ文字列を含むパラメータを宣言する方法を示します。パラメータに接頭辞としてコロンを付けるためには、PARAMETER COLONS句を使用してモジュールをコンパイルする必要があります。

>     PROCEDURE attach_db
>         SQLCODE
>         attach_string char(155);

>         ATTACH :attach_string;

> さらに、このプロシージャをコールするためのCプログラムを作成することもできます。アタッチ文字列を渡す行は、次のような形式で記述する必要があります。

>     main () {
>             long sqlcode;

>     attach_db( &sqlcode, "ALIAS CORP FILENAME corporate_data" );

>     /*      Now dynamic statements can refer to alias CORP        */
>     }

> 例4: ATTACH文でのユーザー名およびパスワードの明示的な指定

> 次の例は、ATTACH文でユーザー名とパスワードを明示的に指定する方法を示しています。

>     SQL> ATTACH 'FILENAME FARSID::USER1:[GREMBOWSKI.DB]MF_PERSONNEL -
>     cont>        USER ''grembowski'' USING ''mypassword''';

# BEGIN DECLARE文

> プリコンパイルされたプログラムにおけるホスト言語変数の宣言部の開始位置を区切ります。

## 環境

> BEGIN DECLARE文は、プリコンパイルするホスト言語プログラムに埋め込んで使用できます。

## 形式

## 引数

> ### BEGIN DECLARE SECTION

> ホスト言語変数宣言の開始位置を区切ります。

> ### END DECLARE SECTION

> ホスト言語変数宣言の終了位置を区切ります。

> ### ;（セミコロン）

> BEGIN DECLARE文およびEND DECLARE文の終端を表します。

> どの終端文字を使用するかは、ホスト言語変数を埋め込む言語によって異なります。次の表では、使用する終端文字を示しています。

> | 必要なSQL終端文字 |
> --- | --- | ---
> ホスト言語 | BEGIN DECLARE文 | END DECLARE文 |
> COBOL | END-EXEC | END-EXEC |
> FORTRAN | 必要なし | 必要なし |
> Ada、C、Pascal、またはPL/I | ;（セミコロン） | ;（セミコロン） |

> ### host language variable declaration

> プログラムに埋め込まれる変数の宣言です。

> ホスト言語変数定義の詳細は、第2.2.13項を参照してください。

## 使用方法

> - ANSI/ISO SQL規格で、埋込みSQL文で使用されるホスト言語変数は、埋め込まれたSQL BEGIN DECLARE...END DECLARE文のペアの内部で宣言する必要があると指定されています。アプリケーションでANSI/ISO SQLに準拠することが重要な場合は、埋込みSQL文で使用するホスト言語変数宣言をすべてBEGIN DECLARE...END DECLAREブロック内に含める必要があります。

> - SQLでは、ホスト言語変数をBEGIN DECLARE文とEND DECLAREで囲む必要はありません。ただし、次の2つの状況が存在する場合は、SQLにより警告メッセージが発行されます。

>   - BEGIN DECLARE文とEND DECLARE文で区切られたセクションがプログラムに組み込まれています。

>   - 参照するホスト言語変数がBEGIN DECLARE...END DECLAREブロックの外部で宣言されています。

> - ホスト言語変数宣言のみでなく、その他のホスト言語文もBEGIN DECLARE...END DECLAREブロック内に含めることができます。

## 例

> 例1: BEGIN...END DECLARE文内のホスト言語変数宣言

> 次の例は、Pascalプログラムの一部を示しています。この例の前半部分では、BEGIN DECLARE文とEND DECLARE文の間にホスト言語変数LNAMEが宣言されています。言語にはPascalを使用しているため、終端文字としてセミコロンが必要です。

> この例の後半部分は、1行の結果表を指定したシングルトンSELECT文です。この文により、すでに宣言されているホスト言語変数LNAMEに行内の値が割り当てられます。

>     EXEC SQL BEGIN DECLARE SECTION;
>       LNAME: packed array [1..20] of char;
>     EXEC SQL END DECLARE SECTION;
>     .
>     .
>     .

>     EXEC SQL
>     SELECT FIRST_NAME
>        INTO :LNAME
>        FROM EMPLOYEES
>        WHERE EMPLOYEE_ID = "00164";

# 単一文のCALL文

> ストアド・プロシージャを起動します。

> CREATE MODULE文でストアド・モジュールを定義する場合は、SQLによりOracle Rdbデータベースにオブジェクトとして格納されます。また、そのモジュールのプロシージャおよびファンクションもそれぞれ格納されます。Oracle Rdbデータベースに存在するモジュール・プロシージャは、ストアド・プロシージャと呼ばれます。一方、非ストアド・プロシージャは、SQLモジュール・ファイル内のデータベースの外部に存在するモジュール・プロシージャです。ストアド・プロシージャの作成方法の詳細は、「CREATE MODULE文」を参照してください。

> ストアド・プロシージャの起動に関するオプションの詳細は、「複合文のCALL文」を参照してください。

## 環境

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

> - 対話型SQL内

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

> - SQLモジュールのプロシージャの一部として

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

## 形式

## 引数

> ### call-argument-list

> コールされたストアド・プロシージャにリテラル、パラメータ値（動的実行の場合はパラメータ・マーカー）、または変数のリストを渡します。

> リテラルは、ストアド・プロシージャのINパラメータにのみ渡すことができます。リテラルをOUTパラメータまたはINOUTパラメータに渡すことはできません。

> 動的に実行されるSQL文では、単一のパラメータ・マーカー（?）を使用してメイン・パラメータおよびインジケータ・パラメータの両方を参照します。プログラムにおける静的および動的なSQL文の実行用パラメータの使用方法の詳細は、第2.2.13項を参照してください。

> ### procedure-name

> ストアド・プロシージャの名前です。

## 使用方法

> - ストアド・プロシージャの実行により例外が発生した場合、SQLでは、その例外はCALLの結果としてレポートされます。

> - 単一文CALL内のパラメータの数は、コール先のプロシージャ内のパラメータの数と一致する必要があります。

> - 単一文CALLで使用されるパラメータのデータ型は、コール先のプロシージャで使用されるデータ型と同等である必要があります。

> - 同じアプリケーションからコールされるストアド・モジュールと非ストアド・モジュールが、同じ名前を持つことはできません。アクティブな非ストアド・モジュールと同じ名前を持つストアド・モジュールを起動しようとすると、次のエラーが表示されます。

>       %RDB-E-IMP_EXC, facility-specific limit exceeded
>       -RDMS-E-MODEXTS, there is another module named SALARY_ROUTINES in this
>        database

## 例

> 例1: ストアド・プロシージャのコール

> 次の例では、ストアド・プロシージャNEW_SALARY_PROC、および単一文CALLを使用してそのストアド・プロシージャを起動する非ストアド・プロシージャCALL_NEW_SALARYの定義を示しています。

>     SQL> ! The following shows the definition of the stored procedure:
>     SQL> !
>     SQL> CREATE MODULE NEW_SALARY_PROC
>     cont>        LANGUAGE SQL
>     cont>        PROCEDURE NEW_SALARY_PROC
>     cont>                  (:ID CHAR (5),
>     cont>                   :NEW_SALARY INTEGER (2));
>     cont>         BEGIN
>     cont>              UPDATE SALARY_HISTORY
>     cont>                     SET SALARY_END = CURRENT_TIMESTAMP
>     cont>                     WHERE EMPLOYEE_ID = :ID;
>     cont>              INSERT INTO SALARY_HISTORY
>     cont>                                 (EMPLOYEE_ID, SALARY_AMOUNT,
>     cont>                                  SALARY_START, SALARY_END)
>     cont>                          VALUES (:ID, :NEW_SALARY,
>     cont>                                  CURRENT_TIMESTAMP, NULL);
>     cont>         END;
>     cont> END MODULE;
>     SQL>

> 次の例では、ストアド・プロシージャをコールする非ストアド・プロシージャが含まれたSQLモジュールの抜粋を示しています。

>        .
>        .
>        .
>     PROCEDURE CALL_NEW_SALARY
>         :ID CHAR(5),
>         :ID_IND SMALLINT,
>         :NEW_SALARY INTEGER (2),
>         :NEW_SALARY_IND SMALLINT,
>         SQLCODE;

>         CALL NEW_SALARY_PROC (:ID, :NEW_SALARY );
>        .
>        .
>        .

> 例2: 対話型SQLにおけるプロシージャのコール

> 次の例では、対話型SQLから単一文CALLを使用してストアド・プロシージャを起動する場合を示しています。

>     SQL> DECLARE :X INTEGER;
>     SQL>  BEGIN
>     cont>   SET :X = 0;
>     cont> END;
>     SQL> CALL P2 (10, :X);