# CHAPTER 4: オペレーティングシステムインターフェイス

## 4.1 はじめに

この章ではEmpress問い合わせ言語とオペレーティングシステムの関係について扱います。 Empress問い合わせ言語では以下のことが可能です。

- オペレーティングシステムからの問い合わせのサブミット
- オペレーティングシステムからのデータの読み込み
- オペレーティングシステムへの出力の送信
- オペレーティングシステムコマンドの発行

オペレーティングシステムから実行するEmpressユーティリティ (バックアップ/リカバリプログラム、データベースローダー、 インポート/エクスポートユーティリティ、および ウォームリスタートユーティリティなど)の詳細については Empress: データベース管理者ガイド を参照してください。

## 4.2 オペレーティングシステムコマンドの実行

`DO`コマンドは、引用符で囲んだ複数のオペレーティングシステムコマンドを 実行し、Empressに制御を戻します。 また、オペレーティングシステムへのエスケープ記号(!)は、 オペレーティングシステムコマンドを実行するために使用することができます。

`DO`コマンドを実行する一般的なフォーマットは以下のとおりです。

       do 'os_command';

例として、Empressセッション中にカレントディレクトリのファイルリストを 表示する場合は、以下のように用います。

       do 'ls';

カレントディレクトリ内の`"staff"`というファイルの内容を参照する場合は、 以下のように使用します。

       do 'more staff';

コマンドが終了した時点で、Empressに制御が戻ります。

## 4.3 オペレーティングシステムからの問い合わせのサブミット

ファイル中にEmpress SQLコマンドが含まれている場合、 `RUN`および`START`コマンドの後に ファイル名を指定することでそのファイル内の 問い合わせコマンドを実行することができます。 オペレーティングシステムファイルからの問い合わせをするための 一般的なフォームは以下になります。

|  |  | `|RUN |START` | `| [FROM] file_name [SET parameter {, parameter }]; |`

上記の`parameters`は、数値変数の値です。 (`parameters`の使用法についての説明は、 Empress SQL: リファレンスマニュアルの `SET`コマンドの下の数値変数セクションを参照してください。)

       RUN FROM 'phonelt';

上記のコマンドは、必要なリストを得るためのEmpress SQLステートメント を含んだ`"phonelt"`ファイルを読み込み、実行します。

次の例は、`RUN FROM file_name SET value`の使用法について示します。 この`SET`の使用法は、Empress SQL: リファレンスマニュアルの `SET`コマンドの下の数値変数セクションに詳細に説明されています。 以下のコマンドを含んだ`"findlns"`というファイルを持っている場合、

       SELECT FROM loans WHERE name = '$1'
            AND amount RANGE $2 TO $3;

"Mosca"の$100 から $200 までのローンを検索するには、 以下のコマンドを指定します。

       RUN FROM 'findlns' SET Mosca, 100, 200;

以下のSQLは、上記の指定と全く同じ意味のコマンドになります。

       SELECT FROM loans WHERE name = 'Mosca'
          AND amount RANGE 100 TO 200;

出力結果は次のとおりです。

       name                                date        amount

       Mosca                   2 February  1992       $150.00
       Mosca                   4 May       1992       $200.00

## 4.4 オペレーティングシステムからのデータの読み込み

Empressテーブルへの挿入および更新のためにオペレーティングシステムファイルから データのロードすることが可能です。 また、テーブルもテーブル定義を含むファイルから作成することができます。

オペレーティングシステムのアトリビュート値は、 改行、およびEmpressシステム変数`MSVALSEP`に 定義された特別なセパレータ文字によって、区切ることが可能です。 セパレータ文字のデフォルトは通常、<Ctrl+V>(8進では026)です。 レコードは、改行によって区切られます。 また、`MSLINECONT`変数によって定義された行継続文字列（デフォルトは 通常、バックスラッシュ"\" です。)を使用して。改行をマスク処理することにより、 複数行に渡るデータを分割できます。

### 4.4.1 ファイルからのレコード挿入

