[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
&br;
----
*Firebird SQL リファレンス:CONNECT系,SET SQL DIALECT系 [#cac8596a]

#contents

----
&br;
&aname(connect);
*CONNECT [#k444c8ec]
 データベースに接続します。SQLで使用可能です。また、isqlではCONNECTの
サブセットが使用できます。~
 接続のキャラクタセットは、CONNECT の前に SET NAMES で設定したものとなり
ます。日本語を取り扱う場合には、事前に設定を行う必要があるかもしれません。
特に、データベース内でキャラクタセットを明示している場合には必須です。~
 この文書は、公開されているIB6のSQLレファレンスを基とし、1.5.1までの
各リリースノートにおける追加内容に関して反映・統合されています。~

**構文 [#gc87ea24]

isql(サブセット)形式:

 CONNECT 'filespec' [USER 'username'][PASSWORD 'password']
    [CACHE int] [ROLE 'rolename']
&br;

SQL形式:

 CONNECT [TO] {ALL | DEFAULT} <config_opts>
     | <db_specs> <config_opts> [, <db_specs> <config_opts>...];
&br;

 <db_specs> = dbhandle | {'filespec' | :variable} AS dbhandle

 <config_opts> = [USER {'username' | :variable}]
     [PASSWORD {'password' | :variable}]
     [ROLE {'rolename' | :variable}]
     [CACHE int [BUFFERS]]
&br;
&br;
|引数|説明|h
|{ALL|DEFAULT}|SET DATABASEで指定したすべてのデータベースに接続します。CONNECT TO ALL と指定した場合は、すべてのデータベースに対して影響を与えます。|
|'filespec'|データベースのファイル名です。パスやノードの指定を含むことが出来ます。空白文字を含む場合には、シングルクォーテーションで囲む必要があります。&br;(FB1.5以降では、データベースのaliases.confで定義したエイリアスを使用することも出来ます。)|
|dbhandle|事前に SET DATABASE で宣言したデータベースハンドルです。埋め込みSQLで使用可能ですが、isqlでは使用できません。|
|:variable|ホスト言語の変数で、データベース名やユーザー名パスワード等の指定を行います。埋め込みSQLで使用可能ですが isql では使用できません。|
|AS dbhandle|宣言されたデータベースハンドルにデータベースの接続を割当てます。埋め込みSQLで使用可能ですが isql では使用できません。|
|USER {'username'|:variable}|文字列もしくはホスト変数で指定されたユーザー名でデータベースに接続します。サーバは、ユーザー名をセキュリティデータベースと照合します。|
|PASSWORD {'password'|:variable}|データベース接続のためのパスワードを、文字列もしくはホスト変数により最大8文字で指定します。サーバは、ユーザー名とパスワードをセキュリティデータベースと照合します。|
|ROLE {'rolename'|:variable}|データベース接続のためのロール名を、文字列もしくはホスト変数により最大32文字で指定します。ユーザーは、ロール特権を得るためには事前にロールのメンバーシップを与えられなければなりません。ROLE節が指定されれば、そのメンバーシップに関係なく接続時にはその特権が与えられます。1回の接続では1つのロールしか使用できません。変更するには再接続を行う必要があります。|
|CACHE int [BUFFERS]|データベース接続のキャッシュバッファサイズを設定します。指定は現在のページサイズ単位となり、整数で指定します。&br;デフォルト値は256です。&br;最大サイズはシステムに依存します。&br;※filespecでのキャッシュサイズ指定は使用しないで下さい。|

**詳細の説明 [#p7551be6]
&br;
-データベースデータストラクチャを初期化します。~

&br;
-データベース本体があるノード(ローカルデータベース)もしくは、
別のノード(リモートデータベース)を指定します。データベースエンジンがアクセス
できない場所が指定された場合には、エラーが発生します。~

&br;
-データベース接続のためのユーザー名、パスワード、ロールなどのうち、必要な
ものを選択して指定します。PCクライアントは、常に正しいユーザー名とパスワード
を送信しなければなりません。データベースエンジンは、パスワードの最初の8文字
のみを認識します。~
&br;
 ユーザーが環境変数の ISC_USER と ISC_PASSWORD を設定し、さらにそこで設定
されたユーザーが security.fdb または isc4.gdb に存在しない場合は、ローカル
サーバマネージャーから、次のようなエラーを受取るはずです。~
 "undefined user name and password.”(未定義のユーザーとパスワードです。)~
 サーバマネージャによって行われる自動接続は、ユーザーのセキュリティ操作を
バイパスします。~

&br;
-データベースへの接続時には次のことが行われます。~
1. ヘッダページ部分のベリファイ~
2. 既存データベースの存在チェック~
3. バージョンチェック。オンディスクストラクチャ(ODS)にはデータベースの
バージョン番号があるので、データベースエンジンが扱えるバージョンである
かチェックします~
 異常があった場合、データベースエンジンはエラーを返します。~

&br;
-必要な場合は、SET DATABASE を使用してデータベースハンドルを設定しておきます。~

&br;
-データベース接続のために、指定したキャッシュバッファが確保されます。~


&br;
-(埋め込みSQLなどで)SQLを使用するプログラムでは、CONNECT でデータベースに
接続する前に SET DATABASE を行う必要があります。isql では、SET DATABASE は
使用しません。~

&br;
-(埋め込みSQLなどで)SQLを使用するプログラムでは、CONNECT 文で複数の
データベース接続を行えますが、接続ごとの文を用意することにより、プログラムの
可読性が向上します。~

&br;
-CONNECTでデータベースに接続するとき、デフォルトのキャラクタセットは(NONE)
となります。キャラクタセットを指定して接続したい場合は、事前に、SET NAMES 文
を使用して設定します。~

&br;
-(埋め込みSQLなどで)SQLを使用するプログラムではデフォルトのキャッシュサイズ
は75ですが、CACHEオプションによりシステムで最大限利用可能なサイズまでの量が
確保できます。このオプションは以下のように使用できます。~
--CONNECT文で示された全データベース接続リストの中で、指定サイズのキャッシュを
持っていないものに新しいデフォルトサイズを設定します。~
--1つのデータベース接続を使用するプログラムのキャッシュサイズを設定します。
--デフォルト値は変更せずに、1つのデータベース接続のキャッシュサイズのみを
変更します。~

 接続が維持されている限り、そのキャッシュサイズは変更されません。
データベース接続がマルチクライアント・サーバ接続で行われている場合、すべて
の接続が終了するまでキャッシュサイズの増加は行われません。キャッシュサイズ
の減少は、すべてのデータベース接続が終了するまで行われません。~

&br;

-isqlでは、データベースファイル名、ユーザー名、パスワードを指定する CONNECT
のサブセットが使用できます。また、isqlでは同時に複数のデータベースに接続する
ことは出来ません。新しいCONNECT文を使用すると、それまでの接続は自動的に切断
されます。~

**用例 [#t41d3c72]
-isqlで、データベースを開く例です。

 CONNECT 'employee.fdb' USER 'ACCT_REC' PASSWORD 'peanuts';

-isqlで、キャラクタセットをシフトJISに設定してデータベースを開く例です。
日本語を正しく扱うには、''事前に''キャラクタセットを設定した方が良いです。

 SET NAMES SJIS_0208;
 CONNECT 'employee.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

-埋め込みSQLでの使用例です。データベースハンドルを使用し、パラメータはホスト
変数で与えています。

 EXEC SQL
 SET DATABASE DB1 = 'employee.fdb';
 
 EXEC SQL
 CONNECT :db_file AS DB1;

-埋め込みSQLでの使用例です。accounts.fdb への接続でキャッシュバッファサイズ
を150に設定しています。

 EXEC SQL
 CONNECT 'accounts.fdb' CACHE 150;

-埋め込みSQLでの使用例です。事前に SET DATABASE で指定したすべてのデータベース
に対し、指定したユーザー名で接続します。

 EXEC SQL
 CONNECT ALL USER 'ACCT_REC' PASSWORD 'peanuts'
 CACHE 50;

-埋め込みSQLでの使用例です。キャッシュサイズを、employee.fdb は 80、
employee2.fdbはデフォルトの 75 にします。

 EXEC SQL
 CONNECT 'employee.fdb' CACHE 80, 'employee2.fdb';

-埋め込みSQLでの使用例です。接続するすべてのデータベースのキャッシュサイズ
を 50 にします。

 EXEC SQL
 CONNECT ALL CACHE 50;

-埋め込みSQLでの使用例です。キャッサイズを各々 80 にします。

 EXEC SQL
 CONNECT EMP1 CACHE 80, EMP2 CACHE 80;

-埋め込みSQLでの使用例です。ホスト変数で指定した2つのデータベースに対し、
別々のユーザーとして接続しています。

 EXEC SQL
 CONNECT
   :orderdb AS DB1 USER 'ACCT_REC' PASSWORD 'peanuts',
   :salesdb AS DB2 USER 'ACCT_PAY' PASSWORD 'payout';

**参照 [#s4284111]
[[DISCONNECT>#disconnect]] , [[SET DATABASE>#set_database]] ,
[[SET NAMES>#set_names]]
&br;
&br;
 キャッシュバッファに関するより詳細は Data Definition Guide の cache buffers
を、データベースセキュリティとisqlに関するより詳細は、Operations Guide を参照
して下さい。

&br;
&br;
----
&br;
&br;
&aname(disconnect);
*DISCONNECT [#i984caa6]
 データベースとの接続を切断します。SQLで使用できます。
isqlでは使用できません。

**構文 [#hf99e041]

 DISCONNECT {
     {ALL | DEFAULT} | dbhandle [, dbhandle] …]
 } ;

&br;
&br;
|引数|説明|h
|ALL|DEFAULT|どちらを指定しても、すべてのデータベース接続を切断します。|
|dbhandle|事前に宣言したデータベースハンドルを指定して、切断する接続を指定します。|


**詳細の説明 [#od2ec64c]
 DISCONNECTは、すべてまたはデータベースハンドルで指定したデータベース接続を
切断し、その接続で使用されたリソースを解放します。gpre で -manual オプション
が指定されていないかぎり、デフォルトのトランザクションをコミットします。
デフォルト以外のトランザクションはコミットを行わず、エラーを返します。~
&br;
 DISCONNECTによる切断を行う前に、接続中であるデータベースのトランザクション
に対し、コミットまたはロールバックを行ってください。~
&br;
 DISCONNECTによって切断されたデータベースに再接続するには、再度 CONNECT を
行う必要があります。~
&br;

**用例 [#w382afbe]
すべて、埋め込みSQLの例です。
-すべてのデータベース接続を切断します。

 EXEC SQL
 DISCONNECT DEFAULT;

 EXEC SQL
 DISCONNECT ALL;

-指定したデータベースハンドルの接続を切断します。

 EXEC SQL
 DISCONNECT DB1;

 EXEC SQL
 DISCONNECT DB1, DB2;

**参照 [#sd084f2d]
 COMMIT , [[CONNECT>#connect]] , ROLLBACK , [[SET DATABASE>#set_database]]

&br;
&br;
----
&br;
&br;
&aname(set_database);
*SET DATABASE [#p211fa27]
 データベースへアクセスするためのデータベースハンドルを宣言します。
SQL で使用できます。~
 Firebirdでは、スキーマ機能は実装されていませんので、DATABASE を SCHEMA
としても機能としては同じとなります。

**構文 [#z0da7b2d]

 SET {DATABASE | SCHEMA} dbhandle =
     [GLOBAL | STATIC | EXTERN][COMPILETIME][FILENAME] 'dbname'
     [USER 'name' PASSWORD 'string']
     [RUNTIME [FILENAME]
         {'dbname' | :var}
         [USER {'name' | :var} PASSWORD {'string' |:var}]
     ];

&br;
&br;
|引数|説明|h
|dbhandle|データベースハンドル。データベース指定に対するエイリアス|
|~|・プログラム中で一意である必要があります。|
|~|・以降のSQL文でデータベースハンドルが使用できるようになります。|
|GLOBAL|デフォルトです。作成した宣言は、すべてのモジュールで有効になります。|
|STATIC|宣言は、現在のモジュールでのみ有効になります。|
|EXTERN|別のモジュールで宣言したものを参照して、新しいデータベースハンドルを宣言します。|
|COMPILETIME|列参照のプリプロセッサ処理中に、使用するデータベースを認識します。|
|~|・1つのデータベースが指定されていれば、その認識は動作時とコンパイル時の両方で行われます。|
|'dbname'|データベースハンドルに割当てる、データベースファイルの設置場所とパス名です。指定方法はプラットフォームに依存します。|
|RUNTIME|プリプロセッサ処理のために指定したデータベースと、実行時に使用するデータベースの指定が異なる場合に使用します。|
|:var|ホスト言語変数により、データベースの指定やユーザー名、パスワードを与えます。|
|USER 'name'|接続するデータベースサーバが正当に認識するユーザー名です。|
|~|・データベースサーバに接続するためには、PASSWORD の指定が同時に必要です。|
|~|・PCクライアント接続のために要求されます。(他の接続の場合は、オプションです。)|
|PASSWORD 'string'|接続するデータベースサーバが正当に認識するパスワードです。|
|~|・データベースサーバに接続するためには、USER の指定が同時に必要です。|
|~|・PCクライアント接続のために要求されます。(他の接続の場合は、オプションです。)|
&br;

**詳細の説明 [#t3f77213]
 SET DATABASE は、データベースハンドルの宣言を行い、データベースの指定と
関連付けを行います。オプション指定により、コンパイル時と実行時で別の
データベースを指定することが出来ます。複数のデータベースへの接続を行う
(埋め込みSQL等を使用した)アプリケーションは、各データベースを識別する
データベースハンドルを宣言するために、SET DATABASE を必ず使用する必要が
あります。~
&br;
 「dbhandle」は、アプリケーションで定義するデータベースハンドルです。
通常、データベースハンドルの名前は、実際のデータベースの名前を省略した
ものを使用します。ここで宣言したデータベースハンドルは、以降の CONNECT,
COMMIT, ROLLBACk で使用出来ます。それは、トランザクション中で2つ以上
の異なるデータベースに同じ名前のテーブルを含んでいる場合に、テーブル
の区別を行うために使用出来ます。~
&br;
 「dbname」は、データベースハンドルが実際のデータベースと接続するために
必要なファイルの指定を行うもので、内容はプラットフォームに依存します。
これは、データベースサーバが認識するファイル指定方法で記述される必要が
あります。~
&br;
 GLOBAL, STATIC, EXTERN は、データベース宣言のスコープを指定するオプション
です。デフォルトである GLOBAL は、データベースハンドルがアプリケーションの
コードの全域で使用可能とすることを宣言します。STATIC は、ハンドルの宣言を
行ったモジュールでのみ使用可能とします。EXTERN は、データベースハンドルの
宣言が、別モジュールで GLOBAL と宣言されているものを参照するということを
示します。~
&br;
 オプション、COMPILETIME と RUNTIME を使用することにより、1つのデータベース
ハンドルで、コンパイル時と実行時で別のデータベースを使用するように設定する
ことが出来ます。省略時、または COMPILETIME のみの指定を行った場合には、
データベースエンジンはプリプロセッサ処理時と実行時で同一のデータベースを使用
します。~
&br;

 USER および PASSWORD パラメータの指定は、PCクライアントアプリケーション
では必須です。しかし、他のリモート接続においてはオプションの場合もあります。
ユーザー名およびパスワードのセキュリティデータベースとの照合は、接続を行う
遠隔サーバによって行われます。

**用例 [#fd7b4d74]
 例は、すべて埋め込みSQLプログラムの場合です。~

-データベースハンドルの宣言を行います。

 EXEC SQL
 SET DATABASE DB1 = 'employee.fdb';

&br;
-コンパイル時と実行時で、別のデータベースを使用できるようにした例です。
実行時にはホスト言語変数によって指定を行います。

 EXEC SQL
 SET DATABASE EMDBP = 'employee.fdb' RUNTIME :db_name;

**参照 [#h6dd4559]
 COMMIT , [[CONNECT>#connect]] , ROLLBACK , [[SELECT]]
&br;
&br;
 さらに詳細が知りたい場合は、Operations Guide の security database を
参照して下さい。~


&br;
&br;
----
&br;
&br;
&aname(set_names);
*SET NAMES [#fe5edc97]
 以降の接続で有効になるキャラクタセットを設定します。
SQL および isql で使用できます。

**構文 [#l6f352a9]

 SET NAMES [charset | :var];

&br;
※ DSQLで使用する場合、終端文字のセミコロンは不要です。
isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
&br;
|引数|説明|h
|charset|プロセスで使用する有効なキャラクタセットの名前です。デフォルトはNONEです。|
|:var|キャラクタセット名をホスト言語変数で指定します。|
|~|・事前に宣言されたキャラクタセット名であることが必要です。|
|~|・SQLでのみ有効です。|

**詳細の説明 [#a99269df]
 SET NAMES は、以降のデータベース接続で用いられるキャラクタセットを指定
します。これを設定することにより、サーバで設定されたキャラクタセットと
クライアントアプリケーションの間で、文字コードの変換処理を行うことが可能
となります。~
&br;
 SET NAMES は、それが影響を及ぼす CONNECT 文よりも前に実行される必要が
あります。~
&br;

 組込みアプリケーションでは、SET NAMES のキャラクタセット指定をホスト変数
で行うことにより、対話的な設定も出来ます。~

&br;
 キャラクタセットの指定は、指定可能な(ソート順序に影響を与える)コレーション
オーダーのサブセットを限定します。キャラクタセットとコレーションオーダーの
指定を行うと、SELECT,INSERT,UPDATEを行うときの列データに影響を与えます。

''重要''~
 デフォルトキャラクタセットを指定しない限り、デフォルトを NONE と指定した
場合と同じになります。キャラクタセットに NONE を指定するということは、
列には「特定のキャラクタセットがない」と仮定されたことになります。その場合、
格納や取り出すときにはオリジナルのデータがそのまま使用されます。 NONE を指定
した列には、どのようなキャラクタセットのデータもロードできます。
しかし、そのデータを NONE 以外のキャラクタセットを指定した列にロードすること
は出来ません。それは、ソースからディストネーションに転送するときの文字変換が
行われないためです。したがって、大抵の場合はエラーを発生させます。~

&br;
&br;

**用例 [#b3204e21]

-埋め込みSQLを使用したプログラムで SET NAMES を使用する例です。

 EXEC SQL
 SET NAMES ISO8859_1;
 
 EXEC SQL
 SET DATABASE DB1 = 'employee.fdb';
 
 EXEC SQL
 CONNECT;

-isqlで SET NAMES を使用する例です。

 SET NAMES EUCJ_0208;
 CONNECT 'employee.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

**参照 [#f3847d4c]
 [[CONNECT>#connect]] , [[SET DATABASE>#set_database]]
&br;
&br;
 より詳細が知りたい場合は、[[キャラクタセット・データ型・権限]]や
Data Definition Guide を参照して下さい。
&br;


&br;
&br;
----
&br;
&br;
&aname(set_sql_dialect);
*SET SQL DIALECT [#a4ad65b4]
 データベースアクセス時の SQL Dialect 値を宣言します。
gpre, isql, wisql, SQL で使用可能です。~


**構文 [#lce9a08f]

 SET SQL DIALECT n;

&br;
&br;
|引数|説明|h
|n|SQL Dialect を指定します。以下の指定が可能です。|
|~|1 : InterBase5.5 以前|
|~|2 : 1から3へ移行時のフラグ|
|~|3 : Firebird/InterBase6以降。拡張された数値、DATE、TIME、TIMESTAMP型が使用できる。|
&br;

**詳細の説明 [#s8801a66]
 SET SQL DIALECT により、データベースアクセスの SQL Dialect を宣言します。~
&br;
 Dailect は、1,2,3の中から指定できます。指定を行わなかった場合、コンパイル時
に指定したデータベースの Dialect になります。宣言を行った値とデフォルトの値
が異なった場合は警告が発生しますが、デフォルト値は宣言を行った値に修正
されます。~
&br;


**用例 [#j0db0919]
 埋め込み SQL プログラムでの例です。

 EXEC SQL
 SET SQL DIALECT 3;

**参照 [#oc5585ac]
 [[SHOW SQL DIALECT>#show_sql_dialect]]

&br;
&br;
----
&br;
&br;
&aname(show_sql_dialect);
*SHOW SQL DIALECT [#w524ae44]
 現在のクライアントの SQL Dialect 設定とデータベースの SQL Dialect 値
を返します。~
 gpre, isql, wisql, SQL で使用できます。~

**構文 [#xd396bb9]

 SHOW SQL DIALECT;

**詳細の説明 [#ua86bf56]
 SHOW SQL DIALECT により、現在のクライアントの SQL Dialect 設定と、
データベースの SQL Dialect 値が得られます。得られる設定/値は、1,2,3 のうち
のどれかです。~
 詳細に関しては、[[SET SQL DIALECT>#set_sql_dialect]]を参照して下さい。

**用例 [#v5ff3010]
 埋め込み SQL プログラムでの例です。

 EXEC SQL
 SHOW SQL DIALECT;

**参照 [#y0849820]
[[SET SQL DIALECT>#set_sql_dialect]]