响应动作 只能用Insert命令?

我在规则裡面設置了响应动作,希望每次接收到payload時,用update命令去更新欄位,但是我發現在「编辑动作」下面的「SQL 模板 」只要輸入update tb_name set c01=1 這樣簡單的命令都是失敗的,但是如果我用 INSERT INTO tb_name (c01) values (1) 這樣就可以成功!

我該如何做,才能夠使用update命令呢?

例如,我用update i_k set status = 9 where v00 =‘B001’ 命令在DB裡面是可以正常運行~
image

但是把這命令貼到SQL模版就會失敗


只能做 INSERT 语句的批量,因为他是通过在 INSERT 语句中追加多个 VALUES 字句实现的。
如果用 UPDATE 语句,不要启用批量插入功能。

謝謝您的回覆,我稍後再測試看看 不要啟用批量插入

另外請問在sql模版中是否支持if …then命令?

我真實的需求是,監測 payload.d.status = 1 的時候,進行update table_A 表裡面的 status =1
如果payload.d.status = 2 的時候,進行update table_B 表裡面的 status =2

所以payload.d.status = 1 或是2,分別會更新不同的表,這樣的判斷式,是否可以在sql模版中實現?
如果可以,是否有範例可以參考?

謝謝您

这个就麻烦了,现在没办法在同一个规则里面实现这个逻辑:

  1. MySQL 动作的 SQL 模板里面只能支持简单的变量替换,比如 ${var} 或者 ${var.key},不支持更复杂的逻辑。

  2. 规则的 SQL 里面的确有支持 CASE THEN 语句,你可以通过这个来导出一个 ${table_name} 的变量,但问题是 MySQL 动作里面的表名没有办法用 ${table_name} 的格式,因为你现在用的是 UPDATE 语句,他在创建规则的时候就必须先做 PrepareStatement,这时就用到了表名,所以它没办法使用一个运行时才知道的表名。当然如果你用的是 INSERT的话还是有办法的。

所以现在你只能为 table_Atable_B 创建两个规则以及动作。

我把2個判斷拆成2個規則
第一個規則,我的條件是當tb_a的status=0時,我才會進行 update tb_b 的status=3
但是這個命令在這裡無法正常運行,是指定有錯,還是不能用DO begin 命令?

*我是用postgresql

抱歉看错了,但 PgSQL 跟 MYSQL 是一样的逻辑。

你的这一段 SQL 能直接在 psql 命令行里执行吗?规则里的 PgSQL 动作是通过程序接口的方式,向 PgSQL 发送 SQL 语句:

  • 如果开启了批量模式,在运行时重新编辑 INSERT 语句,追加 VALUES 字句并发送。
  • 如果没有开启批量,在创建规则的时候先做 PrepareStatement,然后在运行时发送预先创建的Statement 和参数到 PgSQL。

所以你是不是在点击创建规则的时候就因为无法 Prepare 出错了?如果是这样就没办法写这么复杂的 SQL。

如果实在没办法解决,你可以用 Webhook 方式,调用自己的程序。

你的这一段 SQL 能直接在 psql 命令行里执行吗?

可以,我用DBeaver可以正常運行

在创建规则的时候先做 PrepareStatement,然后在运行时发送预先创建的Statement 和参数到 PgSQL。

我的啟用批量插入是false,所以應該是沒有開啟
您說的 PrepareStatement 是怎麼做呢? 有沒有文件可以參考?

謝謝您!

PrepareStatement 是向数据库提前存储一个 SQL 语句,让数据库提前完成 SQL 分析过程,从而加快后续 SQL 执行的方法:
https://www.postgresql.org/docs/current/sql-prepare.html#:~:text=A%20prepared%20statement%20is%20a,statement%20is%20planned%20and%20executed.

請問在SQL模版這裡,有沒有任何的if判斷式範例? 其它SQL的範例也可以,我想測試看看

没有,现在我见到的都是简单的 UPDATE 或者 INSERT 语句,没有见过更复杂的。应该是不支持这样做的。

好的 謝謝!