データベース上で利用するデータを含んだファイルがある場合に オペレーティングシステムからレコード挿入するための構文は以下のとおりです。

|  |  | `INSERT [INTO] table [` | `|(*) |(attr {, attr }) |SET * |SET attr {, attr }` | `|] | | |` | `|FROM |DIRECT_FROM` | `| file_name; |`

例えば、以下のデータが含まれている`"employees"`というファイルを 持っていると仮定すると

       22
       Williams
       743-0772
       50023
       Matthews
       704-9221
       250

`personnel`テーブルにこのファイルの内容をロードするためには。 次のコマンドを使用します。

       INSERT INTO personnel FROM 'employees';

上記のコマンドの結果として、 Empressは、ロードした総レコード件数を表示します。 また、エラーの場合は問題が発生した行番号を出力します。

`SELECT`コマンドの`DUMP`キーワードを使用して 別のテーブルからデータを検索することで、 テーブルにロードするために適合した形式のデータファイルを 作成することが可能です。

### 4.4.2 ファイルからのレコード更新

オペレーティングシステムからレコードを更新するための構文は以下のとおりです。

|  |  | `UPDATE table [` | `|(*) |(attr {, attr}) |SET * |SET attr {, attr}` | `|] | | |` | `|FROM |DIRECT_FROM` | `| file_name [WHERE clause]; |`

すべてのクレジット制限を更新するために、以下のデータを含んだ`"credits"` というファイルを作成します。

       550
       800
       100
       550
       300
       150

       300
       550
       300

このファイルから`personnel`テーブルを更新するためには、 以下のコマンドを使用します

       UPDATE personnel SET credit_limit FROM 'credits';

### 4.4.3 ファイルからのテーブル作成

ファイルデータからテーブルを作成することも可能です。 そのための構文は以下のとおりです。

       CREATE table_name FROM file_name;

このファイルは、必ず`DISPLAY TABLE`コマンドに `DUMP`を指定して出力したフォーマットでなければなりません。 以下の出力例は、`MSVALSEP`を""|""に設定し、 `personnel`テーブルをダンプ表示したものです。

       repairs|personnel|number|integer|integer|0|0|0|n
       repairs|personnel|name|char|char|25|1|0|n
       repairs|personnel|phone|char|char|15|1|0|n
       repairs|personnel|credit_limit|decimal|dollar|6|1|0|n

このダンプファイルを`"persdump"`と名付け、 そのファイルから`newpersonnel`というテーブルを作成する場合、 以下のコマンドを使用します。

       CREATE newpersonnel FROM 'persdump';

`CREATE`コマンドが失敗した場合は、エラーメッセージが出力されます。

### 4.4.4 パイプからの読み込み

Empressコマンドにおいて `FROM file_name` 句を使用する箇所は、 `file_name`を `!os_command`に置き換えることができます。 これは、オペレーティングシステムファイルに代わり `!os_command`の実行された出力が使用されます。

Unix の場合

  例えば、`customers`テーブルへのいくつかのコメントの入力をしたい場合、 そのコメントを含んだファイルを準備し、`nroff`コマンドを通して登録を 実行します。 `comments.n`というコメントファイルを、 `nroff`により処理し、その結果をテーブルに登録する場合、 以下のコマンドを使用します。

         INSERT INTO customers SET COMMENTS DIRECT_FROM
              'nroff comments.n';

  次の例ではパイプから読み込む機能を試すために、`CHAR`型アトリビュートを持った テーブルを作成し、`ls`コマンドの出力結果を登録することができます。

         CREATE tab1 (attr1 CHAR);
         INSERT tab1 FROM '!ls';

Windows NT の場合

  `CHAR(40,1)`のアトリビュートを持ったテーブルを作成し、 `dir`の出力結果を登録することができます。

         CREATE tab1 (attr1 CHAR(40,1));
         INSERT tab1 FROM '!dir';

## 4.5 オペレーティングシステムへの出力送信

