CONNECT ステートメント
CONNECT ステートメントは、データベース・サーバーにアプリケーション・プロセスを接続します。 このサーバーは、プロセスの現行サーバー になります。 CONNECTステートメント Db2 for z/OS® CONNECT(タイプ2) と同等である。 クロスプラットフォーム開発のための SQL リファレンス - バージョン 6。
接続、現在のサーバー、コミット処理、分散およびリモート作業単位の詳細については、「分散リレーショナルデータベース」 を参照してください。
呼びかけ CONNECT
このステートメントは、アプリケーション・プログラムに組み込むことのみが可能です。 これは、動的に作成できない実行可能ステートメントです。 Java™では指定できません。
承認 CONNECT
このステートメント内で指定するプロセスの 1 次許可 ID、または許可 ID は、指定したサーバーへの接続を許可されている必要があります。 サーバーは、ステートメントの実行時に許可検査を行い、必要な具体的な許可を判別します。 詳細については、「認証ID」 を参照してください。
構文 CONNECT
authorization:
説明の対象: CONNECT
- TO 場所名 または ホスト変数
- ロケーション名を指定するか、またはホスト変数に含まれているロケーション名によって、サーバーを指定します。 ホスト変数を指定する場合は、以下の規則に従ってください。
- 長さ属性が 16 を超えない CHAR または VARCHAR の変数であることが必要です。 (C の NUL 終了文字ストリングの長さは 17 バイトまで可)
- 後ろに標識変数を置いてはなりません。
- ロケーション名は、ホスト変数内で左揃えにする必要があります。また、通常の ID の作成の規則に準拠している必要があります。
- ロケーション名の長さがホスト変数の長さより短い場合には、その右側に ブランクを埋め込まなければなりません。
- 小文字が含まれていてはなりません。
- SQL プロシージャー型言語アプリケーションで使用する場合、ホスト変数は修飾された SQL 変数名または修飾された SQL パラメーター名でなければなりません。
CONNECT ステートメントを実行する場合:
- ロケーション名には、ローカル Db2 サブシステムで認識されているサーバーを指定する必要があります。 したがって、場所名はローカルの Db2 サブシステムの場所名であるか、または SYSIBM.LOCATIONS テーブルのLOCATION列に表示されている必要があります。
- SQLRULES(STD) バインド・オプションが有効になっている場合、アプリケーション・プロセスは指定したサーバーに既に接続していてはなりません。
- トランザクションがリモート作業単位に関連している場合、アプリケーション・プロセスは接続可能状態にあることが必要です。
- RESET
- CONNECT RESET は、CONNECT TO x (x はローカル Db2 サブシステムのロケーション名) と同等です。
- SQLRULES( DB2 ) のバインドオプションが有効になっている場合、CONNECT RESET はローカルの Db2 サブシステムを現在の SQL 接続として確立します。
- SQLRULES(STD) バインド・オプションが有効な場合、CONNECT RESET は、接続が存在しない場合にのみ、ローカルの Db2 サブシステムを現在の SQL 接続として確立します。
- authorization
- 許可 ID と、その許可 ID がサーバーへの接続を
許可されているか検査するために使用されるパスワードを指定します。 ローカルの Db2 サブシステムへの接続の場合、接続タイプが IMS または CICS® のときは認証を指定できません。 指定しようとすると、SQL エラーになります。
- ユーザーホスト変数
- サーバーへの接続に使用する許可名を指定します。 host-variable の値は、次の規則に準拠している必要があります。
- 値は、長さ属性が 128 を超えない CHAR または VARCHAR の変数であることが必要です。
- 値は、ホスト変数内で左揃えにする必要があります。また、許可名の作成の規則に準拠している必要があります。
- 値の後に標識変数を置いてはなりません。
- 許可名の長さがホスト変数の長さより短い場合は、値の右側にブランクを埋め込む必要があります。
ローカルの Db2 サブシステムへの接続の場合、8文字以上のユーザーIDはSQLエラーの原因となります。
- ホスト変数を使用する
- サーバーへの接続に使用する許可名のパスワードを指定します。 host-variable の値は、次の規則に準拠している必要があります。
- 値は、長さ属性が 128 を超えない CHAR または VARCHAR の変数であることが必要です。
- 値は左揃えにする必要があります。
- 値に標識変数が含まれていてはなりません。
- パスワードの長さがホスト変数の長さより短い場合は、値の右側にブランクを埋め込む必要があります。
- 値に小文字が含まれていてはなりません。
ローカルの Db2 サブシステムへの接続の場合、100文字を超えるユーザーIDはSQLエラーの原因となります。
詳細は、「PASSWORD」または「PHRASE」(ユーザーパスワードまたはパスワードフレーズを指定 )を参照してください。
CONNECT USER/USING は CONNECT TO x USER/USING (x はローカル Db2 サブシステムのロケーション名) と同等です (これは CONNECT RESET のセマンティックを持ちます)。
- CONNECT オペランドなし
- この形式の CONNECT ステートメントは、SQLCA の SQLERRP フィールドにある現行サーバーに関する情報を戻します。 アプリケーション・プロセスが切断状態にある場合、SQLERRP はブランクを戻します。
オペランドを指定せずに CONNECT を実行すると、接続状態に影響が及びません。
リモート作業単位の場合は、この形式の CONNECT を実行するためにアプリケーションが接続可能状態になっている必要はありません。
注釈 CONNECT
- 正常な接続
オペランドなしの CONNECT ステートメントを除き、CONNECT ステートメントが正常に実行されると、作業単位タイプに応じて以下のアクションが実行されます。
- 分散作業単位
- 分散作業単位の場合は、次のいずれかのシナリオが起こります。
- ロケーション名が、アプリケーション・プロセスが既に接続されているサーバーでない場合、サーバーへの SQL 接続が作成され、その接続は現行かつ保留状態になります。 それまで現行 SQL 接続であったものは、休止状態に入ります。
- 場所の名前が、そのアプリケーションプロセスがすでに接続しているサーバーを特定する場合、関連するSQL接続は休止状態であり、SQLRULES( DB2 オプションが有効になっている場合、SQL接続は現在の状態になります。 それまで現行 SQL 接続であったものは、休止状態に入ります。
- 場所名がアプリケーションプロセスがすでに接続しているサーバーを特定する場合、関連するSQL接続は現在のものであり、SQLRULES( DB2 オプションが有効になっている場合、アプリケーションプロセスのすべてのSQL接続の状態は変更されません。
- リモート作業単位
- リモート作業単位の場合は、次のアクションが行われます。
- 指定されたサーバーにアプリケーション・プロセスが接続されます。
- アプリケーション・プロセスの既存の SQL 接続は終了します。 このため、その SQL 接続のカーソルはすべてクローズされ、その接続の準備済みステートメントは破棄されるなどの結果になります。
- ロケーション名が CURRENT SERVER 特殊レジスターに入ります。
- CONNECTを使用してローカルの Db2 サブシステムに再接続する場合、USER/USING句が指定されていると、CURRENT SQLID特殊レジスタが再初期化されます。
- サーバーに関する情報が、SQLCA の SQLERRP フィールドに入ります。 サーバーが Db2 製品の場合、情報は pppvvrrm という形式になります。プロダクト ID (PRDID) 値は、pppvvrrm 形式の 8 バイト文字の値です。ここで、ppp は 3 文字のプロダクト・コード、vv はバージョン、rr はリリース、m はモディフィケーション・レベルです。 Db2 12 for z/OS では、修正レベルは機能レベルの範囲を示します。
- DSN12015V12R1M500 以上。
- DSN12010V12R1M100 用。
詳細は、 Db2 for z/OS の「Product identifier (PRDID) values」 をご覧ください。
- 接続に関する追加情報は、SQLCA の SQLERRMC フィールドにあります。 その内容は製品固有です。
バージョンが Db2 for z/OS リクエスターとデータサーバーは Db2 12 以降では、SQLERRMCフィールドには、 Db2 for z/OS 要求者が接続しているデータ サーバー。形式は V nn R n M nnn です。
ヒント: 最後に実行された SQL ステートメントに関する詳細な診断情報を得るには、GET DIAGNOSTICS ステートメントを使用します。
- 接続の失敗
オペランドなしの CONNECT ステートメントを除き、CONNECT ステートメントの実行が失敗すると、以下のようになります。
- 分散作業単位
- 分散作業単位の場合、接続の失敗の原因が許可検査の失敗でない限り、アプリケーション・プロセスの接続状態とその SQL 接続の状態は変更されません。 許可検査が失敗した場合、接続は接続可能な切断状態になります。
- リモート作業単位
- リモート作業単位の場合は、SQLCA の SQLERRP フィールドが、エラーを検出した Db2 リクエスター・モジュールの名前に設定されます。
アプリケーション・プロセスが接続可能状態でないために CONNECT ステートメントの実行が失敗した場合、アプリケーション・プロセスの接続状態に変化はありません。 これ以外の理由で CONNECT ステートメントの実行が失敗した場合、 CURRENT SERVER はブランクに設定され、アプリケーション・プロセスは 接続可能な切断状態に入ります。
- 許可
サーバーが Db2 サブシステムの場合、ユーザーは以下のように認証されます。
- Db2 RACF® を、パスワードの検証を行うために、REQUEST=VERIFY というパラメータを指定して、RACROUTE マクロ経由で呼び出します。
- パスワードが認証された場合、 Db2 は、REQUEST=AUTHを指定してRACROUTEマクロ経由で RACF を再度呼び出し、 Db2 リソースが RACF に定義されているかどうかを認証IDが使用できるかどうかを確認します。
- 次に、Db2 は、接続出口ルーチン (定義されている場合) を呼び出します。
- 接続は、1 次許可 ID、(1 つ以上の 2 次 ID をもつ場合もあります)、および SQL ID を もつようになります。
サーバーがリモート Db2 サブシステムである場合、リクエスト側は認証トークンを生成し、次のようにリモートサイトに送信します
- SNA の場合は SYSIBM.LUNAMES の SECURITY_OUT 列、TCP/IP の場合は SYSIBM.IPNAMES の SECURITY_OUT 列の値が、次のいずれかであることが必要です。
- 「A」(検査済み)
- 「D」(ユーザー ID および機密データの暗号化。TCP/IP のみ)
- 「E」(ユーザー ID、パスワード、および機密データの暗号化。TCP/IP のみ)
- 「P」(パスワード)
値が「D」、「E」、または「P」の場合、リクエスターが、TCP/IP に対する CONNECT で指定されているユ ーザー ID およびパスワードを暗号化します。 ただし、Integrated Cryptographic Service Facility (ICSF) がリクエスター上 に構成されていない場合、またはサーバーが暗号化をサポートしない場合、以下のい ずれかの処置がとられます。- SYSIBM.IPNAMES にある SECURITY_OUT 値が「D」または「E」の場合、SQLCODE -904 (ICSF がリクエスターで構成されていない)、および SQLCODE -30082 (サ ーバーが暗号化をサポートしない) が戻ります。
- SYSIBM.IPNAMES にある SECURITY_OUT 値が「P」の場合、リクエスターはユー ザー ID とパスワードを暗号化せず、平文内でトークンを流します。
- SNA の場合、SYSIBM.SYSLUNAMES の ENCRYPTPSWDS 列には、「Y」が含まれていては なりません。
- 許可 ID およびパスワードが、サーバーで検査されます。
- すべての場合で、アウトバウンド変換 (SYSIBM.USERNAMES で指定) は行われません。
- 分散作業単位
一般に、以下が当てはまります。
- TO 文節と USER/USING 文節が指定されている CONNECT ステートメントは、指定されたサーバーに対して現行状態または休止状態の接続がない場合のみ実行できます。 しかし、指定されたサーバーがローカルの Db2 サブシステムであり、 Db2 スレッドが作成された後に実行される最初のSQLステートメントがCONNECTステートメントである場合、CONNECTステートメントは正常に実行されます。
- TO節がなく、USER/USING節があるCONNECT文は、ローカルの Db2 サブシステムへの現在または休止中の接続が存在しない場合にのみ実行できます。 しかし、 Db2 スレッドが作成された後に実行される最初のSQLステートメントがCONNECTステートメントである場合、CONNECTステートメントは正常に実行されます。
- リモート作業単位
- 許可検査が失敗した場合、接続は接続可能な切断状態になります。
- プリコンパイラー・オプション
プログラムが CONNECT(1) または CONNECT(2) のいずれのオプションを使用してプリコンパイルされたかに関係なく、Db2 for z/OS は、接続プロセス中にリモート・サーバーとネゴシエーションして、コミットの実行方法を決定します。 リモートサーバーが2フェーズコミットプロトコルをサポートしていない場合、 Db2 は1フェーズコミットを実行するようにダウングレードします。
CONNECT ステートメントを含んでいる複数のプログラムを、それぞれ 異なる CONNECT プリコンパイラー・オプションを使ってプリコンパイル した場合、それらのプログラムを同一のアプリケーション・プロセスの一部として 実行することはできません。 無効な CONNECT ステートメントを実行しようとすると、 エラーが発生します。
- ホスト変数
CONNECT ステートメントにホスト変数が含まれている場合、ホスト変数の内容は、そのステートメントを含むパッケージまたはプランのバインド時に ENCODING パラメーターに指定されたコード化スキームであると見なされます。
- Error processing
CONNECT ステートメントは、物理接続がまだ存在しない場合でも、正常に実行されたことを示す情報を戻すことがあります。 Db2 物理的な接続プロセスを可能な限り遅延させることで、サーバーに送信するメッセージの数を節約します。 したがって、CONNECT ステートメント処理におけるエラーは、CONNECT ステートメントの直後ではなく、次に実行可能な SQL ステートメントの後に報告される場合があります。
- 配列タイプおよび配列変数の制約事項
CALL ステートメント以外の SQL ステートメントでは、リモート・サーバーでの接続の確立後に、配列タイプおよび配列変数を参照することはできません。 この制約事項には、リモート・サーバーでオブジェクトに解決する 3 部構成の名前または別名の結果として、リモート・サーバーで実行する SQL ステートメントが含まれます。 例外として、配列エレメントを SQL ルーチン内の FETCH、SELECT INTO、SET assignment-statement、または VALUES INTO ステートメントのターゲットにすることは、ステートメントがリモート・サーバーで実行される場合であっても可能です。
例 CONNECT
- 例 1: アプリケーションを DBMS に接続する
- ロケーション名は文字ストリング変数 LOCNAME に格納されており、許可 ID は文字ストリング変数 AUTHID に、パスワードは文字ストリング変数 PASSWORD に格納されています。
EXEC SQL CONNECT TO :LOCNAME USER :AUTHID USING :PASSWORD; - 例 2: 現行サーバーに関する情報を取得する
EXEC SQL CONNECT;- 例 3: 分散作業単位内で SQL ステートメントを実行する
- 最初の CONNECT ステートメントは、EASTDB サーバーへの接続を行います。 2 番目の CONNECT ステートメントは、WESTDB サーバーへの接続を行い、EASTDB への SQL 接続を休止状態にします。
EXEC SQL CONNECT TO EASTDB; -- execute statements referencing objects at EASTDB EXEC SQL CONNECT TO WESTDB; -- execute statements referencing objects at WESTDB - 例4:文字ストリング変数 AUTHID の許可 ID と文字ストリング変数 PASSWORD のパスワードを使用して、ロケーション ID が文字ストリング変数 LOC にある DBMS にアプリケーションを接続する このユーザーに対する処理を実行してから、接続を解放し、別のユーザー ID とパ スワードを使って再接続します。
EXEC SQL CONNECT TO :LOC USER :AUTHID USING :PASSWORD; -- execute SQL statements accessing data on the server RELEASE :LOC; EXEC SQL COMMIT; -- set AUTHID and PASSWORD to new values EXEC SQL CONNECT TO :LOC USER :AUTHID USING :PASSWORD; -- execute SQL statements accessing data on the server- 例 5: リモート作業単位内でサーバーを変更する
- リモート Db2 サーバーに接続したアプリケーションがカーソルを開き、カーソルの結果テーブルから行を取得したと仮定します。 その後、ローカル Db2 サブシステムに接続するために、アプリケーションは以下のステートメントを実行します。
EXEC SQL COMMIT WORK; EXEC SQL CONNECT RESET;
カーソルのオープンによってアプリケーションは接続不能な接続状態に入ったので、COMMIT が必要です。 接続不能な状態とは、接続が、トランザクションを開始し、そのトランザクションが完了するまで別のサーバーに接続できない状態を指します。 COMMIT ステートメントを発行すると、トランザクションが終了します。 RESET オプションを指定して CONNECT ステートメントを発行すると、アプリケーションはローカル・サーバーに再接続されて接続不能な接続状態に戻ります。 
