はじめに
アプリケーション接続(JDBC)によりDBのテーブルデータを取得する操作はCAIプロセスの実装方法を理解していないと はまってしまう ポイントがあります。
この記事ではDBを操作するためのアプリケーション接続設定で作成したアプリケーション接続を利用して、DBのテーブルデータを取得(SELECT)する実装、および注意点を確認します。
なお、この記事は次の記事の内容を理解していることを前提としています。
- はじめてCAIを使う際に
- プロセスの作成と実行(匿名認証と基本認証)
- 割り当てステップと、各種変数フィールドの利用
- ディシジョンステップによるによる分岐処理
- ジャンプステップによる実行制御
- プロセスオブジェクトによるユーザー定義変数の利用
- DBを操作するためのアプリケーション接続設定
テーブルデータを参照する実装
テーブルが主キーを持つ場合
テーブルデータの参照時に主キーを持つテーブルを参照する場合には、CAIプロセスは主キー列のみを取得する動作となります。
主キー列のデータを取得するには次のようにCAIプロセスを作成します。
-
CAIプロセスを次の設定で作成します。
- 名前を recipe-psa-jdbcSelect とする
- 匿名アクセス を許可する
- Secure Agent にデプロイする
-
割り当てステップを追加して、出力フィールド out に クエリ として
COL1 LIKE '%10%'を設定して取得対象のデータを指定します(SQLにおけるWHERE句の指定)。

-
保存してパブリッシュします。
curlコマンドによりCAIプロセスを実行すると以下のように結果が得られます。
// curl コマンド
curl -k https://localhost:7443/process-engine/public/rt/recipe-psa-jdbcSelect
// 実行結果
{"out":["410","510","610","710","810","910","10","100","1000","101","102","103","104","105","106","107","108","109","110","210","310"]}
実行結果を見るとrecipeTest001pkに設定された主キー列の値のみが取得されていることがわかります。主キーを持たないテーブルを参照した場合には、すべての列のデータを取得できます。これはCAIプロセスの既定の動作です。
主キー以外の列も含めてデータを取得したい場合には、後述するテーブルから全列を取得する実装に従ってCAIプロセスを実装します。
テーブルから全列を取得する実装
主キーを持つテーブルのアクセス時にはCAIプロセスは主キー列のみを取得します。主キー列以外も取得するためには次のようにCAIプロセスを実装します。
-
以下のフィールドをもつ新規プロセスオブジェクト po-jdbcSelectAllColumns を作成します。

このプロセスオブジェクトは参照するテーブルの全ての列データを保持するために利用します(プロセスオブジェクトを新規に作成しない実装も可能です)。 -
CAIプロセスを次の設定で作成します。
- 名前を recipe-psa-jdbcSelectAllColumns とする
- 匿名アクセス を許可する
- Secure Agent にデプロイする
-
CAIプロセスが次の順に実行されるように各種ステップを追加して、ディシジョンステップ、ジャンプステップをスクリーンショットのとおりに設定します。

-
2つ目の割り当てステップは次のように指定します。

この処理では1つ目のアサインステップで取得した先頭行のみ取り出してtmpRowに設定(head)、先頭行を削除したデータをtmpRowsに再設定しています(tail)。 -
3つ目の割り当てステップは次のように指定します。

この処理では、主キーに対応する各列の値をDBから取得してStep1で作成したプロセスオブジェクトに設定しています(緑枠部分の処理)。
その後、各列の値を設定したプロセスオブジェクトをリスト型の出力フィールド out に 追加 しています(赤枠部分の処理)。
なお、この処理では主キー列以外の値である $temp.tmpRow.COL2 の参照時にバックグラウンドでSELECT SQLが実行されています。 -
保存してパブリッシュします。
curlコマンドによりCAIプロセスを実行すると以下のように非主キー列であるcol2の値を含む3行分のデータが得られます。
// curl コマンド
curl -k https://localhost:7443/process-engine/public/rt/recipe-psa-jdbcSelectAllColumns | jq
// 実行結果
{
"out": [
{
"col1": "36",
"col2": "val-36"
},
{
"col1": "360",
"col2": "val-360"
},
{
"col1": "361",
"col2": "val-361"
}
]
}
テーブルから全行を取得する実装
既定のクエリ操作では、該当するレコードを最大100件返します。該当する全レコードを取得するには次のように割り当てステップにおいて LIMIT 0 を指定します(未指定時にはLIMIT 100の動作)。

参照
- Qiita - IICS CAIの実装レシピ - マスターページ
- 主キー項目以外の列値を取得できない動作に関する技術情報
ERROR: Object ID not specified while reading data from DB in CAI



