2015-11-12 136 views
0

我必須將lat和long轉換爲geom才能使用PostGIS。我的問題是,我有來自不同位置的各種表格,我想將表格作爲參數傳遞給函數。我試試這個:將表格作爲參數傳遞

CREATE or REPLACE FUNCTION convert_from_lon_lat(float,float,character varying)  
RETURNS integer AS $$ 
select id from $3 as vertices 
order by vertices.geom <-> ST_SetSrid(ST_MakePoint($1,$2),4326) LIMIT 1; 
$$ LANGUAGE SQL; 

但我得到一個語法錯誤。

EDIT1:

所以我改變了以前的代碼這樣:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table character varying) RETURNS integer AS $$ 
BEGIN 
EXECUTE('select id from _table as vertices order by vertices.geom <-> ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;'); 
END; 
$$ LANGUAGE plpgsql; 

它創建沒有任何問題,但是當我把它叫做'convert_from_lon_lat(long1,long2,MY_TABLE)

我得到和錯誤:

ERROR: relation "_table" does not exist 

它沒有通過表名作爲參數

編輯2:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, tbl character varying) RETURNS integer AS $func$ 
BEGIN 
EXECUTE format('select id from %s order by %s.the_geom <-> ST_SetSrid(ST_MakePoint('|| long || ','|| lat ||'),4326) LIMIT 1;', tbl, tbl); 
END; 
$func$ LANGUAGE plpgsql; 

現在,當我調用該函數,我得到一個'錯誤:控制達到的功能結束無RETURN``

我試圖RETURN QUERY EXECUTE format('...但我得到一個ERROR: cannot use RETURN QUERY in a non-SETOF function

+0

您可能需要使用PL/pgSQL的和一個動態SQL構造。 – dezso

+0

我很喜歡postgres,我該怎麼做? – tvieira

回答

1

AS @dezso提到,在這種情況下,您需要動態SQL。

動態SQL與EXECUTE

所以,你在正確的軌道上;形成使用PL/pgSQL的動態SQL語句,但是你只需要收尾:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
RETURNS integer AS $$ 
BEGIN 
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
    ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table); 
END 
$$ LANGUAGE plpgsql; 

我相信這應該解決您的問題。

注意:我們發現上述解決方案有錯誤,並且使用SETOF,我試圖解決以下問題。

編輯:

幾個在這裏的編輯,希望有解決方案將解決您的問題。另外,請原諒我以前的&當前解決方案中的任何語法錯誤;我現在沒有時間去測試它們。 :(

1)你可以嘗試返回一個整數,因爲你知道當然只返回一個整數。這種情況下的返回類型將是一個包含整數的單列行。

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
RETURNS SETOF integer AS $$ 
BEGIN 
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
    ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table); 
END 
$$ LANGUAGE plpgsql; 

,然後調用爲:

SELECT * FROM convert_from_lon_lat(...); 

2)要明確返回一個整數,我想你可以試試這個:

​​
+0

我更新了這個問題,我嘗試了這個解決方案,並且出現了'錯誤:無法在非SETOF函數中使用RETURN QUERY' – tvieira

+0

因此,有兩種可能的解決方案。我會嘗試看看我是否可以進行適當的編輯... – Chris

+0

是的,它做到了!真棒 – tvieira