### 4.5.1 ファイルへの出力リダイレクト

`INTO`および`ONTO`キーワードの後にファイル名を指定することにより、 Empressコマンドの結果を指定したファイルに出力します。 指定されたファイルが存在しない場合、 `INTO` および`ONTO`は、 新しくファイルを作成し、そのファイルへ指示された データを書き込みます。 指定されたファイルが既に存在している場合は、 `INTO`は、指示されたデータを上書きし、 `ONTO`は、指示されたデータを追加書き込みします。 これによって作成されたファイルは、 通常のオペレーティングシステムのファイルで、 端末への出力、プリンタへの出力、編集、コピー、他のユーザーにメールするなど 通常のファイルとして利用することができます。

以下の例は、Mosca の未払いのすべてのローンを検索した結果を `"moscloan"`というファイルに出力します。

       SELECT amount FROM loans INTO 'moscloan'
            WHERE name = 'Mosca';

次の例は、データベースのすべてのテーブルのリストを `"dblist"`ファイルに出力します。

       DISPLAY DATABASE INTO 'dblist';

上記の例で作成した`"dblist"`ファイルの最後に `personnel` テーブルの構造を追加するには、 以下のコマンドを使用します。

       DISPLAY personnel ONTO 'dblist';

この場合、ファイルの内容を置き換えるための`INTO`を使用せず、 追加するための`ONTO`を使用します。

実行した最後のSQLコマンドを`"lastql"`ファイルへ格納するためには 以下のコマンドを使用します。

       STORE INTO 'lastql';

### 4.5.2 ページ出力の表示

Empressコマンドにおいて `INTO` ファイル句を使用している箇所は、 代わりに`PAGER`キーワードを使用することが可能です。

`PAGER`は、1 回に 1 画面分の行出力と 次の画面へのプロンプトを表示する ページ処理プログラムコマンドに出力を 送ります。 ページ処理に使用される オペレーティングシステムユーティリティプログラムは、 Empressシステム変数`MSPAGER` によって定義されています。 UNIX 環境の`MSPAGER`のデフォルトは "more"コマンドです。 Windows NT 環境の`MSPAGER`のデフォルトは "more <"コマンドになります。

ページ処理モードは、 Empress システム変数`MSQLAUTOPAGE`に 任意の値に設定することにより、自動的に すべてのコマンドに`INTO PAGER`コマンドを 追加します。 `MSQLAUTOPAGE`は、デフォルトでは設定されていないため、 Empressの出力は通常ページ処理されていません。

自動ページ処理モードを設定するには、次のコマンドを使用します。

       SET MSQLAUTOPAGE TO x;

自動ページ処理モードを解除するには、次のコマンドを使用します。

       UNSET MSQLAUTOPAGE;

以下の例は、1 度に 1 画面分のコマンドの出力を参照することができます。

       SELECT FROM loans INTO PAGER;

loans テーブルは 23行分づつ表示されます。

### 4.5.3 プリンタへの出力送信

Empressコマンドにおいて `INTO` ファイル句を使用している箇所は、 代わりに`PRINTER`キーワードを使用することが可能です。

`PRINTER`は、 Empressシステム変数`MSPRINTER`に定義された オペレーティングシステムのユーティリティプログラムを 介してプリンタに直接コマンドの出力を送ります。 UNIX 環境の`MSPRINTER`のデフォルトは "`pr | lpr`"コマンドです。 Windows NT 環境の`MSPRINTER`のデフォルトは ""`print`"" になります。

システム上にプリンタが存在しない場合、 コマンドは実行されますが、何も起こしません。

以下の例は、検索結果をプリンタへを送ります。

       SELECT FROM loans INTO PRINTER;

### 4.5.4 パイプへの書き込み

Empressコマンドにおいて `INTO` ファイル句(または `ONTO` ファイル) を使用している箇所は、 ファイルを`!os_command`に置き換えることが可能です。 Empressコマンドからの出力は、 オペレーティングシステムコマンドの入力として使用されます。

