我正在尝试创建一个复杂的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;
仍然只能带回一整套结果。
我不知道如何继续,请提供建议。
答案 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提供了有用的链接。