gpt4 book ai didi

postgresql - 如何将多行传递给 PostgreSQL 函数?

转载 作者:行者123 更新时间:2023-11-29 11:21:46 25 4
gpt4 key购买 nike

我们如何传递一个(无限量的)行数组(即常量表)作为 PostgreSQL 函数的参数/参数?

这是一个想法:

CREATE TYPE foo AS (
x bigint,
y smallint,
z varchar(64)
);

CREATE OR REPLACE FUNCTION bar(bigint, foo[]) RETURNS TABLE(a bigint, x bigint, y smallint, z varchar(64)) AS
$$
SELECT $1, x, y, z FROM unnest($2);
$$
LANGUAGE SQL;

下面的函数调用有效,但有没有办法让它更短?

SELECT * FROM bar(1, ARRAY[(1,2,'body1'),(2,1,'body2')]::foo[]);

例如,我们不能删除 ::foo[] 转换,但是有没有办法重写一些东西以便我们可以省略它?

我们应该使用可变参数吗?

最佳答案

我的 Google 搜索一直将我引导到这里,所以我将发布一个可能与 OP 的需求不完全匹配的答案,但可能对看到标题How to pass multiple rows to 的其他人有所帮助PostgreSQL 函数?

OP 最初的请求是一个类型:

CREATE TYPE foo AS (
x bigint,
y smallint,
z varchar(64)
);

如果您像我一样,可能希望将标准 SELECT 查询的结果传递给函数。所以想象一下我有一个表(而不是类型)创建为:

CREATE TABLE foo AS (
x bigint,
y smallint,
z varchar(64)
);

我想将以下结果传递给一个函数:

SELECT * from foo WHERE x = 12345;

结果可能是零行或多行。

根据 https://www.postgresql.org/docs/9.5/static/rowtypes.html 的 postgres 文档创建一个表也会导致创建一个同名的复合类型。这很有用,因为这会自动处理原始问题中的 CREATE TYPE foo,我现在可以将其作为数组传递给函数。

现在我可以创建一个接受 foo 类型值数组的函数(简化以关注传入的内容以及记录的使用方式,而不是返回的内容):

CREATE OR REPLACE FUNCTION bar(someint bigint, foos foo[]) RETURNS ...
LANGUAGE plpgsql
AS $$
DECLARE
foo_record record;
begin

-- We are going to loop through each composite type value in the array
-- The elements of the composite value are referenced just like
-- the columns in the original table row
FOREACH foo_record IN ARRAY foos LOOP
-- do something, maybe like:
INSERT INTO new_foo (
x, y, z
)
VALUES (
foo_record.x,
foo_record.y,
foo_record.z
);

END LOOP;

RETURN...
END;
$$;

此函数 bar(bigint, foo[]) 可以很简单地调用:

SELECT bar(4126521, ARRAY(SELECT * from foo WHERE x = 12345));

它将 foo 表上查询的所有行作为 foo 类型数组传递。然后,我们看到的函数会对这些行中的每一行执行一些操作。

虽然这个例子是人为设计的,而且可能不完全是 OP 的要求,但它符合问题的标题,并且可能使其他人不必进行更多搜索以找到他们需要的东西。

编辑 命名函数参数使事情变得更容易

关于postgresql - 如何将多行传递给 PostgreSQL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com