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)