コマンド行プロセッサーのフィーチャー

このセクションでは、コマンド行プロセッサーのフィーチャーに関する情報を記載しています。

コマンド行プロセッサー は、以下のように動作します。
  • CLP コマンド (大文字または小文字) をコマンド・プロンプトに入力します。
  • ENTER キーを押すと、コマンドがコマンド・シェルに送られます。
  • 出力の宛先が標準出力装置に自動的に指定されます。
  • パイピングとリダイレクトがサポートされます。
  • 処理の成功または失敗が、ユーザーに通知されます。
  • コマンドの実行の後に、制御がオペレーティング・システム・コマンド・プロンプトに戻され、 ユーザーは続けて次のコマンドを入力することができるようになります。
  • ファイル入力オプションを指定してCLPを呼び出すと、CLIENT APPLNAME特殊レジスターが自動的にCLP filenameに設定されます。
以下のいずれかで、コマンド行プロセッサーを開始できます。
  • db2 コマンドを入力します。または、
  • Linux® オペレーティング・システムの場合は、 「メインメニュー」 をクリックし、 IBM Db2 > 「コマンド行プロセッサー」を選択します。
特定の CLP コマンドと SQL ステートメントを実行するには、 サーバー・インスタンスが稼働中であり、 データベース接続が存在している必要があります。 以下のいずれかのアクションを実行して、データベースに接続します。
  • 以下の SQL ステートメントを発行します。
    db2 connect to database
  • Db2® レジストリー変数 DB2DBDFTによって定義されたデフォルト・データベースへの暗黙接続を確立します。

コマンドの文字数がコマンド・プロンプトに許可されている文字制限を超える場合、 円記号 (¥) を行継続文字として使用することができます。 コマンド行プロセッサー は、行継続文字を検出すると、次の行を読み取り、両方の行に含まれている文字を連結します。 あるいは、-t オプションを使用して、別の行終了文字を設定できます。

コマンド行プロセッサー は、 NULL というストリングをヌル・ストリングとして認識します。 以前に何らかの値に設定したフィールドを後で NULL に設定できます。 以下に例を示します。
   db2 update database manager configuration using tm_database NULL
tm_databaseフィールドを NULLに設定します。 この操作は大文字小文字を区別します。 小文字のnullはnull 文字列として解釈されず、文字nullを含む文字列として解釈されます。

コマンド行プロセッサーのカスタマイズ

DB2_CLPPROMPTレジストリー変数を使って、対話式入力プロンプトをカスタマイズできます。 このレジストリー変数は、最大長100の任意のテキスト・ストリングに設定でき、トークン%i、%ia、%d、%da、%nを含められます。 これらのトークンは、実行時に特定の値に置き換えられます。

表 1. DB2_CLPPROMPT トークンおよびランタイムの値
DB2_CLPPROMPT トークン ランタイムの値
%ia 現行インスタンス接続の許可 ID
%i 現在アタッチされているインスタンスのローカル別名。 インスタンス接続がない場合は、DB2INSTANCEレジストリー変数の値。 Windows プラットフォームの場合のみ、 DB2INSTANCE レジストリー変数が設定されていない場合は、 DB2INSTDEF レジストリー変数の値。
%da 現行データベース接続の許可 ID
%d 現在接続されているデータベースのローカル別名。 データベース接続がない場合は、DB2DBDFTレジストリー変数の値。
%n 改行 (ニュー・ライン)
  • 実行時にどのトークンにも関連する値がない場合は、そのトークンが空のストリングに置き換えられます。
  • 対話式入力プロンプトは常に許可 ID、データベース名、およびインスタンス名を大文字で提示するので、プロンプトに表示される接続および接続情報と一貫したものになります。
  • DB2_CLPPROMPTレジストリ変数がCLP対話モード内で変更された場合、DB2_CLPPROMPTの新しい値は、CLP対話モードが閉じられて再度開かれるまで有効になりません。

DB2_CLPHISTSIZE レジストリー変数を使用して、コマンド履歴の保存コマンド数を指定できます。 HISTORY コマンドを使用すると、CLP 対話式モード・セッション内で実行したコマンド履歴の内容にアクセスできます。

DB2_CLP_EDITOR レジストリー変数を使用して EDIT コマンドを発行するときに開くエディターを指定することもできます。 CLP 対話式セッションで EDIT コマンドを使用すると、ユーザー指定されたコマンドがプリロードされたエディターが開くので、編集してから実行できます。

