# CHAPTER 5: データのエクスポートとインポート

## 5.1 はじめに

データのエクスポートとインポートに関するユーティリティは３つあります。 ３つのユーティリティは

- `empexpt` Empressデータベースからテーブルをエクスポートします。
- `empimpt` `empexpt`によって生成されたデータから Empressデータベースへテーブルをインポートします。
- `empdbld` オペレーティングシステムファイルのデータを Empressデータベースへインポートします。

これらのユーティリティ・プログラムはオペレーティングシステムを越えて、 データベーステーブルをエクスポート、インポートするために使われることが あります。

## 5.2 データベースからのデータのエクスポート

`empexpt` は、データベースからテーブルのエクスポートを行います。 `empexpt`の構文は以下のとおりです。

       empexpt [-dehvx] outfile database [table {table}]

※詳細はempexptマニュアルページを参照してください。

`database` | Empressデータベースを指定します。
`table` | エクスポートするテーブルを指定します。 コマンドライン上でテーブルが指定されない場合、 データベース内のすべてのテーブルがエクスポートされます。
`outfile` | 出力するファイル名を指定します。 プログラムを中断した場合、このファイルは削除されます。 出力ファイルを"-" と指定した場合、標準出力へ出力されます。

コマンド・オプション

`-d` | データのエクスポートを抑止します。テーブル定義、 コメント、ロックレベル、インデックス、範囲チェックのみをエクス ポートする場合に指定します。
`-e` | エラーを無視して処理を続行します。
`-h` | エクスポートファイルのヘッダ部にユーザー情報文字列を挿入します。 この文字列は、インポートユーティリティでヘッダのみを表示する 指定がされた場合に表示されます。
`-v` | 冗長モードでの実行。 実行中の経過報告が標準出力に出力されます。 このオプションが指定されない場合は、標準エラー出力に 書き出されるテーブル名、並びにエラーメッセージを除けば、 実行はメッセージ無しで実行されます。
`-x` | 指定されている場合、テーブル・データのデータエラーのためのチェックを行いません。 確実なデータで、信頼がある場合のみ、チェックを行わないようにします。 指定がない場合は、プログラムはどのようなデータエラーも報告し、終了します。

注意事項

1. コマンドライン上に指定されたテーブルは、エクスポートされます。 コメント、ロックレベル、インデックス、範囲チェック、参照制約は データともにエクスポートされますが、特権はエクスポートされません。
   `データベース:テーブル`のフォーム（問い合わせ言語で有効な構文としての)は、 利用することはできません。 テーブル名の複数指定はスペースをよって区切ります。

2. コマンドライン上にテーブル指定がない場合、すべてのテーブルがエクスポートされます。

3. データ辞書から明示的なデータのエクスポートすることを試みるべきではありません。 しかしながら、"-d"オプションを使ってデータ辞書テーブル中のコメント、 ロックレベル、インデックスをエクスポートが可能です。

4. ビューテーブルをエクスポートする場合、そのビューの基になっているテーブルを 最初にエクスポートする必要があります。

5. エクスポートコマンドを実行中に <`インターラプト`(Ctl^c)>が押された場合、 このプログラムがクリティカルな処理中の場合、 中断されません。 通常、それを数回押すことでプログラムを止めることができます。

6. エクスポートをおこなうためには、 テーブル定義のエクスポートをするためにEmpressの`DISPLAY`特権、 データのエクスポートをするために`DISPLAY`特権 と `SELECT`特権を 持つ必要があります。 エクスポート これらの特権なしにテーブル・データをエクスポートすることはできません。

7. ファイルはバイナリモードで転送してください。(FTPなどにおいて)

8. `tabzero`ファイルは、`empexpt`ではエクスポートされません。

## 5.3 Empress エクスポートファイルからのデータのインポート

`empimpt`は Empressエクスポートファイルからデータベースへテーブルをインポートします。 構文は以下のとおりです。

       empimpt [-cdeghiklprtvx] infile database [table {table}]

