2016-11-30 18 views
-1

PostgresでSQLのみを使用してこの関数を簡単にすることはできますか? (削除なし、忘れないでください) クエリを選択して挿入するだけです。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)を削除しませんでした'私はちょうど他の2つを実行する変更 –

関連する問題