Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


5.2.1 CALL COMMAND文の形式と規則

〈この項の構成〉

(1) 機能

HiRDBのコマンド又はユティリティを実行し,実行結果(標準出力,標準エラー出力,戻り値)を取得できます。

(2) 使用権限

システム共通定義のpd_sql_command_exec_usersオペランドで指定されている認可識別子を持つユーザ

(3) 形式

  CALL COMMAND{:埋込み変数1|?パラメタ1|定数1}
        〔WITH{:埋込み変数2|?パラメタ2|定数2}〔,{:埋込み変数2|?パラメタ2|定数2}〕…〕
        〔INPUT{:埋込み変数3|?パラメタ3|定数3}〕
        〔OUTPUT TO{:埋込み変数4 :標識変数1|?パラメタ4}〕
        〔ERROR TO{:埋込み変数5 :標識変数2|?パラメタ5}〕
        〔RETURN CODE TO{:埋込み変数6|?パラメタ6}〕
        〔ENVIRONMENT{:埋込み変数7|?パラメタ7|定数4}〕
        〔SERVER{:埋込み変数8|?パラメタ8|定数5}〕

(4) オペランド

(a) :埋込み変数1|?パラメタ1|定数1

実行するコマンドやユティリティの名称を格納した埋込み変数,?パラメタ又は定数を指定します。コマンド又はユティリティの名称に,相対パスや絶対パスは指定できません。埋込み変数及び?パラメタのデータ型は,最大長が30バイト以下の可変長文字列にしてください。ただし,埋込み変数及び?パラメタに文字集合名UTF16を指定した場合,最大長が60バイト以下の可変長文字列になります。定数の長さは,30バイト以下にしてください。

(b) WITH{:埋込み変数2|?パラメタ2|定数2}〔,{:埋込み変数2|?パラメタ2|定数2}〕…

コマンドやユティリティに渡す引数を格納した埋込み変数,?パラメタ又は定数を指定します。引数の並びが長いために,一つの埋込み変数,?パラメタ又は定数で指定できない場合は,複数の埋込み変数,?パラメタ又は定数を用いて指定してください。この場合は,指定した順序で文字列を結合します。複数の引数を与えたい場合は,セミコロンで区切って記述してください。セミコロン自身を引数に指定する場合は,2個の連続するセミコロンを指定してください。埋込み変数及び?パラメタのデータ型は,最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは,32,000バイト以下にしてください。引数の中にパスを含む場合は,絶対パスで指定してください。

(c) INPUT{:埋込み変数3|?パラメタ3|定数3}

実行するコマンドやユティリティに渡す標準入力の内容を格納した埋込み変数,?パラメタ又は定数を指定します。埋込み変数及び?パラメタのデータ型は,最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは,32,000バイト以下にしてください。パスワードの入力を要求するコマンドやユティリティに対して,INPUT句を用いてパスワードを与えることはできません。

(d) OUTPUT TO{:埋込み変数4 :標識変数1|?パラメタ4}

実行したコマンドやユティリティの標準出力の内容を格納する埋込み変数又は?パラメタを指定します。埋込み変数及び?パラメタのデータ型は,最大長が2ギガバイト以下のバイナリデータ列(BLOB)です。標準出力が埋込み変数又は?パラメタの最大長を超える場合は,出力の先頭から最大長までの情報が格納され,それ以降の情報は切り捨てられます。この場合,標識変数には出力を切り捨てたことを示す標準出力の長さが格納されます。埋込み変数を使用する場合は,必ず標識変数を指定してください。

(e) ERROR TO{:埋込み変数5 :標識変数2|?パラメタ5}

実行したコマンドやユティリティの標準エラー出力の内容を格納する埋込み変数又は?パラメタを指定します。埋込み変数及び?パラメタのデータ型は,最大長が2ギガバイト以下のバイナリデータ列(BLOB)です。標準エラー出力が埋込み変数又は?パラメタの最大長を超える場合は,出力の先頭から最大長までの情報が格納され,それ以降の情報は切り捨てられます。この場合,標識変数には出力を切り捨てたことを示す標準エラー出力の長さが格納されます。埋込み変数を使用する場合は,必ず標識変数を指定してください。

