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

## 2.1 はじめに

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

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

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

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

UNIXシェル上から１つの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のリダイレクション入力を使用します。