Db2 for i Services Directory : SYSTOOLS.COMPARE_FILE 表関数①Db2テーブルの比較

## SYSTOOLS.COMPARE_FILE 表関数 で何ができる？

■表関数：SYSTOOLS.COMPARE_FILE
■カテゴリ：ユーティリティサービス
■サポート：IBM i 7.2以降

SYSTOOLS.COMPARE_FILE 表関数は、2つのデータベーステーブル（PF）に加え、PGMソースやDDSソース等を記述したソース物理ファイルの比較も可能です。比較対象もテーブルの属性と格納されているデータの両方が可能です。テーブル2(ファイル2)はリモートDb2 for i 上も可能です。（WRKRDBDIREコマンドで追加済のリモートのDb2 for 
iを参照できる。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/359631d7-4ca1-1b05-1783-f6365f3cc2e6.png)

## SYSTOOLS.COMPARE_FILEの実行例
使用したテーブルの設定値などは後に記載しています。
### 実行例1 属性の比較 ATTRIBUTES *YES　
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'GOMALIB', FILE2=>'TOKMSP',
                                       COMPARE_ATTRIBUTES=>'YES',
                                       COMPARE_DATA=>'NO'
                                       ));
```
実行結果例は下記のようになります。
ジャーナルの取得状況の差異、初期レコード数、増分レコード数などの相違が返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/527793a0-ca1b-a029-2d43-bc6ca0da0d0d.png)

### 実行例2 データの比較 COMARE_DATA *YES
こちらはデータの差異を検索したものです。２つのレコードについて差異を発生させています。
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'GOMALIB', FILE2=>'TOKMSP',
                                       COMPARE_ATTRIBUTES=>'NO',
                                       COMPARE_DATA=>'YES'
                                       )
```
実行例はこちら
レコードのデータについて差異のある2レコードのRRNが返されます。
値自体はこの関数では返さないので、キー値その他は別途RRNから調べる方法が必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a708dba2-d088-1227-639e-1dc79cae3ef2.png)

※ ***COPARE_DATA=>'QUICK' と指定すると、最初の1行だけが返されます。YESより処理時間は高速です。YESの場合、全件検索するので相応な処理負荷、処理時間が必要です。***

### 実行例3 CCSIDの異なるテーブルでの比較　ファイル属性比較
カラムレイアウトなどは共通ですが、PFのCCSIDが異なるファイル間で比較してみました。
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'WESBDEMO', FILE2=>'TOKMSP',
                                       COMPARE_ATTRIBUTES=>'YES',
                                       COMPARE_DATA=>'NO'
                                       ));
```
すると、下記のような結果が返ります。ファイル、カラムのCCID値の差異等も返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3776eb04-7d5c-63f9-5966-785a0d8c881b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2451b7a8-3919-54ed-7785-4019c0211fe3.png)

### 実行例4 CCSIDの異なるテーブルでの比較　データの比較
実行例3のファイルのデータの中身を比較しようとすると、、
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'WESBDEMO', FILE2=>'TOKMSP',
                                       COMPARE_ATTRIBUTES=>'NO',
                                       COMPARE_DATA=>'YES'
                                       ));
```
下記のようなカラムの定義が異なるので比較できない、という旨のメッセージが返され比較できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/55891b83-03cd-1838-769b-0d92eccb3c9a.png)


### その他のコマンド例
リモートシステムのファイルを比較する場合は、FILE2の方にRDB2というパラメーターを追加します。
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'DEMOLIB', FILE2=>'TOKMSP', RDB2=>'IBMIV7R4', 
                                       COMPARE_ATTRIBUTES=>'YES',
                                       COMPARE_DATA=>'YES'
                                       ));
```

Db2 SMPフィーチャーが導入済みの場合、以下のような検索多重度を指定できます。
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'TOKMSP', 
                                       LIBRARY2=>'GOMALIB', FILE2=>'TOKMSP',
                                       COMPARE_ATTRIBUTES=>'NO',
                                       COMPARE_DATA=>'YES,
                                       PARALLEL_DEGREE=>'10'
                                       ));
```

## サンプル：使用したテーブルの設定値
最初の例では以下のようにカラムレイアウトは共通ですが、オブジェクトの属性（作成ユーザーやテーブルのCCSIDなど）が異なる２つのテーブルを用意しました。後ほど確認しますが、カラム内のデータも２件のレコードについて相違を作ってあります。
### テーブル①　DEMOLIB.TOKMSP
※テーブル②と差異のある一部を記載します。
***DSPFDコマンド***で確認します。 ***初期レコード数：10,000 初期レコード数 1,000*** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cea54494-21d2-5ee3-7fb9-754204f3d50a.png)
テーブル（ファイル）の***CCSID 5026*** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0e6e7c4c-076b-e77e-3a1b-03b112f4c7ce.png)
次に***DSPOBJDコマンド*** でオブジェクト所有者を確認します。 ***GOMA*** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3973937b-abda-ff93-63c4-bf66076b9f14.png)
また、***DSPFFDコマンドでカラムのCCSIDを確認***します。 ***5026と290***になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/837d98ae-767d-7954-038f-2172858a1ea0.png)

### テーブル② GOMALIB.TOKMSP
***DSPFDコマンド***で確認。 ***初期レコード数：30,000 増分レコード数 3,000*** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/90d33239-b9fc-8d52-6585-7f8a6ff4ca50.png)
次に***DSPOBJDコマンド*** でオブジェクト所有者を確認します。 ***QDFTOWN*** になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4abc85f9-7bb3-966d-ec64-f07a0fd3ff67.png)

### テーブル③ WESBDEMO.TOKMSP
テーブル（ファイル）の***CCSID 5035*** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f2c51303-8e5b-7d01-c7a7-716ca428bfb2.png)
また、***DSPFFDコマンドでカラムのCCSIDを確認***します。 ***5035と1027***になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/fd1d403b-8f64-fcaa-22c1-4d8d710932b4.png)

## 参考マニュアルページ
IBM Docs IBM i 7.5 COMPARE_FILE 表関数 : https://www.ibm.com/docs/ja/i/7.5?topic=services-compare-file-table-function