(f) RETURN CODE TO{:埋込み変数6|?パラメタ6}

実行したコマンドやユティリティの戻り値を格納する埋込み変数又は?パラメタを指定します。埋込み変数及び?パラメタのデータ型は,整数型です。

(g) ENVIRONMENT{:埋込み変数7|?パラメタ7|定数4}

コマンドやユティリティを実行する時のクライアント環境定義を格納した埋込み変数,?パラメタ又は定数を指定します。埋込み変数及び?パラメタのデータ型は,最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは,32,000バイト以下にしてください。

クライアント環境定義は,「クライアント環境定義名=値」の形式で指定してください。複数のクライアント環境定義を指定したい場合は,セミコロンで区切って記述してください。セミコロン自身を引数に指定する場合は,2個の連続するセミコロンを指定してください。

指定できるクライアント環境定義の詳細は,マニュアル「HiRDB UAP開発ガイド」を参照してください。

なお,ENVIRONMENTで指定できない環境変数を変更したい場合は,システム共通定義にputenv形式で設定するか,又はHiRDB管理者の環境変数を変更してください。

(h) SERVER{:埋込み変数8|?パラメタ8|定数5}

コマンドやユティリティを実行するサーバ名を格納した埋込み変数,?パラメタ又は定数を指定します。サーバ名とは,システム共通定義のpdstartオペランドの-sオプションで指定されているサーバ名のことです。埋込み変数及び?パラメタのデータ型は,最大長が8バイト以下の可変長文字列にしてください。ただし,埋込み変数及び?パラメタに文字集合名UTF16を指定した場合,最大長が16バイト以下の可変長文字列になります。定数の長さは,8バイト以下にしてください。HiRDB/パラレルサーバでシステムマネジャユニットを指定する場合は,MGRを指定してください。SERVER句が省略された場合,HiRDB/パラレルサーバではMGR,HiRDB/シングルサーバではSDSのサーバ名が仮定されます。

(5) 共通規則

  1. 実行したコマンドやユティリティによってトランザクションが発生する場合,SQLを実行したトランザクションとは別のものになります。

  2. SQLを実行したトランザクションと,実行したコマンドやユティリティによって発生したトランザクションとの間に,排他待ち又はデッドロックが発生する可能性があります。

  3. 応答を要求するコマンドやユティリティを実行する場合,そのコマンドやユティリティを正しく終了させることができない標準入力の内容を与えると,システムが無応答になる場合がありますので注意してください。

    (例)

    HiRDBファイルシステム(/hirdb/ios/db0)のバックアップ(pdfbkup)を実行する場合

    コマンドライン上でpdfbkupコマンドを実行すると,バックアップの続行又は終了を確認するため,「G」又は「T」の入力と,改行(CR)の入力が要求されます。

      % pdfbkup /hirdb/ios/db0 /hirdb/ios/db0.backup
      1605756 19:27:29 SQA2          KFPI21514-Q HiRDB file system area
      /hirdb/ios/db0 backup to /hirdb/ios/db0.backup. [G:continue, T:terminate]

    次のようなCALL COMMAND文で,改行を含まない標準入力をpdfbkupコマンドに渡すと,システムは無応答になってしまいます。

      EXEC SQL CALL COMMAND ’pdfbkup’ WITH ’/hirdb/ios/db0;/hirdb/ios/db0.backup’ INPUT ’G’;

    pkfbkupコマンドを正しく実行させるためには,INPUT句には下記のように改行を含めた標準入力を指定してください。

      EXEC SQL BEGIN DECLARE SECTION;
              char input_data[10];
      EXEC SQL END DECLARE SECTION;
      sprintf(input_data, ”G\n”);
      EXEC SQL CALL COMMAND ’pdfbkup’ WITH ’/hirdb/ios/db0;
      /hirdb/ios/db0.backup’ INPUT :input_data;

    システムが無反応になった場合は,HiRDBのプロセス(HiRDB/パラレルサーバの場合はFES,HiRDB/シングルサーバの場合はSDS),及びコマンドやユティリティのプロセスをpdcancelコマンドで終了させてください。

