コマンド行プロセッサーは以下の順序で動作します。
データベースにアクセスする前に、ユーザーは START DATABASE MANAGERで DB2 を始動するなど、 準備作業のタスクを実行しなければなりません。
さらに、データベースを照会する前に、 ユーザーはそのデータベースに接続していなければなりません。 データベースに接続するには、以下のいずれかを行います。
データベース内の表での作業に関する情報については、 SQL 解説書 を参照してください。
コマンドの文字数がコマンド・プロンプトに許可されている文字制限を超える場合、 円記号 (\) を行継続文字として使用することができます。
コマンド行プロセッサーは行継続文字を検出すると、 次の行を読み取って、その行にある文字を前の行の文字に連結します。 その代わりに、-t オプションを使用して行終了文字を設定することもできます (***を参照)。 この場合、行継続文字は無効になり、 すべてのステートメントとコマンドの最後を必ず行終了文字にしなければなりません。
コマンド行プロセッサーは、NULL と呼ばれるストリングをヌル文字列として識別します。 以前に何らかの値に設定したフィールドを後でヌル値に設定することができます。 たとえば、次のように指定します。
db2 update database manager configuration using tm_database NULL
この場合、tm_database フィールドがヌル値に設定されます。 この操作は大文字小文字を区別します。 小文字の null はヌル文字列としては解釈されず、 null を含む文字列として解釈されます。
データベース・マネージャーへの CLP 要求をシェル・スクリプトのコマンド・ファイルに組み込むことができます。 次の例では、シェル・スクリプト・コマンド・ファイルに CREATE TABLE ステートメントを入力する方法を示しています。
db2 "create table mytable (name VARCHAR(20), color CHAR(10))"
コマンドおよびコマンド・ファイルの詳細については、 適切なオペレーティング・システムの解説書を参照してください。
コマンド行プロセッサーは 2 つのプロセス、 つまりユーザー・インターフェースとして機能するフロントエンド・プロセス (DB2 コマンド) と、 データベース接続を維持するバック・エンド・プロセス (db2bp) とで構成されています。
データベース接続の保守
db2 が呼び出されるたびに、 新しいフロントエンド・プロセスが開始されます。 バック・エンド・プロセスは、最初の db2 呼び出しのときに開始し、 TERMINATEによって明示的に終了します。 親が同じであるフロントエンド・プロセスはすべて単一のバック・エンド・プロセスにより保守されているので、 単一のデータベース接続を共有していることになります。
たとえば以下のように、同じオペレーティング・システムのコマンド・プロンプトから複数の db2 呼び出しを行うと、 1 つのバック・エンド・プロセスを共有する複数のフロントエンド・プロセスが個別に開始します。 そしてこのバック・エンド・プロセスがデータベース接続を保持します。
以下のように、同じオペレーティング・システム・プロンプトから複数の呼び出しを行うと、 それぞれの呼び出しの親プロセスが異なるために個別のバック・エンド・プロセスが必要になり、 結果として複数のデータベース接続が個別に開始してしまいます。
フロントエンド・プロセスとバック・エンド・プロセスとの間の通信
フロントエンド・プロセスとバック・エンド・プロセスとの間の通信は、要求待ち行列、 入力待ち行列、および出力待ち行列の 3 つのメッセージ待ち行列を介して行います。
環境変数
以下の環境変数によって、2 つのプロセス間での通信が構成されます。
変数 | 最小 | 最大 | 省略時値 |
---|---|---|---|
DB2BQTIME | 1 秒 | 5294967295 | 1 秒 |
DB2BQTRY | 試行 0 回 | 5294967295 | 試行 60 回 |
DB2RQTIME | 1 秒 | 5294967295 | 5 秒 |
DB2IQTIME | 1 秒 | 5294967295 | 5 秒 |
DB2BQTIME および DB2BQTRY の値は、 ピーク時に照会時間を最適化するために増やすことができます。
DB2RQTIME 変数は、 バック・エンド・プロセスがフロントエンド・プロセスからの要求を待機する長さを指定します。 この時間が経過すると、要求待ち行列に要求がない場合、 バック・エンド・プロセスはフロントエンド・プロセスの親がまだ存在しているかを調べ、 存在していないことが分かるとバック・エンド・プロセスは終了します。 親が存在している場合は、要求待ち行列で待機を継続します。
DB2IQTIME 変数は、フロントエンド・プロセスがコマンドを渡すまで、 バック・エンド・プロセスが待機する時間を指定します。 指定した時間が経過すると、バック・エンド・プロセスは、 フロントエンド・プロセスが活動しているかどうかを調べ、 フロントエンド・プロセスがすでに存在していない場合は、 要求待ち行列に戻って待機します。 フロントエンド・プロセスが存在している場合は、 バック・エンド・プロセスはフロントエンド・プロセスからの入力を待機します。
これらの環境変数の値を表示するには、LIST COMMAND OPTIONSを使用します。
バック・エンド環境変数は、 バック・エンド・プロセスが開始されるときにフロントエンド・プロセスから値の集合を継承します。 ただし、フロントエンド環境変数が変更された場合は、 バック・エンド・プロセスはその変更を継承することはありません。 変更した値を継承するには、まずバック・エンド・プロセスを終了してから、 再始動 (db2 コマンドを発行する) しなければなりません。
バック・エンド・プロセスを終了しなければならない場合の例を、次のシナリオで示します。
ユーザー B のフロントエンド・プロセス
(コマンドが出されたオペレーティング・システム・ウィンドウ)
の親が依然として活動状態にあるため、
ユーザー A が開始したバック・エンド・プロセスは、
ユーザー B が CLP を使用して開始した時点でもまだ活動しています。
バック・エンド・プロセスは、ユーザー B が発行した新規コマンドを処理しようとしますが、
ユーザー B のフロントエンド・プロセスには、
バック・エンド・プロセスのメッセージ待ち行列を使用するだけの十分な権限がありません。
そのためにはバック・エンド・プロセスを作成したユーザー A の権限が必要だからです。
CLP セッションを TERMINATE コマンドを使用して終了してから、
ユーザーは同じオペレーティング・システム・ウィンドウを使用して、
新規 CLP セッションを開始しなければなりません。
これによって新規ユーザーごとに新しいバック・エンド・プロセスが作成されることになり、
権限の問題は回避され、新規ユーザーのバック・エンド・プロセス内で環境変数
(DB2INSTANCE など) の値を訂正して設定できます。
コマンドはコマンド・プロンプトから大文字または小文字で入力できます。 ただし、DB2 が大文字小文字を区別するパラメーターには、 大文字小文字を正確に入力しなければなりません。 たとえば、 CHANGE DATABASE COMMENT の WITH 文節にある comment-string は、 大文字小文字を区別するパラメーターです。
区切り付き識別子は、SQL ステートメント内で使用できます。 SQL ステートメント内での区切り識別子の使用方法の詳細については、 SQL 解説書 を参照してください。
特殊文字またはメタ文字 (たとえば、$ & * ( ) ; < > ? \ ' " など) は、CLP コマンド内で使用できます。 これらの文字が CLP 対話式モード以外または CLP バッチ入力モード以外で使用されている場合、 これらの文字はオペレーティング・システム・シェルによって解釈されます。 シェルが特殊な処置を行わない場合は、疑問符またはエスケープ文字が必要です。
たとえば、AIX Korn シェル環境でコマンド
db2 select * from org where division > 'Eastern'
を実行すると、 "select <the names of all files> from org where division" と解釈されます。 この結果の SQL 構文エラーは、ファイル Eastern にリダイレクトされます。 次の構文であれば、正しい出力が生成されます。
db2 "select * from org where division > 'Eastern'"
特殊文字は、プラットフォームごとに異なります。 AIX Korn シェルでは、上記の例はエスケープ文字 (\)、たとえば \*、 \>、または \' などを使って書き直すことができます。 OS/2 シェルでは、\* または \' とすると構文エラーになります。
コマンドを MS-DOS プロンプトからコマンド行モードで入力すると、 Windows 95 DOS コマンド・プロセッサーは、 パーセント記号 (%) で囲んで入力したものは、 すべて変数名として解釈するように前処理します。 たとえば、次のようにします。
db2 "SELECT NAME, CREATOR FROM SYSIBM.SYSPLAN WHERE NAME LIKE 'SQLL%' OR NAME LIKE 'SQLC%'"
この場合、db2.exe に渡されるのは以下のようになります。
"SELECT NAME,CREATOR FROM SYSIBM.SYSPLAN WHERE NAME LIKE 'SQLL'" (%' OR NAME LIKE 'SQLC% は DOS によって値がヌルの変数として扱われます。
この振る舞いを避けるには、以下のように二重パーセント記号 (%%) を使用して、 パーセント記号 (変数ではない) をプログラムに渡すように指示します。
db2 "SELECT NAME, CREATOR FROM SYSIBM.SYSPLAN WHERE NAME LIKE 'SQLL%%' OR NAME LIKE 'SQLC%%'"
これは、db2.exe に以下のように渡されます。
"SELECT NAME, CREATOR FROM SYSIBM.SYSPLAN WHERE NAME LIKE 'SQLL%' OR NAME LIKE 'SQLC%'"
ほとんどのオペレーティング・システム環境では、 入力と出力をリダイレクトすることが可能です。 たとえば、SAMPLE データベースに接続している場合、次に示す要求は STAFF 表を照会し、 出力を mydata ディレクトリーにある staflist.txt という名前のファイルに送ります。
db2 "select * from staff" > mydata/staflist.txt
出力のリダイレクトがサポートされていない Windows 3.1 などの環境では、 CLP オプションを使用することができます。 たとえば、上記の要求は以下のように書き直すことができます。
db2 -r mydata\staflist.txt "select * from staff" db2 -z mydata\staflist.txt "select * from staff"
Windows 用の CLP オプションの詳細については、インストールおよび構成 補足 を参照してください。
コマンド行プロセッサーはプログラミング言語ではありません。 たとえば、ホスト変数およびステートメントはサポートしません。 そのため、
db2 connect to :HostVar in share mode
このステートメント例は、 :HostVar が有効なデータベース名ではないため、構文上は正しくありません。
コマンド行プロセッサーは、SQL NULL 値をハイフン (-) で表します。 列が数値である場合、ハイフンは列の一番右に置きます。 列が数値ではない場合、ハイフンは列の一番左に置きます。 DB2 コネクトとホスト・データベースを使っている場合のコマンド行プロセッサーの使用の詳細については、 DB2 コネクト 使用者の手引き を参照してください。