(QA) Db2 for i にACSからSQL実行した際のエラーを調べたい

ACSその他SQLインターフェースからSQL実行してエラーが発生した際、下記のようにエラー表示がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c69f9b55-d4fa-1a11-2791-187058084d4e.png)

***今回のSQLの例ではDb2 for i のテーブルを作成しています。***

SQL状態:38501
メッセージ:CPF7302 とあるので、DSPMSGDコマンドで、CPF7302を調べると、、

```
DSPMSGD RANGE(CPF7302) 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e3965435-bc8f-5bd7-440b-84d993e1a737.png)

・・・この例では、CPF7302はエラーが出ましたよ、という最後のエスケープメッセージで、この前にエラーの原因メッセージがあるはずです。。

一番上の画像のようにACS SQLスクリプト実行画面などでは一瞥でそのメッセージを調べることが出来ない場合があります。

 ***IBM i の外からのSQLを受け取って処理するサーバージョブ（デーモン）はQZDASOINITジョブ、このジョブログを調べればよい***

というのがヒントになります。

上記例ではACSの一番下の行を見ると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d7169c8e-c03e-13b3-35a0-2b6fdcb715e8.png)

このSQLを処理した、IBM i 側のジョブ名が分かります。例では ***328469/QUSER/QZDASOINIT*** だと分かります。また、ユーザーID(ユーザープロフィール）GOMAから実行されたというのもわかります。

## ジョブログを調べる方法①　超レガシー編

***男は黙って WRKACTJOBコマンド*** な世代はこれでよいと思います。
QUSRWRKサブシステム下のQZDASOINITを探します。通常複数個のQZDASOTINI ジョブが上がってるはずなので一個一個シラミツブシます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0e03fa89-a092-bec4-e304-7e6c25b1210c.png)

※WRKACTJOB -> QZDASOINITを探して -> OPT.5 でジョブ表示 -> 　から
ジョブ／ユーザー／番号　が一致する行を探します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5a7c3a70-20ff-d51a-a2d6-aae12e4c3f6f.png)

いずれ辿り着きますが、オールド感が漂いますね・・(^^;


## ジョブログを調べる方法②（レガシーだけどもGUI編）



***WRKACTJOBコマンドの代わりに Navigator for i はちょっとナイスなLooksです♪***

***Navigator for i からアクティブ・ジョブ -> ジョブ情報の処理*** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6b3a4caf-c182-d10c-fec2-95b1b3e5e77a.png)

Navigator for i だとフィルターできるのが便利ですね。***ジョブ名をQZDASOINITでフィルターします。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cb7d0756-1919-8d6c-cd72-747a62d3264f.png)

***・・・ですが、ジョブ番号がデフォルトだと表示されないので、表示に追加します。

表の右上の***カラム数*** をクリックして、ジョブ番号を探すと・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/35621e48-a398-626a-e9a6-49ed0586d79b.png)

***「数値」というがジョブ番号のようです。(^^;***　数値を選んで、右側のボックスに移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/939be0c0-08ba-a4e2-24bd-841b2607fdd6.png)

***ジョブ番号が表示されました。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/38d85993-8c2d-48a6-ff5d-081ff20dafac.png)

上記から、ACS SQLスクリプト実行画面に表示されていたジョブ番号328469を探して、ジョブログを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/72ecbfce-f162-05c1-1fff-53ff8c400e62.png)

右クリックして、ジョブ・ログを選択します。

***ジョブログを見ると、ACSに表示のエラーCPF7302の前（Navigator for i画面上では１行下）にCPF5813 ファイルが既に存在している、というエラーが出ています。これがSQLのエラーだったようです。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/15c8d4fc-8f2b-e68a-a339-f66f2ee9f285.png)

※Navigator for i ではカラムごとにフィルター設定ができるので、例えば重大度や（メッセージの）タイプなどで絞り込むと判別がしやすいと思います。


## ジョブログを調べる方法③（モダンにシュッとSQLで一発編）

・・コメント欄みていただけますと筆者も気が付かなかったことがお分かりいただけましょう‥(^^;
人間の思考が一番レガシーなんですね♪、心に刻み自分の思考モダナイゼーションにムチ打ちたいと思います♪

[IBM i サービス：JOBLOG_INFO テーブル関数](https://www.ibm.com/docs/ja/i/7.5?topic=services-joblog-info-table-function) を使用します。

ACS SQLスクリプト実行その他、IBM i接続してSQL投げられるインターフェースから、下記を実行します。

### 例1 : 基本形 QZDASOINITの該当ジョブのジョブログをすべて取得

※注：以下のサンプルはこれより上のサンプルとジョブ番号が変わっています。

```
SELECT * FROM TABLE(QSYS2.JOBLOG_INFO('328898/QUSER/QZDASOINIT'));
```

実行結果例はこちら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7644d3c0-57e0-9408-1e9c-5c271ea9c1d9.png)

このジョブが接続されてからのログ一式出力するので見づらいですね。
日付・時刻でフィルターでもいいですし、ここでは、重大度（SEVERITY) 20以上　＝　エラーとなるメッセージレベル以上　出フィルターします。

### 例2 : 応用形その1 該当するQZDASOINITジョブの重大度20以上を取得

```
SELECT * FROM TABLE(QSYS2.JOBLOG_INFO('328898/QUSER/QZDASOINIT')) WHERE SEVERITY >= 20 ;
```

実行結果例は...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/39f0e2a7-81b5-b2bf-337b-5c93ffd13641.png)

行が絞られ大分見やすいですが、肝心のメッセージテキストははるか右スクロールの彼方のようです。

手元に（左に）呼び寄せます。


### 例3 : 応用形その2 該当するQZDASOINITジョブの重大度20以上を取得、必要なカラムに表示を絞る

```
SELECT MESSAGE_ID, MESSAGE_TYPE, MESSAGE_SUBTYPE, SEVERITY, MESSAGE_TEXT, MESSAGE_SECOND_LEVEL_TEXT 
FROM TABLE(QSYS2.JOBLOG_INFO('328898/QUSER/QZDASOINIT')) 
WHERE SEVERITY >= 20
```

実行結果は...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4c48ea7b-f669-6b36-0b07-09580cc817da.png)

これなら一瞥できますね。
方法②と同じ結果が、SQL 1つでシュッと取得できました♪