(6) 注意事項

  1. コマンドやユティリティのタイムアウトが必要な場合には,クライアント環境定義のPDCALCMDWAITTIMEオペランドを指定してください。コマンド又はユティリティの実行中にタイムアウトした場合,制御用コマンド(pdcmdexec)のプロセス,及び実行中のコマンド又はユティリティのプロセスをpdkillコマンド(UNIX版の場合はOSのkillコマンド)で終了してください。

  2. 実行するプラットフォームの制限によって,コマンドやユティリティの実行に失敗する場合があります。次の表に,コマンド又はユティリティを実行できなかった場合に取得する情報と情報の格納先を示します。

    表5‒2 コマンド又はユティリティを実行できなかった場合に取得する情報と情報の格納先

    取得する情報

    取得する情報の格納先

    • エラーが発生したシステム関数名

    • エラーコード

    埋込み変数5又は?パラメタ5

    OSのシステム関数の終了コード

    埋込み変数6又は?パラメタ6

    注※

    エラーが発生したシステム関数及びエラーコードは,func=aa....aa,errno=bb....bbの形式で出力されます(errnoは,エラーの状態を表す外部整数変数です)。

    aa....aa:エラーが発生したシステム関数

    bb....bb:エラーコード(エラーコードを取得できない場合,何も格納しません)

    対策

    エラーコードを調査し,errno.h又はユーザが使用するOSのマニュアルを参照して,エラーの原因を取り除き,再度実行してください。

    OSのシステム関数の実行に失敗する原因の一つとして,コマンドやユティリティに指定した引数が,OSで定義されているコマンドライン引数長の限界値を超えたことが考えられます。この問題を解決するためには,OSをチューニングしてコマンドライン引数長の限界値を大きくしてください。

(7) 使用例

  1. HiRDBシステムの状態表示(pdfls)を使用して,HiRDBファイルシステム領域(/hirdb/ios/rdfiles)内に存在するHiRDBファイルの一覧を取得します。実行結果はOUTPUT TO句に指定した埋込み変数(output)に代入されます。コマンドライン上から‘pdfls -H /hirdb/ios/rdfiles’を実行する場合と同じ結果が得られます。

      EXEC SQL BEGIN DECLARE SECTION;
              SQL TYPE IS BLOB(1M) OUTPUT;
      EXEC SQL END DECLARE SECTION;
      EXEC SQL CALL COMMAND ’pdfls’ WITH ’-H;/hirdb/ios/rdfiles’ OUTPUT TO :OUTPUT;
  2. RDエリアの閉塞コマンド(pdhold)を使用して,RDエリア(RU01,RU02及びRU03)を閉塞します。実行結果はOUTPUT TO句に指定した埋込み変数(output)に代入されます。コマンドライン上から‘pdhold -r RU01,RU02,RU03’を実行する場合と同じ結果が得られます。

      EXEC SQL BEGIN DECLARE SECTION;
              SQL TYPE IS BLOB(1M) OUTPUT;
      EXEC SQL END DECLARE SECTION;
      EXEC SQL CALL COMMAND ’pdhold’ WITH ’-r;RU01,RU02,RU03’ OUTPUT TO :OUTPUT;

    WITH句に複数の定数を指定したい場合は,次のように記述することもできます。

      EXEC SQL BEGIN DECLARE SECTION;
              SQL TYPE IS BLOB(1M) OUTPUT;
      EXEC SQL END DECLARE SECTION;
      EXEC SQL CALL COMMAND ’pdhold’ WITH ’-r;RU01’,’,RU02,RU03’ OUTPUT TO :OUTPUT;

    WITH句に定数及び埋込み変数を指定したい場合は,次のように記述することもできます。

      EXEC SQL BEGIN DECLARE SECTION;
              SQL TYPE IS BLOB(1M) OUTPUT;
              char RDAREAS[100];
      EXEC SQL END DECLARE SECTION;
      sprintf(RDAREAS, ”RU01,RU02,RU03”);
      EXEC SQL CALL COMMAND ’pdhold’ WITH ’-r;’,:RDAREAS OUTPUT TO :OUTPUT;