以下の例は、`SELECT`コマンドからの出力を 入力として各ページ単位に日付と時間を出力とするための UNIX ユーティリティ`pr`コマンドに送信することができます。

       SELECT FROM loans INTO '!pr';

### 4.5.5 ダンプフォーマット出力

`DUMP`キーワードは、 Empressが、挿入、更新およびテーブル作成のためのロードで 使用することができる出力フォーマットを生成します。

コマンド上で`DUMP`を使用することで、すべてのタイトル、 パディング、および余分な空白行の出力を抑止し、 縮めた形式の結果を得ることができます。 `SELECT`文の`DUMP`出力は、 Empress変数`MSVALSEP`に 指定されたセパレータ文字列によって、 区切られたアトリビュート値を持つ レコードで構成されています。 通常、この文字列のデフォルトは、"<Ctrl+V>"(8進の026)です。 各レコードは、この新しい行で出力され、 `INSERT FROM file_name`コマンドを使用するために 適合した出力となります。

`DISPLAY DATABASE`コマンドで、 `DUMP`を指定するとテーブル名だけがリストされ、 データベース名を含んだヘッダーは出力されません。 `DISPLAY TABLE`コマンドでの `DUMP`出力は、通常の表示以上にテーブルの構造についての 多くの情報を含みます。 各アトリビュート定義は、行に分割され、 各情報を含むフィールドは、`MSVALSEP`に指定された 文字列によって区分けされます。 このファイル出力は、 `CREATE TABLE FROM file_name`コマンドを使用するために 適合した出力となります。

以下の例は、 `MSVALSEP`に'|'を設定した場合に すべての従業員の名前と従業員番号を ダンプ出力するコマンドです。

       SELECT number, name FROM personnel DUMP;

出力結果

       10 |Kilroy
        3 |Jones
        5 |Mosca
       17 |Wladislaw
        8 |Petersen
        4 |Scarlatti
        9 |Jordan

通常、`DUMP`キーワードを使用する場合、 その結果をファイルに出力します。 次の例では`"numbers"`というファイルに 従業員番号と名前をダンプ出力します。

       SELECT name, number
          FROM personnel
          DUMP INTO 'numbers';

`loans`テーブルのテーブル定義を`"loandefs"`ファイルに ダンプ出力する例を以下に示します。

       DISPLAY TABLE loans DUMP
          INTO 'loandefs';

この`"loandefs"`ファイルは、同じ構造のテーブルを作成するために使用されます。

### 4.5.6 Empress レポートライターのためのデータファイル生成

`DUMP`オプションと共に`REPORT`オプションが使用された場合、 出力の最初に検索されたアトリビュートとそれらのデータタイプについての情報を `DUMP` 出力します。 `REPORT`オプションを伴って生成されたダンプ出力は、 Empress レポートライターによってアクセスされるファイルとなります。 この出力フォーマットは、 レポートライターが、オペレーティングシステム上から `-f`オプションを指定して実行した場合に必要になります。 (Empress レポートライターの実行についての詳細は Empress: レポートライターマニュアルを 参照してください。

Empressのセパレータ文字列を、目に見える文字に変更する場合、 以下のように設定します。

       SET MSVALSEP TO "|";

以下の例は、`DUMP`、`REPORT`を使用した例です。

        SELECT FROM personnel REPORT DUMP;

以下は出力結果です。

       repairs|personnel|number|integer|integer|0|0|0|n
       repairs|personnel|name|char|char|25|1|0|n
       repairs|personnel|phone|char|char|15|1|0|n
       repairs|personnel|credit_limit|decimal|dollar|6|1|0|n

       10 |Kilroy    |426-9681 |500.00
        5 |Mosca     |544-2243 |750.00
       17 |Wladislaw |723-6073 | 50.00
        3 |Jones     |667-2951 |500.00
        8 |Peterson  |978-6060 |250.00
        4 |Scarlatti |961-7363 |100.00
        9 |Jordan    |964-3335 |250.00