2017-01-31 93 views
1

私は、PostgreSQL 9.5でこのように私のテーブルの列にトリガーを作成しようとしていますせずにトリガプロシージャの終わりに達した:私はgood_stockの値を編集しようPostgreSQLのトリガーエラー:コントロールは、RETURN

CREATE OR REPLACE FUNCTION app.combo_min_stock() 
    RETURNS TRIGGER AS 
$combo_sync$ 

DECLARE combo_product_ids INTEGER[] := array(SELECT combo_product_map.combo_productid FROM app.combo_product_map WHERE combo_product_map.productid=NEW.productid); 
DECLARE comboid INTEGER; 

BEGIN 

    -- UPDATE MINIMUM STOCK FOR COMBO SKUS -- 

    FOREACH comboid IN ARRAY combo_product_ids 
    LOOP 

     UPDATE app.inventory SET 
     good_stock = combo_data.min_good_stock, 
     bad_stock = combo_data.min_bad_stock, 
     to_be_updated = true 
     FROM 
     (SELECT 
      product.productid, 
      MIN(inventory.good_stock) as min_good_stock, 
      MIN(inventory.bad_stock) as min_bad_stock 
     FROM 
      app.product, 
      app.inventory, 
      app.combo_product_map 
     WHERE 
      product.is_combo=true AND 
      product.productid=comboid AND 
      product.productid=combo_product_map.combo_productid AND 
      combo_product_map.productid=inventory.productid 
     GROUP BY 
      product.productid) AS combo_data 
     WHERE 
     combo_data.productid=inventory.productid; 


    END LOOP; 

END; 
$combo_sync$ 
    LANGUAGE plpgsql; 
ALTER FUNCTION app.combo_min_stock() 
    OWNER TO postgres; 



CREATE TRIGGER combo_sync 
    AFTER UPDATE OF good_stock 
    ON app.inventory 
    FOR EACH ROW 
    EXECUTE PROCEDURE app.combo_min_stock(); 

An error has occurred: ERROR: control reached end of trigger procedure without RETURN CONTEXT: PL/pgSQL function app.combo_min_stock()

このクエリの何が問題になっている:私の在庫表の列は、それは私にこのエラーを投げていますか?

+3

"トリガー機能がNULLまたはレコード/行の値のどちらかを返さなければなりません..." https://www.postgresql.org/docs/9.5/static/plpgsql- trigger.html、 "行レベルのトリガがAFTERを返した場合、またはBEFOREまたはAFTERをトリガした文レベルのトリガの戻り値は常に無視されますが、nullの場合もありますが、これらのタイプのトリガは、エラーを発生させることによって動作します。 – cske

答えて

6

これを使用してみてください:

END LOOP; 
    RETURN NULL; 
関連する問題