我們有一個觸發功能,可以在零件重量更新時更新模型重量。
我想通過動態查詢將模型 ID串列選擇到postgresql中的 int 陣列中。
然后我想使用這個陣列來查找所有具有這個 id 的模型。
我試過這個
CREATE OR REPLACE FUNCTION Func_U_Model_UpdateModelWeightOnPartChange()
RETURNS TRIGGER
LANGUAGE plpgsql AS
$$
DECLARE
model_ids int[];
BEGIN
EXECUTE format(
'
SELECT DISTINCT m.id
FROM Part p
JOIN %1$s A ON A.part_id = p.id
JOIN Model m ON m.%1$s_id = A.id
WHERE p.id = %2$s
;',
trim(NEW.part_type),
NEW.id
)
INTO model_ids;
UPDATE Model
SET weight = weight ( NEW.weight - OLD.weight )
WHERE id IN (model_ids);
RETURN NULL;
END;
$$;
但我得到這個錯誤malformed array literal "-9"
我想知道如何存盤和查詢這些 ID。我也嘗試過臨時表,但沒有機會
這是觸發器
CREATE OR REPLACE TRIGGER Trigger_After_Update_Part_UpdateModelWeight
AFTER UPDATE OF weight ON Part
FOR EACH ROW
EXECUTE FUNCTION Func_U_Model_UpdateModelWeightOnPartChange();
uj5u.com熱心網友回復:
您需要將這些值聚合到一個陣列中,以便將它們存盤在一個陣列變數中。
另外:您不應該將引數作為字串傳遞,使用 USING 子句傳遞它們:
EXECUTE format(
'
SELECT array_agg(DISTINCT m.id)
FROM Part p
JOIN %1$s A ON A.part_id = p.id
JOIN Model m ON m.%1$s_id = A.id
WHERE p.id = $1
',
trim(NEW.part_type)
)
INTO model_ids
USING NEW.id;
uj5u.com熱心網友回復:
非常感謝@a_horse_with_no_name的回答
我將最終的 sql 代碼更改為此,現在可以正常作業。
CREATE OR REPLACE FUNCTION Func_U_Model_UpdateModelWeightOnPartChange()
RETURNS TRIGGER
LANGUAGE plpgsql AS
$$
DECLARE
model_ids int[];
BEGIN
EXECUTE format(
'
SELECT array_agg(DISTINCT m.id)
FROM Part p
JOIN %1$s A ON A.part_id = p.id
JOIN Model m ON m.%1$s_id = A.id
WHERE p.id = $1
',
trim(NEW.part_type)
)
INTO model_ids
USING NEW.id;
UPDATE Model
SET weight = weight ( NEW.weight - OLD.weight )
WHERE id = ANY (model_ids);
RETURN NULL;
END;
$$;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421774.html
標籤:
