我正在尝试创建一个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';
上述功能会更复杂,但我提供了这个问题的简化版本。
答案 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;