【问题标题】:PLPGSQL Array in Functions函数中的 PLPGSQL 数组
【发布时间】:2012-03-26 04:05:31
【问题描述】:

如何在函数中使用数组插入表?

CREATE TABLE places
(
id      SERIAL PRIMARY KEY
,location   VARCHAR(100) NOT NULL
,timestamp  TIMESTAMP
,person_id  INTEGER NOT NULL REFERENCES people ON UPDATE...
);

CREATE TABLE people
(
id      SERIAL PRIMARY KEY
,name   VARCHAR(100) NOT NULL
);

我正在尝试做一个我想做的功能:

SELECT function(location_name, now(), '{1,2,3}');

这会将 3 条记录插入到数组中每个 person_id 的位置表中,具有相同的位置和时间戳。主要问题是数组的长度可以是动态的,所以函数应该可以处理:

SELECT function(location_name, now(), '{3,5,7,8,10}');

我不知道从哪里开始使 INSERT 动态化并从数组中提取 id。 Unest 可用于 DECLARE 中的 INSERT INTO 变量,但不能完成动态方面。我希望我说清楚了。

【问题讨论】:

    标签: arrays function postgresql plpgsql


    【解决方案1】:

    编写一个 plpgsql 函数总是有可能的(我经常这样做)。但是这种情况可以更简单地解决:

    INSERT INTO places (location, ts, person_id) 
    SELECT 'some_location', now(), unnest('{1,2,3}'::int4[])
    

    我将您的列名timestamp 替换为ts,因为我认为使用类型名称作为标识符不是一个好主意。它会导致令人困惑的副作用和错误消息。


    如果你需要 JOINunnest() 函数的结果集 - 就像你的问题似乎暗示的那样(但问题变得更简单) - 你必须做到子查询:

    INSERT INTO places (location, ts, name)
    SELECT 'some_location', now(), p.name
    FROM  (SELECT unnest('{1,2,3}'::int4[]) AS id) AS x
    JOIN   people p USING (id);
    

    我添加了列name,在您的模型中没有,只是做演示。

    【讨论】:

    • 谢谢你的回答,我可以用 FOR i in array LOOP 代替吗? LOOP有副作用吗?
    • 在 plpgsql 函数或 DO 语句中,是的。不知道,这可能是什么副作用。您可能对新的FOREACH loop 感兴趣
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2013-01-24
    • 2012-10-30
    • 2012-09-27
    相关资源
    最近更新 更多