SQL
SQL processor 用你在專案裡設定好的資料來源連上資料庫,執行一段 SQL,把結果以陣列存進指定的變數,後面的節點就能取用。
查詢語句可以帶 $1、$2 這樣的參數佔位符,實際的值另外在 SQL Type Arguments 裡設定,不用把值串進 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。結果一律是陣列,就算只有一列也是。
SQL Type Arguments
對應 SQL 裡佔位符的實際值。這一區預設是空的,按綠色 + 加一組,每組是一個 Type 加一個 Value:

Type 是下拉選單,四個選項:

Value 是編輯器,預設是 Expression 模式,可以用左上角的 fx 切換取值方式,詳見 Expression 介紹。
參數的順序就是加入的順序:第一組對應 $1,第二組對應 $2,依此類推。
一個實際的例子
查某間門市庫存最低的幾個品項。$1 是門市代號(字串),$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 裡是這五列:
| 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 各對應一個 key;SQL Type Arguments 那一區則是每組參數兩個 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 都要寫。Processor 從 1 往上找,一碰到缺號、或某一號少了 type 或 value,就停在那裡,後面的參數全部被丟掉,而且不會報錯。跳號寫成 1、3 的話,第 3 組等於沒有。
連接關係
Success
查詢成功時走這條。結果存進 ResultField 指定的變數,後面的節點可以直接用。
Failure
查詢失敗時走這條,錯誤資訊會放在 prevError。連線失敗、SQL 語法錯誤、參數型別對不上都會走到這裡,建議一定要接。
只能查,不能寫
執行之前,平台會先把你的 SQL 拿去 parse 一次,確認它是唯讀查詢。不是唯讀就不執行,直接走 Failure,錯誤訊息是 SQL query is not a read-only query。
所以 UPDATE、INSERT、DELETE 這類語句在這個 processor 上是跑不動的。放寬這個限制的開關(allowWrite)不在屬性面板上,也不是流程作者能自己打開的,由平台端設定。同一組設定裡還有一個資料表白名單(allowedTables),設了之後查詢碰到清單外的表會走 Failure,訊息是 SQL query references unauthorized tables。
注意事項
- 這個 processor 不做分頁,也不限制回傳筆數,SQL 回幾列就存幾列進變數。大表記得自己加
LIMIT。 - 參數的
Type選錯不會在存檔時被擋下來,會在執行時變成 Failure。 - 資料庫如果有 IP 限制,要把 Asgard 平台的來源 IP 加進允許清單,詳見 VPN 白名單 IP。