SQL
SQL processor は、プロジェクトに設定済みのデータソース経由でデータベースに接続し、SQL を実行して、結果を配列として指定した変数に格納します。後続のノードはその変数から結果を読めます。
クエリには $1、$2 のようなプレースホルダを書けます。実際の値は SQL Type Arguments で別に設定するので、値を SQL 文字列に連結する必要はありません。
プロパティ
ノードのプロパティパネルです。Data Source、SQL、ResultField の 3 つは必須で、未入力のうちは赤枠で表示されます。

Data Source(必須)
接続先のデータベースを、プロジェクトに作成済みのデータソースから選びます。隣の Add から新規作成に直接移動できます。データソースは Settings → Data Source で作成し、PostgreSQL、MySQL、Microsoft SQL Server、Oracle、Trino、Athena、SAP HANA、Salesforce、NetSuite に対応しています。
SQL(必須)
実行するクエリで、コードエディタに書きます。パラメータを使う場合は $1、$2 のプレースホルダを置き、値は下の SQL Type Arguments で設定します。
ResultField(必須)
結果を格納する変数名です。既定は result。結果は常に配列で、1 行しかない場合も配列です。
SQL Type Arguments
SQL のプレースホルダに入る実際の値です。この領域は最初は空で、緑の + で 1 組追加します。1 組は Type と Value のペアです。

Type はドロップダウンで、選択肢は 4 つです。

Value はエディタで、既定は Expression モードです。左上の fx で値の取得方法を切り替えられます。詳しくは Expression の紹介 を参照してください。
引数は追加した順に対応します。1 組目が $1、2 組目が $2、以下同様です。
実際の例
ある店舗で在庫が少ない商品を取り出します。$1 は店舗コード(文字列)、$2 は取得件数(整数)で、2 つの引数がそれぞれ違う Type を使います。
入力後のパネル:

| 項目 | 値 |
|---|---|
| Data Source | Retail DW (RDS) |
| SQL | SELECT sku, sku_name, on_hand, safety_stock FROM retail_dw.pos_store_inventory WHERE store_id = $1 ORDER BY on_hand ASC LIMIT $2 |
| ResultField | low_stock |
| 引数 1 | Type String、Value S-001 |
| 引数 2 | Type Integer、Value 5 |
実行すると low_stock には次の 5 行が入ります。
| sku | sku_name | on_hand | safety_stock |
|---|---|---|---|
| SKU-8801 | 聯名鈦保溫瓶 500ml | 6 | 40 |
| SKU-1227 | 經典陶瓷馬克杯 350ml 森綠 | 16 | 12 |
| SKU-1241 | 矽膠料理鏟 二入 象牙白 | 19 | 12 |
| SKU-1000 | 方格筆記本 A6 黑 | 20 | 16 |
| SKU-1067 | 不鏽鋼瀝水籃 16cm 象牙白 | 21 | 12 |
後続ノードは low_stock でこの配列を受け取ります。たとえば Router で low_stock.length > 0 を判定し、補充通知を出すかどうかを分岐できます。
CRD を直接書く場合
キャンバスでの設定は、Workflow CRD では config key の並びとして保存されます。Data Source、SQL、ResultField はそれぞれ 1 つの key、SQL Type Arguments は 1 組につき 2 つの key で、番号は 1 から始まります。
- name: dataConnector
value: retail-dw-rds
- name: sql
value: |
SELECT sku, sku_name, on_hand, safety_stock
FROM retail_dw.pos_store_inventory
WHERE store_id = $1
ORDER BY on_hand ASC
LIMIT $2
- name: resultField
value: low_stock
- name: sql.args.1.type
value: string
- name: sql.args.1.value
value: S-001
- name: sql.args.2.type
value: integer
- name: sql.args.2.value
value: "5"
引数の数に上限はありませんが、番号は連番でなければならず、各番号に type と value の両方が必要です。プロセッサは 1 から順に探し、番号の抜け、あるいは type/value の欠落に当たった時点で止まります。それ以降の引数はエラーにならず捨てられます。1 と 3 で書けば 3 組目は存在しないのと同じです。
接続関係
Success
クエリが成功したときに進みます。結果は ResultField で指定した変数に格納され、後続ノードからそのまま使えます。
Failure
クエリが失敗したときに進み、詳細は prevError に入ります。接続失敗、SQL の構文エラー、引数の型不一致はいずれもここに来るので、この分岐は繋いでおくことを勧めます。
読み取り専用で、書き込みはできない
実行前に、プラットフォームは SQL を parse して読み取り専用クエリかどうかを確認します。読み取り専用でなければ実行されず、SQL query is not a read-only query として Failure に進みます。
そのため UPDATE、INSERT、DELETE はこの processor では動きません。この制限を外すスイッチ(allowWrite)はプロパティパネルになく、ワークフロー作成者が設定するものではありません。プラットフォーム側の設定です。同じ設定群にテーブルの許可リスト(allowedTables)もあり、設定されている場合はリスト外のテーブルに触れるクエリが SQL query references unauthorized tables として Failure に進みます。
注意事項
- この processor はページングも件数制限もしません。SQL が返した行数がそのまま変数に入ります。大きなテーブルでは自分で
LIMITを付けてください。 - 引数の
Typeの選び間違いは保存時には弾かれません。実行時に Failure になります。 - データベースに IP 制限がある場合は、Asgard プラットフォームの送信元 IP を許可リストに追加してください。VPN ホワイトリスト IP を参照。