※詳細はempimptマニュアルページを参照してください。

`database` | Empressデータベースを指定します。
`table` | インポートするテーブルを指定します。 (エクスポートされたときに指定された名前と一致するテーブル名)
`infile` | `empexpt`によって作成されたデータフォーマットを含む入力ファイル。 入力ファイルとして "-" が指定された場合、入力データは標準入力から 読み込みます。

コマンド・オプション

`-c` | コメントのインポートを抑止します。
`-d` | テーブル情報のみをインポートし、データをインポートしません。 デフォルトではデータもインポートするようになっています。
`-e` | "-e"オプションが設定され、エラーが発生した場合、 トランザクションを取り消し、次のテーブルまたはビューの インポートをしようとします。 "-e" が設定されていない場合は、エラー時において処理を続行しません。
`-g` | grant 特権情報をインポートします。 "-g" が設定されていない場合は、grant 特権情報はエクスポートファイルから インポートされません。
`-h` | ヘッダー情報を単に表示します。
`-i` | インデックスのインポートを抑止します。
`-k` | 参照制約のインポートを抑止します。
`-l` | ロックレベルのインポートを抑止します。
`-p` | `SELECT`特権 と `DISPLAY`特権をインポートされる すべてのテーブルのすべてのユーザーに付与します。
`-r` | 範囲チェックのインポートを抑止します。
`-t` | テーブルの作成を抑止します。 "-t"の指定により、処理はすべてのテーブルがすでに存在したもとして仮定します。 "-t"が指定されていない場合は、既存のものと重複しないテーブルは作成されます。
`-v` | 冗長モードで実行されます。 プログラム実行中のステータスメッセージを標準出力に出力します。 通常、標準エラーに出力されるエラーメッセージを除けば プログラムはメッセージなしに実行されます。
`-x` | 指定されている場合、テーブル・データのデータエラーのためのチェックを行いません。 確実なデータで、信頼がある場合のみ、チェックを行わないようにします。 指定がない場合は、プログラムはどのようなデータエラーも報告し、終了します。

注意事項

1. テーブル名はキーワード`TABLE`によって先行されていない場合があります。 コマンド上にテーブル名が与えられていない場合は、入力ファイル内のすべての テーブルがインポートされます。テーブル名は、スペースで区切られている必要があります。

2. プログラムのテーブルのインポート処理の順番は以下のようになります。

   - テーブルの作成
   - データの挿入
   - インデックスの作成
   - ロックレベルの定義
   - テーブルコメントの作成
   - 範囲チェックの作成
   - アトリビュートコメントの作成

