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 "|";

以下の例は、DUMPREPORTを使用した例です。

    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