跳至主要内容
對資料庫執行一段 SQL,把結果存成變數給後面的節點用。支援參數化查詢。

SQL

SQL processor 用你在專案裡設定好的資料來源連上資料庫,執行一段 SQL,把結果以陣列存進指定的變數,後面的節點就能取用。

查詢語句可以帶 $1、$2 這樣的參數佔位符,實際的值另外在 SQL Type Arguments 裡設定,不用把值串進 SQL 字串裡。

屬性​

節點的屬性面板長這樣。Data Source、SQL、ResultField 三個是必填,未填時欄位會顯示紅框:

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 編輯器

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

Type 下拉展開,選項是 String、Integer、Number、Boolean

Value 是編輯器,預設是 Expression 模式,可以用左上角的 fx 切換取值方式,詳見 Expression 介紹。

參數的順序就是加入的順序:第一組對應 $1,第二組對應 $2,依此類推。

一個實際的例子​

查某間門市庫存最低的幾個品項。$1 是門市代號(字串),$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 裡是這五列:

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 各對應一個 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。