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

时间:2014-03-10 17:12:37

标签: arrays function postgresql aggregate-functions plpgsql

我正在尝试创建一个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';

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

1 个答案:

答案 0 :(得分:12)

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
通常没有必要{p> %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;