3. インポートされたテーブル(システムテーブルは除く)が既にデータベース内に 存在する場合、エラーが発生します。 "-e"オプションが指定されていない場合、以下の点が適用されます。（エラー処理について）

   - テーブルにインデックス、コメント、ロックレベル、範囲チェック、参照制約は 作成されません。メッセージは出力されません。

   - テーブルに何らかのロックレベルが定義されている場合においても、 登録中は、このテーブルはテーブルレベルのロックがかかります。 テーブルにロックができない場合（使用中の場合など)テーブルに対して登録は 行われず、メッセージが出力されます。この場合、 後でテーブルに対してデータの登録を行ってください。

   - 登録が続けれられる場合、データはオリジナルのアトリビュートと 同じ名前を持つアトリビュートと対応されます。 存在しないアトリビュートに対して、データがある場合、プログラムは 次のテーブルへスキップします。 テーブルの追加されたアトリビュートには "null"が設定され、 それが`NOT NULL`と定義されている場合、プログラムは 次のテーブルへスキップします。

   - データがテーブル内の対応したアトリビュートのデータタイプと適合する場合は、 それぞれのレコードが挿入され、また、適切なデータタイプへの変換は自動的に行われます。

     例えば`INTEGER`のアトリビュートから変換されたデータは `LONGINTEGER`のアトリビュートに挿入できますが、 `LONGINTEGER`のアトリビュートから`INTEGER`のアトリビュート 場合、数値が大きすぎる場合は`LONGINTEGER`のアトリビュートデータの `INTEGER`のアトリビュートへの挿入は不可能です。

     同様に、`INTEGER`のアトリビュートから変換されたデータは、十分な長さを持つ `CHAR`のアトリビュートに挿入できますが、`CHAR`のアトリビュートから `INTEGER`のアトリビュートに対して、データが数字ではない場合、 `INTEGER`のアトリビュートに挿入することはできません。 また、`CHAR` タイプ 3 のアトリビュートから変換されたデータは `TEXT`のアトリビュートに挿入することはできますが、 `CHAR`アトリビュートが値として十分な長さを持つ場合のみ `TEXT`のアトリビュートからのデータを`CHAR` タイプ 3 のアトリビュート に挿入することができます。

   - テーブルに挿入される最初のレコードのデータが、 マップされたアトリビュートのデータタイプと一致せず、 データ変換または範囲チェックのために登録が失敗した場合は、 プログラムはデータがテーブルに適合しないと仮定し、このテーブル での登録をこれ以上行いません。 以降のレコードで不適切なデータがある場合はレコードはスキップされます。 レコード挿入により、重複の許可数を越えてしまう場合もレコードはスキップされます。

4. テーブルの所有者はエクスポートおよびインポート処理では保存していません。 インポートされたテーブルは、インポートプログラムを実行しているユーザー名で作成されます。

5. すべてのインポートしたテーブルはデータベースディレクトリ内に作成されます。

6. テーブルをインポートするためには、データベース内にテーブルを作成するための特権を 持つ必要があります。つまり、`sys_tables`に`INSERT`特権が必要です。 インポートされるテーブルのいずれかが存在している場合、それらのテーブルへレコードを挿入 するための`INSERT`特権をもつ必要があります。

7. データ辞書へ明示的なデータのインポートすることを試みべきではありません。 すべてのデータ辞書に対し、`ALTER`特権を持っている場合、 コメントとロックレベルをインポートが可能です。 また、`INDEX`特権を持っていれば、インデックスのインポートが可能です。

8. クリティカルな処理中に <`インターラプト(Ctl^c)`> キーが押された場合、 プログラムは停止しません。 通常、それを数回押すことでプログラムを止めることができます。

9. ファイルはバイナリモードで転送してください。(FTPなどにおいて)

10. Empress 4GLアプリケーションに関連したデータをインポートした場合、 `emp4gl`とともにそれぞれ "-c" (コンパイル)および "-l"(リンク)オプションを使い アプリケーションのコンパイルおよびリンクが必要です。

11. `empexpt`のコマンドラインでテーブルが指定されない場合 システムテーブル`sys_tables` と `sys_attrs`の すべてのコメント、ロックレベルとインデックスはエクスポートされます。 他のデータベースに正常にこれらの情報をインポートする場合には、 その2番目のデータベース(インポートするデータベース)のテーブル上に 適切な特権を設定する必要があります。 コメントおよびロックレベルをインポートするための`ALTER`特権、 インデックスをインポートするための`INDEX`特権が必要です。

    ロックレベルとインデックスのシステムテーブルの暗黙的な検索での利用は、 データベースディレクトリ内の`tabzero`ファイルの 適切な変数に正しく設定することで効果があります。 ロックレベルまたはインデックスがインポートされた場合、 この趣旨のメッセージが表示されます。

## 5.4 オペレーティングシステムからのデータのインポート

`empdbld` は、オペレーティングシステムからEmpressデータベースへ データをロードするための汎用的なプログラムです。 このローダーは固定長のASCIIデータを扱い、以下のことを行います。

