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

Jér*_*nge 4 arrays postgresql function plpgsql aggregate-functions

我正在尝试创建一个PostgreSQL函数,我将循环遍历查询的行并将其中的一些存储在数组中,然后再使用它进行更多操作.如何创建一个rowtype数组?

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';
Run Code Online (Sandbox Code Playgroud)

上面的功能会更复杂,但我提供了这个问题的简化版本.

Erw*_*ter 14

CREATE OR REPLACE FUNCTION for_example()
  RETURNS integer AS
$func$
DECLARE
   r "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$  LANGUAGE plpgsql; -- and lose the quotes
Run Code Online (Sandbox Code Playgroud)

%rowtype通常没有必要.通常,表的关联行类型可用作相同名称的类型.

而且也没有引用语名称.

而且你不能只在plpgsql中进行独立的函数调用.改为使用作业.

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

最好的最后:这可与聚合函数更加简单array_agg():

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

   RAISE NOTICE '%', b;
   RETURN 33;
END
$func$  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)