メインコンテンツまでスキップ
データベースに対して SQL を実行し、結果を変数に格納して後続ノードで使えるようにします。パラメータ化クエリに対応。

SQL

SQL processor は、プロジェクトに設定済みのデータソース経由でデータベースに接続し、SQL を実行して、結果を配列として指定した変数に格納します。後続のノードはその変数から結果を読めます。

クエリには $1、$2 のようなプレースホルダを書けます。実際の値は SQL Type Arguments で別に設定するので、値を SQL 文字列に連結する必要はありません。

プロパティ​

ノードのプロパティパネルです。Data Source、SQL、ResultField の 3 つは必須で、未入力のうちは赤枠で表示されます。

SQL ノードのプロパティパネル。Data Source、SQL、ResultField がまだ赤枠の状態

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 のペアです。

+ を押すと引数が 1 組現れ、上に Type のドロップダウン、下に Value のエディタが表示される

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

Type のドロップダウンが開き、String、Integer、Number、Boolean が並んでいる

Value はエディタで、既定は Expression モードです。左上の fx で値の取得方法を切り替えられます。詳しくは Expression の紹介 を参照してください。

引数は追加した順に対応します。1 組目が $1、2 組目が $2、以下同様です。

実際の例​

ある店舗で在庫が少ない商品を取り出します。$1 は店舗コード(文字列)、$2 は取得件数(整数)で、2 つの引数がそれぞれ違う Type を使います。

入力後のパネル:

入力後のパネル。Data Source は Retail DW (RDS)、SQL エディタにクエリ、ResultField は low_stock

項目値
Data SourceRetail DW (RDS)
SQLSELECT sku, sku_name, on_hand, safety_stock FROM retail_dw.pos_store_inventory WHERE store_id = $1 ORDER BY on_hand ASC LIMIT $2
ResultFieldlow_stock
引数 1Type String、Value S-001
引数 2Type Integer、Value 5

実行すると low_stock には次の 5 行が入ります。

skusku_nameon_handsafety_stock
SKU-8801聯名鈦保溫瓶 500ml640
SKU-1227經典陶瓷馬克杯 350ml 森綠1612
SKU-1241矽膠料理鏟 二入 象牙白1912
SKU-1000方格筆記本 A6 黑2016
SKU-1067不鏽鋼瀝水籃 16cm 象牙白2112

後続ノードは 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 を参照。