如何在 PostgreSQL 函数中声明 rowtype 数组?

问题描述 投票:0回答:1

我正在尝试创建一个 PostgreSQL 函数,在用它做更多事情之前,我将在其中循环查询的行并将其中一些存储在数组中。如何创建行类型数组?

CREATE OR REPLACE FUNCTION forExample() RETURNS integer AS
$BODY$
DECLARE
    r "WEBHOST"%rowtype;
    b "WEBHOST"%rowtype[];   <- This does not work !!!
BEGIN
    FOR r IN SELECT * FROM "WEBHOST"
    LOOP
        array_append(b, r);
    END LOOP;
    RETURN 33;
END
$BODY$
LANGUAGE 'plpgsql';

上面的函数会比较复杂,但我为这个问题提供了一个简化版本。

arrays function postgresql aggregate-functions plpgsql
1个回答
21
投票
CREATE OR REPLACE FUNCTION for_example()
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
DECLARE
   r "WEBHOST";          -- optionally schema-qualify table name: public."WEBHOST"  
   b "WEBHOST"[];        -- this works
BEGIN
   FOR r IN 
      SELECT * FROM "WEBHOST"
   LOOP
      b := b || r;       -- this, too
   END LOOP;

   RAISE NOTICE '%', b;  -- get feedback
   RETURN 33;
END
$func$;

%rowtype
一般不需要。通常,表的关联行类型可用作同名类型。

并且不要引用语言名称。

您必须分配或丢弃(使用

PERFORM
而不是
SELECT
PL/pgSQL 中函数调用的结果。

在 Postgres 中使用 CaMeL 大小写标识符也不是一个好主意。使用合法的小写标识符让您的生活更轻松。

最后的最好的:使用聚合函数更简单

array_agg()

CREATE OR REPLACE FUNCTION for_example()
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
DECLARE
   b "WEBHOST"[];
BEGIN
   SELECT array_agg(tbl) INTO b FROM "WEBHOST" tbl;       

   RAISE NOTICE '%', b;
   RETURN 33;
END
$func$;
© www.soinside.com 2019 - 2024. All rights reserved.