- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们如何传递一个(无限量的)行数组(即常量表)作为 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/
我是一名优秀的程序员,十分优秀!