- 1 つの入力ファイルから、データベースの複数テーブルへデータをロード。
- テーブルのすべてのアトリビュートまたは一部のアトリビュートに "null"の設定をし、データをロード。
- 自動的にデータタイプを変換し、あらゆるEmpressデータタイプの データをロード。
- 特定のアトリビュートに入力レコードフィールドをマップ
- エラーメッセージおよび簡略な統計のためのログファイルの生成
- ロードが不可能なレコードの"拒否"ファイルの生成
- 入力ファイル内の無効なデータの検査

`empdbld`の構文は以下のとおりです。

       empdbld [-c] [-d [COUNT]] [-r reject_file] database spec_file [data_file]

`database` | データがロードされるデフォルトのEmpressデータベース。
`spec_file` | データのロード方法を記述した仕様ファイル。
`data_file` | ロードするデータを含んだファイルで、データは固定長のASCII データでなければなりません。 data_fileが指定されない場合、データは標準入力から読み込まれます。

オプション

`-c` | データファイルの無効なデータをチェックします。 このオプションにおいて、データのロードは抑止されます。 プログラムはデータのフォーマットとデータタイプをチェックしますが、 ユニークインデック付きのアトリビュートに対する値の重複チェックは 行われません。
`-d` | 仕様ファイルとデータファイルを読み、 マップされたアトリビュートへ格納するための それぞれのデータ値を出力します。 これは仕様ファイルにおいて、 入力レコードが正しくアトリビュートに マップしているかを視覚によりチェックするために提供されています。 オプションの`COUNT`は、処理する入力レコード数を指定します。 `COUNT` が指定されない場合、すべてのレコードが読み込まれ、すべてのデータが 出力されます。
`-r` | ロードに失敗したレコード(および "-c"が与えられ、失敗した場合)の 情報を含む"reject_file"を生成します。

注意

1. レコードは、仕様ファイルの指示に従い、データファイルから読み込まれ、 データベースへロードされます。

2. データファイルは固定長ASCIIデータでなければなりません。 仕様ファイルは次のセクションで記述されている構文に合わせる必要があります。

3. ロードされたデータとアトリビュートのデータタイプが一致しない場合や ユニークインデックス付きのアトリビュートに重複した値が挿入された場合、 エラーが発生します。 また、"null" 値の入力仕様があり、 `NOT NULL`として定義されているアトリビュートに対し "null" 値が挿入された場合、 プログラムはメッセージを出力し、データをロードする前に停止します。

4. 終了時に`empdbld`は、読み込んだレコード数と拒否したレコード数を標準出力に出力します。

5. ロードするテーブルに対して、 `INSERT`特権を持つ必要があります。

6. <`インターラプト`>キー(Ctl^c)を押すとプログラムは停止します。

### 5.4.1 仕様ファイル

仕様ファイル`spec_file`は、 データフィールドを どのようにデータベース、テーブル、アトリビュートに マップされるかを記述します。 このファイルの構文は以下のとおりです。

       LENGTH record_length table_definition {table_definition}

`record_length` | 入力ファイル中のレコード長を指定します。 (適切な end-of-record　バイトが含まれます。) ※入力ファイル中の最大レコード長を指定します。
`table_definition` | 入力データのレコードがどのようにテーブルにマップされるかを指定します。 それぞれの入力レコードは、指定されたテーブルに 1 レコードして登録されます。 複数の`table_definition`を利用する場合、 それぞれのテーブルは同じ数のレコードを受け付けなければならないことに 注意してください。（それぞれのテーブルに同じレコード数、登録されます。）

`table_definition`の構文は以下のとおりです。

       INTO [TABLE] [database:]table

|  |  | `([ATTRIBUTE] attribute` | `|POSITION |POS` | `| (start:end) |` | `[format_clause] [nullif_clause]`

|  |  | `{, [ATTRIBUTE] attribute` | `|POSITION |POS` | `| (start:end) |` | `[format_clause] [nullif_clause]} )`

