簡體   English   中英

postgres function for 循環

[英]postgres function for loop

我有一個orders表和一個order_products_items表。 order_products_items具有以下字段:

  • order_id
  • 產品編號
  • 數量
  • 價格

我正在嘗試通過before insert trigger function 在orders表中創建一個 calculated_field: calculated_total_products_price ,它將通過遍歷與訂單相關的所有order_products_items並將數量乘以每個訂單商品的價格來計算總訂單價格。

這是我這樣做的失敗嘗試:

CREATE OR REPLACE FUNCTION public.fn_trigger_total_order_price()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare total float := 0.0;
        product record;
  BEGIN
    FOR product IN
      SELECT itm.price, itm.quantity
      FROM order_products_items itm
        INNER JOIN orders ord
        ON itm.order_id  = ord.id
      WHERE ord.id = NEW.id
        LOOP
            total = total + (product.price * product.quantity);
        END LOOP;

      NEW.calculated_total_products_price := total;
      RETURN NEW;
  END;
  $function$
;

觸發器看起來像這樣:

CREATE TRIGGER fn_trigger_total_order_price BEFORE INSERT ON public.orders
  FOR EACH ROW EXECUTE PROCEDURE fn_trigger_total_order_price();

不知何故,我沒有得到任何錯誤,但結果總是得到 0。

我錯過了什么嗎? 還是有更好/更有效的方法來解決這個問題?

非常感謝。

您不需要 postgres 中的循環來實現此目的。

一個簡單的聚合查詢就可以了。

就像是

SELECT SUM(quantity * price) 
FROM order_products_items
WHERE order_id = NEW.id

如果你不想的話,你也真的不需要弄亂觸發器。

只需查看下面的查詢並將其與orders表相關聯,如order_totals

SELECT order_id, SUM(quantity * price) order_total
FROM order_products_items
GROUP BY order_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM