我试图创建一个复杂的PL/pgSQL函数,它从查询中收集一些结果,然后检查每个结果并返回或不返回。
这是我的代码到目前为止。record
和loop
部分让我感到困惑。
CREATE FUNCTION __a_search_creator(creator text, ordertype integer, orderdate integer, areaid bigint) RETURNS record
AS $$
DECLARE
fromText text;
whereText text;
usingText text;
firstrecord record;
areageom geometry;
BEGIN
IF areaid IS NOT NULL
THEN
EXECUTE format('SELECT area.geom FROM area WHERE area.id=$1')
INTO areageom
USING areaid;
FOR firstrecord IN
EXECUTE format(
'SELECT place.id, person.name, place.geom
FROM '||fromText||'
WHERE '||whereText)
USING creator, ordertype , orderdate
LOOP
--return only data that the place.geom is inside areageom using PostGIS
END LOOP;
END IF;
RETURN firstrecord;
END;
$$
LANGUAGE plpgsql;
我计划在loop
中做一些额外的检查,正如你所看到的,RETURN
只有place.geom
(经度/纬度)在areageom
中的数据。但是因为我是pl/pgsql的新手,所以我现在创建第一步,只是收集所有数据,将它们放在record
中并返回。
我的问题是,无论我尝试什么,我总是只得到一个结果。我调用select __a_search_creator('johnson',8, 19911109, 20);
得到1,"seth johnson", 65485,84545
,但我知道我应该得到另一行结果。是否发生覆盖?
我试着把RETURN NEXT firstrecord;
select place.id from place INTO placeid;
select person.name from person INTO personname;
select place.geom from place INTO placegeom;
firstrecord.id := placeid;
firstrecord.name := personname;
firstrecord.geom := placegeom;
这仍然只返回一个结果,我试着只测试这个RAISE NOTICE '%', firstrecord.id;
,它仍然只返回一个完整的结果集。
我不知道该怎么办,请指教。
2条答案
按热度按时间xa9qqrwz1#
这是我对这个问题的解决办法
感谢@Erwin Brandstetter提供的有用链接。
ej83mcc02#
你用
RETURNS record
声明了你的函数,所以它返回一个 single 记录(未知类型)。使用
RETURNS SETOF record
返回一组行。手册:SETOF
修饰符表示函数将返回一组项,而不是单个项。更好的方法是,使用**
RETURNS TABLE
**和适当的表定义。就像你在前面的问题中已经回答过的:相关(包含详细说明和手册链接):