`table`は、テーブル名を指し、 キーワード`TABLE`を前につける場合もあります。 オプションの`database`(データベース名)プリフィックスは、 コマンド行上に指定されるデフォルトのデータベースと置き換えるために使用されます。 二度以上テーブルを指定するとエラーを引き起こします。 ビューがテーブルの代わりに使用されることがありますが、 多くても 1 つ程度のビューを使用するようにしてください。

`attribute`は、テーブル内のアトリビュート名を指し、 キーワード`ATTRIBUTE`を前につける場合もありますが、 `table.attribute` または `database:table.attribute` の形式にしなくても構いません。(Empress SQLと同様) 二度以上アトリビュートを指定するとエラーを引き起こします。 名前が指定されていないテーブルアトリビュートは、"null"値を挿入します。 名前が指定されていないアトリビュートが、`NOT NULL`として定義されている場合、 エラーを出力し、データーをロードする前にプログラムを停止します。

`POSITION`キーワード（オプションとしての`POS`)は、 アトリビュートに挿入するデータのフィールド仕様の前に必ず指定する必要があります。 フィールド仕様は`start` と `end`の２つの数値からなります。 これらうの数値は、レコード内データの開始および終了位置を決定します。 （それぞれの入力レコードの最初の位置は１で、最終位置は`record_length` になります。） `POSITION`は常に入力レコードの開始位置と関連し、 `end`は`record_length`と等しいかそれより小さくなくては なりません。

フィールドのデータはアトリビュートのデータタイプへ自動的にデータ変換され、 アトリビュートに登録されます。 適切に指定されている場合では、 明示的な小数点および浮動小数点の指数"`e`"、文字（大文字または小文字)、 "`+`/`-`" の符号を認識します。

record_lengthは、レコード長を示します。 `spec_file`は、仕様ファイルでデータのマッピングを指定します。 データファイル`datafile`は、 ユーザーによってエディタ（"vi"のような)またはプログラムから作成され、 また、表示されない行の終わりの文字は`record_length`の値を 決定する場合に含まれることに注意してください。 典型的な行の終わりの文字は"`\n`"になります。

"\n"は、改行(16進 0xa)で、"\r"は、復帰 (16進 0xd)です。 したがって、3 つの印刷の文字 123 を含んでいるファイルは、 恐らくウインドウズでは5、UNIXでは 4 のレコード長さ持っています。 また、データファイルが"vi"のようなエディタで作成された場合、 ファイルの最終行は、多くの場合、それに先行する行より1文字短いことに 注意してください。 最終行に"\n"文字(またはスペース)を単に加えることにより、この行を得ることができます。 ファイル内のすべての行は同じ長さであり、 `record_length`は、非印字文字を含め計算することが重要な点になります。

### 5.4.2 FORMAT 句

`FORMAT`句は、暗黙的なデータフォーマットをサポートするためのオプションです。 アトリビュートのデータタイプに自動的に変換において、 明示的なフォーマット（小数点や指数のような）を無視しません。

`FORMAT`句の構文は以下のとおりです。

       FORMAT (|DECIMAL (n)     |)
               |DEC (n)         |
               |FLOAT (n, e)    |
               |DATE (picture)  |

キーワード`DECIMAL`(オプション `DEC`)は、数値フィルード内の 暗黙的な小数の数字 ("n"によって指示される)を提供します。 フィールドの最後の"n" バイトは、小数として扱われます。 このデータはフィールド内では右づめされている必要があります。

このフォーマットの仕様において、明示的に小数点を含んでいるデータは無視されることに 注意してください。（暗黙的でなくてはなりません。）

キーワード`FLOAT`は、 小数の数字 "n" と浮動小数点フィールドの"e" 指数を提供します。 フィールドの最後の"e" バイトは、指数として、 それ以前の "n" バイトは小数として扱われます。 このデータはフィールド内では右づめされている必要があります。

