CHAPTER 2: UNIX シェル インターフェイス


2.1 はじめに

UNIX シェルインターフェイスは、 シェル環境からEmpress 問い合わせ言語 を実行するための以下の2つのコマンドを提供します。

  1. 1つのコマンドを実行するための empcmd
  2. コマンドをバッチで実行するための empbatch

シェルインターフェイスを利用することで、迅速にデータベース管理の プロトタイプパッケージを提供することができます。 これは、既存のUNIXプログラム、C ルーチン、他のシェルプログラムから 単純なコマンドで呼び出すことができ、それにより、迅速に データベース管理システムのカスタムインターフェイスの 設計および開発が可能となります。



2.2 UNIXシェルから1つのSQLコマンドの実行

UNIXシェル上から1つのEmpress SQLコマンドを実行するためには empcmdコマンドを使用します。 コマンドの構文は以下のとおりです。

empcmd database "command"

database データベースディレクトリの名前
command 実行するEmpress SQLコマンド

例 1: テーブルからアトリビュート値を検索する

以下のコマンドは、UNIXプロンプト上で repairsデータベースのpersonnelテーブルから すべての従業員のリストを得るために実行します。

   empcmd repairs "SELECT name FROM personnel"

このコマンドは、repairsと呼ばれるデータベースに対し、 Empress SQLコマンド "SELECT name FROM personnel" を実行します。empsqlを呼び出す必要はありません。 コマンドの実行後は、UNIXシェルに制御を戻します。

上記のempcmdコマンドを、"names"と名付けたコマンド テキスト(シェルスクリプトファイル)に格納し、UNIXプロンプト上から "names"を入力することで従業員名のリストを出力することも可能です。

例 2: コマンドファイルの引数

"phone"と呼ばれるコマンドファイルに記述された 以下のコマンドは、引数に従業員名を指定し、従業員の電話番号を出力します。

   empcmd repairs "select phone from personnel dump
        where name = '$1'"

"dump"キーワードは、 "phone"のヘッダーを出力させないために empcmdコマンドに指示しています。 "Jones"の電話番号を調べるためには、以下のように入力します。

   phone Jones

以下の結果が出力されます。

   667-2951

例 3: エラーチェックをともなったコマンドファイル

より完全な"phone"プログラムにするには、 指定された引数が 1つであるかどうかをチェックします。そうではない場合は、 適切なエラーメッセージを出力します。 改良されたバージョンは以下のとおりです。

   USAGE = "Usage: phone employee's name"
   case "$#" in

        1)
             mscmd repairs "select phone from
                  personnel
             dump where name = '$1'"
             ;;
        *)
             echo $USAGE
             exit 1
             ;;
        esac

例 4: 対話的なコマンドファイル

"phone"プログラムを より対話的なプログラムにしたい場合、 次のバージョンにおいて、 以下のように記述することができます。

   echo "
   Find phone number given employee's name.
   To stop, enter '.q'

   "
   NAME =
   NULL =
   : reprompt for name if no name is given
   while true
   do
        echo -n "Employee name: "
        read NAME
        case $NAME in
             $NULL)
                  continue
                  ;;
             .q)
                  exit 0
                  ;;
             esac
             echo ""
             empcmd repairs "select phone from personnel
                       dump where name = '$NAME'"
             echo ""
   done

このバージョンは 1 度の開始で複数の電話番号を検索できる利点もあります。

対話的な"phone"プログラムを実行するサンプルダイアログを以下に示します。 パーセント記号"%"は、UNIXオペレーティングシステムのプロンプトを示し、 ユーザーの入力はボールドフォントで表しています。

   % phone

   Find phone number given employee's name.
   To stop enter '.q'

   Employee name: Jones

   667-2951

   Employee name: Petersen

   978-6060

   Employee name:              (You press <Return> by mistake)
   Employee name: Mosca

   544-2243

   Employee name: .q
   %

例 5: 単純なレポート

