加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:00:50 所属栏目:百科 来源:网络整理
导读:我们如何传递一个(无限量)行数组(即常量表)作为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,z varchar(64)) AS$$
我们如何传递一个(无限量)行数组(即常量表)作为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,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 []强制转换,但有没有办法重写事物以便我们可以省略它?

我们应该使用变量论证吗?

解决方法

我的谷歌搜索一直引导着我,所以我将发布一个可能与OP的需求不完全匹配的答案,但对于看到标题如何将多行传递给PostgreSQL函数的其他人可能会有所帮助?

OP的原始请求是针对以下类型的:

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

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

CREATE TABLE foo AS (
    x bigint,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,z
  )
  VALUES (
    foo_record.x,foo_record.y,foo_record.z
  );

END LOOP;

RETURN...
END;
$$;

然后可以通过以下方式简单地调用此函数栏(bigint,foo []):

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

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

虽然这个例子是人为的,也许并不完全是OP所要求的,但它符合问题的标题,并且可能使其他人不必再搜索更多内容以找到他们需要的内容.

命名函数参数的EDIT使事情变得更容易

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读