DB2_CLPPROMPT(%ia@%i、%da@%d)として定義される場合、入力プロンプトには以下の値が表示されます。

  • インスタンス接続なし、およびデータベース接続なし。 DB2INSTANCEDB2に設定されています。 DB2DBDFT が設定されていません。
    (@DB2, @)
  • (Windows) インスタンス接続もデータベース接続もありません。 DB2INSTANCEDB2DBDFT は設定されない。 DB2INSTDEFDB2 に設定される。
    (@DB2, @)
  • インスタンス接続なし、およびデータベース接続なし。 DB2INSTANCEDB2に設定されています。 DB2DBDFTSAMPLEに設定されます。
    (@DB2, @SAMPLE)
  • 許可 ID "keon14" を使用してインスタンス "Db2" にインスタンス接続。 DB2INSTANCEDB2に設定されています。 DB2DBDFTSAMPLEに設定されます。
    (KEON14@DB2, @SAMPLE)
  • 許可 ID "horton7" を使用してデータベース "sample" にデータベース接続。 DB2INSTANCEDB2に設定されています。 DB2DBDFTSAMPLEに設定されます。
    (@DB2, HORTON7@SAMPLE)
  • 許可 ID "keon14" を使用してインスタンス "Db2" にインスタンス接続。 許可 ID "horton7" を使用してデータベース "sample" にデータベース接続。 DB2INSTANCEDB2に設定されています。 DB2DBDFT設定なし。
    (KEON14@DB2, HORTON7@SAMPLE)

コマンド・ファイルでのコマンド行プロセッサーの使用

データベース・マネージャー に対する CLP 要求は、シェル・スクリプト・コマンド・ファイルに組み込むことができます。 次の例では、シェル・スクリプト・コマンド・ファイルに CREATE TABLE ステートメントを入力する方法を示しています。
   db2 "create table mytable (name VARCHAR(20), color CHAR(10))"

コマンドおよびコマンド・ファイルの詳細については、 適切なオペレーティング・システムの解説書を参照してください。

コマンド行プロセッサーの設計

コマンド行プロセッサー は、ユーザー・インターフェースとして機能するフロントエンド・プロセス ( Db2 コマンド) と、データベース接続を維持するバックエンド・プロセス (db2bp) の 2 つのプロセスで構成されます。

データベース接続の保守

db2 が呼び出されるたびに、 新しいフロントエンド・プロセスが開始されます。 バックエンド・プロセスは、最初の db2 呼び出しのときに開始し、 TERMINATE によって明示的に終了します。 親が同じであるフロントエンド・プロセスはすべて単一のバックエンド・プロセスにより保守されているので、 単一のデータベース接続を共有していることになります。

例えば以下のように、同じオペレーティング・システムのコマンド・プロンプトから複数の db2 呼び出しを行うと、 1 つのバックエンド・プロセスを共有する複数のフロントエンド・プロセスが個別に開始します。 そしてこのバックエンド・プロセスがデータベース接続を保留します。
  • db2 'connect to sample',
  • db2 'select * from org',
  • . test01 (ここで、 test01Db2 コマンドを含むシェル・スクリプトです)、および
  • db2 -tf myfile.clp
以下のように、同じオペレーティング・システム・プロンプトから複数の呼び出しを行うと、 それぞれの呼び出しの親プロセスが異なるために個別のバックエンド・プロセスが必要になり、 結果として複数のデータベース接続が個別に開始してしまいます。
  • test01
  • . test01 &
  • test01 &
  • sh test01
フロントエンド・プロセスとバックエンド・プロセスとの間の通信

フロントエンド・プロセスとバックエンド・プロセスとの間の通信は、要求キュー、 入力キュー、および出力キューの 3 つのメッセージ・キューを介して行います。

環境変数

以下の環境変数によって、2 つのプロセス間での通信が構成されます。

表 2. 環境変数
変数 最小 最大 デフォルト
DB2BQTIME 1 5294967295 1
DB2BQTRY 試行 0 5294967295 試行 60
DB2RQTIME 1 5294967295 5
DB2IQTIME 1 5294967295 5
DB2BQTIME
コマンド行プロセッサー が呼び出されると、フロントエンド・プロセスは、バックエンド・プロセスが既にアクティブになっているかどうかを検査します。 アクティブになっている場合、フロントエンド・プロセスは接続を再び確立します。 アクティブになっていない場合、フロントエンド・プロセスがバックエンド・プロセスをアクティブ化します。 その後、フロントエンド・プロセスは、DB2BQTIME変数指定期間アイドル状態になり、再度検査します。 フロントエンド・プロセスは、DB2BQTRY変数に指定された回数だけ検査を続行します。その後、バックエンド・プロセスがまだアクティブでない場合は、タイムアウトになり、エラー・メッセージが返されます。
DB2BQTRY
DB2BQTIME変数と連動して機能し、フロントエンドプロセスがバックエンドプロセスがアクティブであるかどうかを判断しようとする回数を指定します。

