この質問に続いて、PL/PgSQLで正常に実行している動的SQLがいくつかありますEXECUTE
が、意図した効果がないようです。
次のコードは、私が作成した plpgsql 関数の一部です。これは、同じトラック上にある各ポイントに移動し、各ポイントで最も近いポイントを見つけて、最終的にすべてのトラック間にネットワークを作成することを意図しています。何らかの理由で、正しく機能していません。
i は現在のトラックの番号を表します。
DECLARE
_r record;
i int := 0;
source_geom character varying;
target_geom character varying;
BEGIN
WHILE i < 3 --DEPENDS ON THE NUMBER OF TRACKS
LOOP
FOR _r IN EXECUTE ' SELECT a.'|| quote_ident(gid_cname) || ' AS id,'
|| ' st_astext( a.'||quote_ident(geo_cname)||') AS source,'
|| ' st_astext(b.'||quote_ident(geo_cname)||') AS target, '
|| ' ST_Distance(a.'||quote_ident(geo_cname) || ' , b.'||quote_ident(geo_cname)||') As dist_ft'
|| ' FROM ' || quote_ident (geom_table) ||' AS a INNER JOIN ' || quote_ident(geom_table) || ' As b ON ST_DWithin(a.'||quote_ident(geo_cname)|| ', b.'||quote_ident(geo_cname)|| ',1000)'
|| ' WHERE b.'||quote_ident(gid_cname)|| ' > a.'||quote_ident(gid_cname)|| ' AND b.'||quote_ident(tid_cname)|| ' = '||i|| 'AND a.'||quote_ident(tid_cname)|| ' = '||i||
' ORDER BY dist_ft '
|| ' Limit 1 '
LOOP
source_geom := _r.source;
target_geom := _r.target;
EXECUTE 'update ' || quote_ident(geom_table) ||
' SET source = ''' || source_geom ||'''
, target = ''' || target_geom || '''
WHERE ' || quote_ident(gid_cname) || ' = ' || _r.id;
END LOOP;
i = i + 1;
END LOOP;
RETURN 'OK';
END;
問題は、プレーンSQLでクエリをテストしたところ、見事に機能したことです。現在、何らかの理由で plpgsql が正しく機能していません。以下では、プレーン SQL で同じクエリを見つけることができます。
SELECT a.ogc_fid AS id, st_astext( a.wkb_geometry) AS source, st_astext(b.wkb_geometry) AS target, ST_Distance(a.wkb_geometry, b.wkb_geometry) As dist_ft
FROM track_points AS a INNER JOIN track_points As b
ON ST_DWithin(a.wkb_geometry , b.wkb_geometry, 1000)
WHERE b.ogc_fid > a.ogc_fid AND b.track_fid = 0 AND a.track_fid = 0
order by dist_ft