データに明示的な小数点が含まれている場合、フォーマット仕様全体が無視されることに 注意してください。 フォーマット仕様の指数部は、 フィールドに文字または記号(先頭の記号を除く)が出現する場合は無視されます。

キーワード`DATE`は、固定長の日付フィールドのを解釈するための ピクチャー(書式)を提供します。 ピクチャー(書式)は、引用符で囲まれた文字列で、その文字列中の 特別な文字は、入力フィールド内で一致した文字の扱いを コントロールするために利用されます。 また、ピクチャー(書式)の長さは、フィールドの長さを越えることはできません。 ピクチャー(書式)は、以下のとおりです。

表 5-1: FORMAT句の日付ピクチャー(書式)変換

文字 | 説明
`Y,y` | 数字で年。 2バイトかそれ以下の年は20世紀と想定されます。
`M,m` | 数値で月
`A,a` | 英字で月
`D,d` | 数字で日(月の)
`H,h` | 時間
`T,t` | 分
`S,s` | 秒
その他 | その他のすべての文字 (例えば、空白、 "`/`" または "`:`") 入力フィールドの一致する文字は無視されます。

### 5.4.3 NULLIF 句

`NULLIF`句は、 "NULL"をアトリビュートの値として入力するための条件を 指定することを可能にします。 この条件は常に入力レコードの特定のデータ値によります。

"NOT NULL"と定義されたアトリビュートに`NULLIF`句を指定するとエラーになります。 この場合、プログラムはメッセージを出力し、データのロードを開始する前に停止します。

`NULLIF`句の構文は以下のとおりです。

       NULLIF (null_spec {, null_spec})

それぞれの`null_spec`に "null"値の入力条件を指定します。 これらの条件は全体として暗黙的に "OR"で結合されます。

`null_spec` は、以下のとおりです。

       |POSITION| (start:end) = "string"
       |POS     |

条件は入力レコードの フィールドの 開始位置`start`と終了位置`end`の間の値が、 引用符で囲まれた文字列`string`に等しいかを指定します。 フィールド位置(`start` と `end`)は、 アトリビュートにマップされたデータの一部のレコード内のオフセットとして ではなく、入力レコードの開始位置からのオフセットとして与えられています。 （位置は常に入力レコードの開始として関連付けれ、 終了位置`end`は、レコード長`record_length`と 等しいかそれより小さくなくてはなりません。) `string`の長さはフィールドの長さと等しくなくてはなりません。 (つまり、`end` - `start` + 1).

### 5.4.4 例

以下の例ではデータベース "repairs"に基づきます。 例のスタート時はこれらのテーブルは、空の状態であるとします。

例 1

`personnel`テーブルは以下の構造を持ちます。

       number        integer
       name          char (25, 1)
       phone         char (15, 1)
       credit_limit  dollar (6, 1)

`personnel`テーブルに以下のデータをロードします。

       10Kilroy  426-9681 500.00
       5 Mosca   544-2243 750.00
       3 Jones   667-2951 500.00
       8 Peterson978-6060 250.00
       9 Jordan  964-3335 250.00

個々のレコードの長さは 26 (改行のための1文字を含め)文字であり、 仕様ファイルは以下のようになります。

       LENGTH 26
       INTO personnel
            (number POS (1:2), name POS (3:10),
             phone POS (11:18), credit_limit POS (20:25))

仕様ファイルが "spec.1" でデータファイルを "data.1"とした場合、 オペレーティングシステムのプロンプト上でチェックのコマンドを実行します。

       empdbld -c repairs spec.1 data.1

以下はこのチェックコマンドでの出力結果

         *** 概略 ***
       レコード読込数 = 5
       リジェクト数   = 0

次にオペレーティングシステムのプロンプト上で以下のコマンドでデータをロードします。

       empdbld repairs spec.1 data.1

