【发布时间】:2017-04-14 21:11:05
【问题描述】:
我可以让这个函数变得简单,只在 Postgres 中使用 sql 吗? (不删除,算了) 我只需要选择和插入查询。
我尝试过使用“递归”没有成功。
CREATE OR REPLACE FUNCTION mt_CriarRotaExecutada(id_rota integer)
RETURNS void AS
$$
DECLARE
searchsql text := '';
searchsqlId text := '';
var_match RECORD;
BEGIN
EXECUTE('delete from rota_executada where id_rota = ' || CAST( id_rota As text));
searchsql := 'select (ST_DumpPoints(the_geom)).geom as the_geom,
id_destino
from (select id, the_geom, id_destino
from rota_data
where num =' || CAST( id_rota As text) ||
' order by id) a';
FOR var_match IN EXECUTE(searchsql)
LOOP
EXECUTE 'insert into rota_executada(id_rota, id_rua, id_destino, the_geom, visitado)
select $1, id, $3, $2, $4
from ruas r
ORDER BY r.the_geom <#> $2
LIMIT 1'
USING id_rota, var_match.the_geom, var_match.id_destino, 'N';
END LOOP;
END;
$$
LANGUAGE 'plpgsql';
谢谢。
【问题讨论】:
-
<#>是什么运算符? -
一点到另一点的距离。 @JuanCarlosOropeza
-
和
<->有什么区别? -
你不需要执行删除只是
DELETE from rota_executada where id_rota = id_rota::text; -
根据我使用
<->的经验,您不能使用LIMIT 1,因为并不总是返回最接近的值,您必须先进行LIMIT 100然后排序,然后再进行LIMIT 1
标签: postgresql function postgis plpgsql