postgresql PL/pgSQL函数未使用记录返回所有结果

4xrmg8kj  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(143)

我试图创建一个复杂的PL/pgSQL函数,它从查询中收集一些结果,然后检查每个结果并返回或不返回。
这是我的代码到目前为止recordloop部分让我感到困惑。

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;,它仍然只返回一个完整的结果集。
我不知道该怎么办,请指教。

xa9qqrwz

xa9qqrwz1#

这是我对这个问题的解决办法

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
        IF ST_Within(firstrecord.geom , areageom)
        THEN
            RETURN QUERY VALUES(firstrecord.id, firstrecord.name, firstrecord.geom);
        END IF;
    END LOOP;        
END IF;
RETURN;

感谢@Erwin Brandstetter提供的有用链接。

ej83mcc0

ej83mcc02#

你用RETURNS record声明了你的函数,所以它返回一个 single 记录(未知类型)。
使用RETURNS SETOF record返回一组行。手册:
SETOF修饰符表示函数将返回一组项,而不是单个项。
更好的方法是,使用**RETURNS TABLE**和适当的表定义。就像你在前面的问题中已经回答过的:

相关(包含详细说明和手册链接):

  • 如何在PostgreSQL中返回函数内部的SELECT结果?
  • 从函数返回setof记录(虚拟表)
  • 从函数返回查询?

相关问题