以下はこのチェックコマンドでの出力結果

         *** 概略 ***
       レコード読込数 = 5
       リジェクト数   = 0

例 2

`personnel` の情報が次のように 2 つに分かれている場合、

           *** pers1 ***                 *** pers2 ***

       number     integer            number         integer
       name       char (25, 1)       credit_limit   dollar (6, 1)
       phone      char (15, 1)

仕様ファイルに以下のような記述をすることで同じデータをロードすることができます。

       LENGTH 26
       INTO pers1
            (number POS (1:2), name POS (3:10), phone POS (11:18))
       INTO pers2
            (number POS (1:2), credit_limit POS (20:25))

1 つ以上のテーブルにロードを行う場合、 それぞれのテーブルに同数のレコード数を登録するように しなけれならないことに注意してください。

例 3

`personnel` テーブルに加えて、`loans` テーブルがあり、

       name      char (25, 1)
       date      date (1)
       amount    dollar (6, 1)

`personnel` と `loans` にロードされるデータとして `data.3`ファイルに以下のようなデータが含まれているとします。

       10Kilroy  426-9681 500.00 16/02/92 250.00
       5 Mosca   544-2243 750.00 02/02/92 150.00
       5 Mosca   544-2243 750.00 04/05/92 200.00
       3 Jones   667-2951 500.00 07/02/92  33.95
       3 Jones   667-2951 500.00 03/04/92  25.00
       3 Jones   667-2951 500.00 12/08/92 300.00
       8 Peterson978-6060 250.00 06/06/92  50.00

`personnel`テーブルには、 それぞれの名前につき 1 レコードのみをロードする必要が ありますが、 個々のローン情報は "loans"テーブルにロードしなければなりません。 この場合、以下の2つの方法のどちらかでロードすることができます。

1. 同じデータファイルを用いて、1回に1つのテーブルに対しロードします。 つまり、それぞれ適切な仕様ファイルを用いて `empdbld`を 2 度実行するということになります。

2. データをテンポラリーテーブルにロードし、 問い合わせ言語を使用して 2 つのテーブルにデータを振り分けます。

1 回に1つのテーブルに対し、データをロードする場合。

  最初に問い合わせ言語を使い、 `personal`テーブルの`number`アトリビュートにユニークインデックス を作成することで、重複したレコード（ここでは３レコード）を拒否されます。例えば、

         CREATE UNIQUE INDEX ON personnel(number);

  仕様ファイル "spec.3"は、次のとおりです。

         length 42
         into personnel
              (number pos (1:2), name pos (3:10),
               phone pos (11:18), credit_limit pos (20:25))

  `empdbld`を実行したときに重複レコードによってエラーメッセージが出力されます。

         empdbld repairs spec.3 data.3

         *** Data Error ***
              アトリビュート 'number' に対して重複した値が挿入されました。,レコード 3
      はリジェクトされました。

         *** Data Error ***
              アトリビュート 'number' に対して重複した値が挿入されました。,レコード 5
      はリジェクトされました。

         *** Data Error ***
              アトリビュート 'number' に対して重複した値が挿入されました。,レコード 6
      はリジェクトされました。

            *** 概略 ***
         レコード読込数 = 7
         リジェクト数  = 3

  `loans`テーブルをロードするには、以下の仕様ファイルを持ちます。

         LENGTH 42
         INTO loans
              (name POS (3:10), 'date' POS (27:34)
               FORMAT (date ("dd mm yy")),
               amount POS (36:41))

  上記の例の日付フォーマットの指定において、 データが正しくロードされたことを確かめます。