表形式で出力をするために、"employees"という 小さいシェルプログラム例として示します。 これはすべての従業員に対して名前と電話番号を検索、 およびカウントを行いヘッダー付きで表示します。

   : PRINT LIST OF CURRENT EMPLOYEES
   echo "Current Employees"
   echo ""empcmd repairs "select name, phone from personnel"
   EMPLOYEES='empcmd repairs "select count(*) from personnel dump"'
   echo ""
   echo "Total number of Employees = $EMPLOYEES"

"employees"を入力すると以下の次の出力が作成されます。

   Current Employees

   name          phone

   Kilroy        426-9681
   Jones         667-2951
   Mosca         544-2243
   Wladislaw     723-6073
   Peterson      978-6060
   Scarlatti     961-7363
   Jordan        964-3335

   Total number of Employees = 7

例 6: より複雑なレポート

次の例として、何人かの従業員名を引数として、 その従業員の現在のすべてのローンの詳細と合計残高、 および指定された全従業員のローン残高の総合計を示します。

   : PRINT details, total, and grand total of loans
   : outstanding to the specified employees

   DATABASE=repairs
   USAGE="Usage: $0 Employee_name ..."
   case "$#" in
        0)
        echo $USAGE
        exit 1
        ;;
   esac

   for I
   do
        echo "Loans currently outstanding to $I:"
        echo ""
        empcmd $DATABASE "select date, amount from loans
                  where name = '$I'"
        echo ""
        echo -n "Total amount owing for $I: "
        empcmd $DATABASE "select sum (amount) from loans
                  dump where name = '$I'"
        echo ""
        echo ""
   done

   : construct a WHERE clause with all the names
   : given as arguments, joined by ORs

   clause="where name = '$1'"
   shift
   for I
   do
        CLAUSE="$clause or name = '$I'"
   done
   echo -n "Total amount outstanding over all of the above: "
   empcmd $DATABASE "select sum (amount) from loans dump $CLAUSE"

Jones と Mosca のローン残高を調べるには、以下のように入力します。

   loans Jones Mosca

以下にその出力を示します。

   Loans currently outstanding to Jones:

   date                         amount

    7 February 1992             $33.95
    3 April 1992                $25.00
   12 August 1992              $300.00

   Total amount owing for Jones: 358.95

   Loans currently outstanding to Mosca:

   date                         amount

   2 February 1992             $150.00
   4 May 1992                  $200.00

   Total amount owing for Mosca: 350.00

   Total amount outstanding over all of the above: 708.95


2.3 UNIXシェルからSQLコマンドのバッチの実行

empbatchコマンドは、 オペレーティングシステムから Empress SQLコマンドのバッチ処理を 実行することが可能です。 empatchは以下の構文になります。

empbatch database

database データベースディレクトリ名

empbatchコマンドは対話モードで動作します。 この処理は、プロンプトを出力しないEmpress SQLと同じです。 各問い合わせ言語の終了にセミコロン";"を使用し、 コマンドは複数行、指定することが可能です。 プログラムが構文エラーの場合、終了します。

例として、UNIXから以下のように入力した場合、

   empbatch repairs

コマンド入力のためにカーソルは、次の行で待ちます。 直接、コマンドを入力をすると

   SELECT * FROM loans
        WHERE name = "Jones";

以下のように出力されます。

   name     date                  amount

   Jones     7 February 1992      $33.95
   Jones     3 April 1992         $25.00
   Jones    12 August 1992       $300.00

<Ctrl+D> 、 <Rubout> または <Interrupt> キーを押すと、オペレーティングシステムに制御が戻ります。

UNIX コマンドファイルにEmpress SQLコマンドのバッチを記述することができ、 例えば、以下のように記述された"queries"というファイルを作成し、

   empbatch repairs << '}'
     set MSPAGER to 'more -c';
     set MSQLAUTOPAGE to true;
     select * from loans where name = "Jones";
   }

以下を入力し、バッチを実行します。

queries

queriesは、 empbatchコマンドへの入力として、 "}"文字まで読み込み、 UNIXのリダイレクション入力を使用します。