pl / pgsql不会使用记录返回所有结果

时间:2018-01-30 23:24:32

标签: postgresql for-loop plpgsql resultset set-returning-functions

我正在尝试创建一个复杂的pl / pgsql函数,它从查询中收集一些结果,然后检查每个结果并返回它。

这是我的代码到目前为止 render() { return ( <div> <Grid data={this.state.data} itemChange={this.itemChange} editField="inEdit" > <GridColumn field="ProductID" title="Id" width="50px" editable={false} /> <GridColumn field="ProductName" title="Product Name" /> <GridColumn field="FirstOrderedOn" title="First Ordered" editor="date" format="{0:d}" /> <GridColumn field="UnitsInStock" title="Units" editor="numeric" /> <GridColumn field="Discontinued" cell={DropDownCell} /> </Grid> </div> ); } 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(lon / lat)的数据在place.geom内。但由于我是pl / pgsql的新手,我现在正在创建第一步,只收集所有数据,将它们放入areageom并返回。

我的问题是,无论我尝试什么,我都只能获得一个结果。我打电话给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; 仍然只能带回一整套结果。

我不知道如何继续,请提供建议。

2 个答案:

答案 0 :(得分:0)

您使用RETURNS record声明了您的函数,因此它返回单个记录(未知类型)。

使用RETURNS SETOF record返回一组行。 The manual:

  

SETOF修饰符表示该函数将返回一组项目,而不是单个项目。

更好的是,使用 RETURNS TABLE 并使用正确的表定义。就像你在最近的问题中已经拥有它一样:

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

答案 1 :(得分:0)

这是我对问题的解决方法

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提供了有用的链接。

相关问题