我制作了这个plpgsql函数,它会给我任何回报! 如果我取出查询部分并在单独的SQL窗口中执行它,它将返回正确的行。
我也认为查询不是最优的,所以任何帮助都是值得赞赏的(对plpgsql来说很新)
CREATE OR REPLACE FUNCTION get_members(in_company_uuid uuid, in_start integer, in_limit integer, in_sort character varying, in_order character varying, OUT out_status integer, OUT out_status_description character varying, OUT out_value character varying[]) RETURNS SETOF record
LANGUAGE plpgsql
AS $$DECLARE
temp_record RECORD;
temp_out_value VARCHAR[];
temp_iterator INTEGER := 0;
BEGIN
FOR temp_record IN EXECUTE '
SELECT DISTINCT ON
(' || in_sort || ')
u.user_uuid,
u.firstname,
u.preposition,
u.lastname,
array(SELECT email FROM emails WHERE user_uuid = u.user_uuid) as emails,
array(SELECT mobilenumber FROM mobilenumbers WHERE user_uuid = u.user_uuid) as mobilenumbers,
array(SELECT c.name FROM targetgroupusers AS tgu LEFT JOIN membercategories as mc ON mc.targetgroup_uuid = tgu.targetgroup_uuid LEFT JOIN categories AS c ON mc.category_uuid = c.category_uuid WHERE tgu.user_uuid = u.user_uuid) as categories,
array(SELECT color FROM membercategories WHERE targetgroup_uuid IN(SELECT targetgroup_uuid FROM targetgroupusers WHERE user_uuid = u.user_uuid)) as colors
FROM
membercategories AS mc
LEFT JOIN
targetgroups AS tg
ON
tg.targetgroup_uuid = mc.targetgroup_uuid
LEFT JOIN
targetgroupusers AS tgu
ON
tgu.targetgroup_uuid = tg.targetgroup_uuid
LEFT JOIN
users AS u
ON
u.user_uuid = tgu.user_uuid
WHERE
mc.company_uuid = \'' || in_company_uuid || '\'
ORDER BY
' || in_sort || ' ' || in_order || '
OFFSET
' || in_start || '
LIMIT
' || in_limit
LOOP
temp_out_value[temp_iterator] = ARRAY[temp_record.user_uuid::VARCHAR(36), temp_record.firstname::CHARACTER VARYING, temp_record.preposition::CHARACTER VARYING, temp_record.lastname::CHARACTER VARYING, temp_record.emails::CHARACTER VARYING, temp_record.mobilenumbers::CHARACTER VARYING, temp_record.categories::CHARACTER VARYING, temp_record.colors::CHARACTER VARYING];
temp_iterator = temp_iterator+1;
END LOOP;
out_status := 0;
out_status_description := 'Members retrieved';
out_value := temp_out_value;
RETURN;
END$$;
非常感谢!
答案 0 :(得分:1)
您需要使用RETURN NEXT temp_record
而不是“只是”RETURN才能返回完整的结果集。
本手册的一部分介绍了如何处理“RETURNS SETOF”功能:
在这种情况下,返回的各个项目由RETURN NEXT或RETURN QUERY命令序列指定,然后使用不带参数的最终RETURN命令来指示函数已完成执行
答案 1 :(得分:0)
不要使用\来逃避,使用引号:
\'' || in_company_uuid || '\'
''' || in_company_uuid || '''
但是,我不会使用函数,只是一个简单的SQL查询。使用EXPLAIN查看它是如何执行的以及可以找到性能问题的位置。它不是一个非常好的SQL ...
聚苯乙烯。您的函数也容易受到SQL注入的影响,您可以将userinput放入SQL而不进行任何转义。
答案 2 :(得分:0)
您需要使用
CREATE OR REPLACE FUNCTION get_members(...) RETURNS record LANGUAGE plpgsql AS
...
即删除setof
这是你的问题,作为a_horse提及
但请记住,你只能获得这样的一排。如果您想要多行,可以通过以下示例取消该数组:
create or replace function unnest(anyarray) returns setof anyelement as $$
select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) i;
$$ language'sql' immutable;
create function func(out text, out text[]) returns record language plpgsql as $$
begin
$1='success';
$2[1]='hello';
$2[2]='there';
$2[3]='Koen';
return;
end;$$;
select * from unnest((select column2 from func()));
unnest
--------
hello
there
Koen
如果您使用的是8.4或以上版本,则无需像我在此处一样创建自己的unnest
功能。