ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


ATTACH文

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

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

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

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

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


環境

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


形式












引数

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でいつ再使用できるかを制御します。

詳細は、第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ノード上のデータベースにアタッチするには、次の方法のいずれかを使用できます。

プロキシ・アカウント、ファイル仕様にユーザー名を埋め込む方法、または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重に囲む必要があります。

使用方法


例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項を参照してください。


使用方法


例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文は次の環境で使用できます。


形式




引数

call-argument-list

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

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

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

procedure-name

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

使用方法


例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);