如何在 Postgresql 中使用对 int 数组执行动态查询

How to use execute dynamic query into int array in Postgresql

我们有一个触发函数,当 One Part Weight 更新时更新 Model Weight

我想 select 模型 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();

您需要将这些值聚合到一个数组中,以便将它们存储在数组变量中。

此外:您不应将参数作为字符串传递,而是使用 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 = 
  ',
   trim(NEW.part_type)
)
INTO model_ids    
USING NEW.id;

非常感谢 @a_horse_with_no_name his/her 回答

我将最终的 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 = 
    ',
    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;
$$;