我正在尝试创建一个 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';
上面的函数会比较复杂,但我为这个问题提供了一个简化版本。
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$;