照会時間を最適化するために、ピーク期間中DB2BQTIMEDB2BQTRYの値を増やすことができます。

DB2RQTIME
一度バックエンド・プロセスが開始すると、 このプロセスはフロントエンドからの要求があるまで要求キューで待機します。 さらに、コマンド・プロンプトから要求が開始されてから次の要求が開始されるまでの間も、 要求キューで待機します。

DB2RQTIME変数は、バックエンド・プロセスがフロントエンド・プロセスから要求待機時間の長さを指定します。 この時間が経過すると、要求キューに要求がない場合、 バックエンド・プロセスはフロントエンド・プロセスの親がまだ存在しているかを調べ、 存在していないことが分かるとバックエンド・プロセスは終了します。 親が存在している場合は、要求キューで待機を継続します。

DB2IQTIME
バックエンド・プロセスがフロントエンド・プロセスから要求を受信すると、 バックエンド・プロセスはフロントエンド・プロセスに肯定応答を送り、 入力キューを介して入力を受け取る準備ができていることを知らせます。 そして、バックエンド・プロセスは入力キューで待機します。 また、バッチファイル(-fオプションで指定)の実行中、ユーザーがインタラクティブモードになっている間、入力キューで待機します。

DB2IQTIME変数は、フロントエンド・プロセスがコマンドを渡すまでバックエンド・プロセスが入力キューで待機する時間の長さを指定します。 指定した時間が経過すると、バックエンド・プロセスは、 フロントエンド・プロセスがアクティブになっているかどうかを調べ、 フロントエンド・プロセスが既に存在していない場合は、 要求キューに戻って待機します。 フロントエンド・プロセスが存在している場合は、 バックエンド・プロセスはフロントエンド・プロセスからの入力を待機します。

これらの環境変数の値を表示するには、 LIST COMMAND OPTIONSを使用します。

バックエンド環境変数は、 バックエンド・プロセスが開始されるときにフロントエンド・プロセスから値の集合を継承します。 ただし、フロントエンド環境変数が変更された場合は、 バックエンド・プロセスはその変更を継承することはありません。 変更した値を継承するには、まずバックエンド・プロセスを終了してから、 再始動 (db2 コマンドを実行する) しなければなりません。

バックエンド・プロセスを終了しなければならない場合の例を、次のシナリオで示します。

  1. ユーザー A がログオンし、いくつか CLP コマンドを出した後、 TERMINATE を発行せずにログオフします。
  2. ユーザー B が同じウィンドウを使用してログオンします。
  3. ユーザー B が特定の CLP コマンドを発行すると、 コマンドはメッセージ DB21016 (システム・エラー) を出して失敗します。

ユーザー B のフロントエンド・プロセス (コマンドが出されたオペレーティング・システム・ウィンドウ) の親が依然としてアクティブであるため、 ユーザー A が開始したバックエンド・プロセスは、 ユーザー B が CLP を使用して開始した時点でもまだアクティブになっています。 バックエンド・プロセスは、ユーザー B が発行した新規コマンドを処理しようとしますが、 ユーザー B のフロントエンド・プロセスには、 バックエンド・プロセスのメッセージ・キューを使用するだけの十分な権限がありません。 そのためにはバックエンド・プロセスを作成したユーザー A の権限が必要だからです。 CLP セッションを TERMINATE コマンドを使用して終了してから、 ユーザーは同じオペレーティング・システム・ウィンドウを使用して、 新規 CLP セッションを開始しなければなりません。 これにより、新しいユーザーごとに新しいバックエンドプロセスが作成され、権限問題が防止され、新しいユーザーのバックエンドプロセスで環境変数(DB2INSTANCEなど)の正しい値が設定されます。

CLP 使用上の注意

コマンドはコマンド・プロンプトから大文字または小文字で入力できます。 ただし、Db2 が大文字小文字を区別するパラメーターには、大文字小文字を正確に入力しなければなりません。 例えば、 CHANGE DATABASE COMMENT コマンドの WITH 節の comment-string は、大/小文字を区別するパラメーターです。

区切り付き ID は、SQL ステートメント内で使用できます。