テンポラリテーブルを用いたデータのロードをする場合。

  以下の SQL コマンドは２つのテーブルのアトリビュートを結合し、 テンポラリテーブルを作成します。

         SELECT name, number, phone, credit_limit,
              date, amount FROM loans, personnel INSERT INTO temp;

  これにより、以下の構成を持った`temp` テーブルが作成されます。

         name          char (25, 1)
         number        integer
         phone         char (15, 1)
         credit_limit  dollar (6, 1)
         date          date (1)
         amount        dollar (6, 1)

  次に、以下の仕様ファイルを用いてテンポラリテーブルにデータをロードします。

         LENGTH 42
         INTO temp
              (number POS (1:2), name POS (3:10),
               'date' POS (27:34) FORMAT (date ("dd mm yy")),
               phone POS (11:18), credit_limit POS (20:25),
               amount POS (36:41))

  アトリビュートの順序は、関係ないことに注意します。 最後に、問い合わせ言語を使い、データを `temp` から `personnel` および `loans`に移動します。

         SELECT UNIQUE number, name, phone, credit_limit FROM temp
              INSERT INTO personnel;
              SELECT name, date, amount FROM temp
              INSERT INTO loans;

例 4

データファイルに暗に含まれたデータフォーマットを 使用している場合は、 `FORMAT`句を使います。 以下のデータは、`loans`テーブルに 登録されているとします。

       Kilroy  25000Feb16'92
       Mosca   15000Feb 2'92
       Mosca   20000May 4'92
       Jones    3395Feb 7'92
       Jones    2500Apr 3'92
       Jones   30000Aug12'92
       Peterson 5000Jun 6'92

このデータおいて、 position (1:8)　は "name"であり、 position (9:13) は、暗に小数点2桁の"amount"であり、 (つまり 25000 は $250.00を表します。) position (14:21)は、"date" になります。

このデータをロードするための仕様ファイルは、

       LENGTH 22
       INTO loans
       (name POS (1:8), amount POS (9:13) FORMAT (dec(2)),
        'date' POS (14:21) FORMAT (date("aaadd yy")))

例 5

`loans` テーブルのローン金額を `FLOAT`データとして、次のように保存した場合、

       name     char (25, 1)
       date     date (1)
       amount   float

データは以下のように読み込むことができます。

       Kilroy  2.500000e+02Feb16'92
       Mosca   1.500000e+02Feb 2'92
       Mosca   2.000000e+02May 4'92
       Jones   3.395000e+01Feb 7'92
       Jones   2.500000e+01Apr 3'92
       Jones   3.000000e+02Aug12'92
       Peterson5.000000e+01Jun 6'92

この場合、以下のような仕様ファイルを用います。

       LENGTH 28
       INTO loans
            (name POS (1:8), amount POS (9:20),
             'date' POS (21:28) FORMAT (date("aaadd yy")))

"amount"のデータフォーマットが暗黙的である場合は、

       Kilroy   250000002Feb16'92
       Mosca    150000002Feb 2'92
       Mosca    200000002May 4'92
       Jones    339500001Feb 7'92
       Jones    250000001Apr 3'92
       Jones    300000002Aug12'92
       Peterson 500000001Jun 6'92

このような仕様ファイルになります。

       LENGTH 26
       INTO loans
            (name POS (1:8), amount POS (9:17) FORMAT (float(6,2)),
             'date' POS (18:25) FORMAT (date("aaadd yy")))

例 6

`NULLIF` 句はアトリビュートが null 値を取る場合の条件を指定します。 `personnel`テーブルにロードされるデータが以下の場合、

       10Kilroy    426-9681  500.00
       5 Mosca     544-2243  750.00
       3 Jones     667-2951  500.00
       8 Peterson  978-6060  250.00
       9 Jordan    964-3335  250.00

最後のカラムは、ロードされる "credit limits" を表します。 "Jones" と "Kilroy"に "credit limits" がないとした場合、 仕様ファイルは次のようになります。

       LENGTH 26
       INTO personnel
            (number POS (1:2), name POS (3:10), phone POS (11:18),
             credit_limit POS (20:25) nullif (POS (3:7)="Jones",
                                              POS (3:8)="Kilroy"))