2016-11-30 47 views
-1

我可以使這個功能簡單,只使用sql在Postgres? (不刪除,忘記它) 我只需要選擇並插入查詢。簡化我的函數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'; 

謝謝。

+0

運營商所是''<#>? –

+0

從一點到另一點的距離。 @JuanCarlosOropeza –

+1

與'<->'有什麼不同? –

回答

0

你不需要EXECUTE只是做SQL語句

DELETE from rota_executada where id_rota = id_rota::text; 

INSERT INTO rota_executada(id_rota, id_rua, id_destino, the_geom, visitado) 
    SELECT id_rota, id, var_match.id_destino, var_match.the_geom, 'N' 
    FROM ruas r 
    ORDER BY r.the_geom <#> var_match.the_geom 
    LIMIT 1 
+0

提示:有意義的一些地方'id_rota'是整數,其他是文本。標準化你的數據類型,以避免錯誤和錯誤 –

+0

但是,和 - ST_DumpPoints(the_geom)選擇?我不能鬆動st_dumppoints命令 –

+0

我沒有刪除'FOR var_match IN EXECUTE(searchsql)'我只是改變了另外兩個執行 –