特殊文字またはメタ文字($& *();<>?\'"など)は、CLPコマンドに許可されます。 これらの文字が CLP 対話式モード以外または CLP バッチ入力モード以外で使用されている場合、 これらの文字はオペレーティング・システム・シェルによって解釈されます。 シェルが特殊な処置を行わない場合は、引用符またはエスケープ文字が必要です。

例えば、 AIX® Korn シェル環境内で実行する場合は、以下のようになります。
   db2 select * from org where division > 'Eastern'
「組織から<the names of all files>の選択」と解釈されます。 その結果、SQL 構文エラーがファイル Easternにリダイレクトされます。 次の構文であれば、正しい出力が生成されます。
   db2 "select * from org where division > 'Eastern'"

特殊文字は、プラットフォームごとに異なります。 AIX Korn シェルでは、前の例は、¥ *、¥>、¥ ' などのエスケープ文字 (¥) を使用して書き直すことができます。

ほとんどのオペレーティング・システム環境では、 入力と出力をリダイレクトすることが可能です。 たとえば、SAMPLEデータベースへの接続が確立された場合、次の請求はSTAFF表にクエリを実行し、mydataディレクトリに指定されたファイル staflist.txtに出力を送信します。
   db2 "select * from staff" > mydata/staflist.txt
出力のリダイレクトがサポートされていない環境では、 CLP オプションを使用することができます。 例えば、上記の要求は以下のように書き直すことができます。
   db2 -r mydata\staflist.txt "select * from staff"
 
   db2 -z mydata\staflist.txt "select * from staff"
コマンド行プロセッサーはプログラミング言語ではありません。 例えば、ホスト変数はサポートしません。 そのため、次のステートメント、
   db2 connect to :HostVar in share mode
:HostVarが有効なデータベース名ではないため、構文的に正しくありません。

コマンド行プロセッサー は、SQL NULL 値をハイフン (-) で表します。 列が数値の場合、ハイフンは列の右側に配置されます。 列が数値ではない場合、ハイフンは列の一番左に置きます。

Db2 コマンド行プロセッサー ・ウィンドウから 1 バイト (SBCS) 言語の国別文字を正しく表示するには、True Type フォントを選択する必要があります。 例えば、Windows 環境では、コマンド・ウィンドウのプロパティー・ノートブックを開き、Lucinda Console などのフォントを選択します。 ベル (0x7) などの印刷不能文字は置換なしで印刷されるため、ASCII ヌル文字 (0x0) については、特別な考慮が必要です。 ASCII ヌル文字 (0x0) を VARCHAR ストリング内で使用できるとしても、ストリングの表示は、ストリング内で見つかる最初の ASCII ヌル文字で終了します。

以下に例を示します。
db2 "insert into sample values (x'410041')"
db2 "insert into sample values (x'410741')"

db2 "select CHARACTER_LENGTH(DATA, OCTETS) LENGTH, 
            DATA, 
            hex(DATA) HEX_VALUE 
     from sample"

     LENGTH           DATA                       HEX_VALUE
----------- -------------------- ----------------------------------------
      3                A                         410041
      3                AA                        410741

コマンド行プロセッサーは、ファイル・パス名中の各国語サポート (NLS) 文字をサポートしていません。 これは特に、問題のあるファイル・パス名が最も頻繁に検出される IMPORTEXPORT、および REGISTER XMLSCHEMAなどのコマンドに影響します。

コマンド行プロセッサー・コマンド出力の他のコマンド行プロセッサー・コマンドへのパイピングはサポートされています。 例えば、db2 -x <SQL_statement> | db2 +p -tv。 このサポートには、パイプのバッファー・サイズ以外の制限はありません。 パイプのバッファー・サイズは構成可能ではありません。 最初のコマンドでパイプのバッファー・サイズを超えた場合、コマンド行プロセッサーはハングするか、パイプのバッファーに出力を書き込もうとする際に障害が起こります。 2 番目のコマンドがコマンド行プロセッサー・コマンド (UNIX シェル・コマンドなど) ではない場合、パイプ・バッファー・サイズの制限のためにハングまたは障害が発生することはありません。

コマンド行プロセッサー は、データベース接続用の db2dsdriver.cfg 構成ファイルをサポートします。 組み込み SQL でサポートされている db2dsdriver.cfg キーワードを コマンド行プロセッサーで使用できます。

デフォルトでは、CLP は、 CREATE PROCEDURE/FUNCTION/TRIGGER/METHOD コマンドを除くすべての改行文字をコマンドから削除する必要があります。 これらのコマンドの場合、CLP は元のコマンドのすべての改行文字を保持します。