2012-12-13 125 views
0

我有一個SQL函數:如何用參數創建SQL函數?

-- Function: insert_into_wgs() 

-- DROP FUNCTION insert_into_wgs(); 

CREATE OR REPLACE FUNCTION insert_into_wgs() 
    RETURNS void AS 
$BODY$ 
BEGIN 
INSERT INTO parcels (num,vid,support_num,name_dispatcher,cadastr,the_geom,status_id) 
SELECT num,vid,support_num,name_dispatcher,cadastr,ST_TRANSFORM(the_geom,4326),status_id 
FROM parcels_temp 
WHERE num NOT IN (SELECT num FROM parcels)AND deleted='no'; 
end; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION insert_into_wgs() OWNER TO postgres; 

你看,它僅適用於parcelsparcels_temp表。我如何用參數insert_into_wgs(table, table_temp);創建函數?

+0

你是否已經嘗試過'CREATE OR REPLACE FUNCTION insert_into_wgs(表,table_temp)'? –

+0

是的,它說表是筆記型。 –

+0

我不知道這個功能是如何調用所以着問我的問題,谷歌( –

回答

1

如評論中所述,如果要參數化標識符,則必須使用動態SQL。並使用EXECUTE in plpgsql

在基本查詢更好地利用NOT EXISTS代替山坳NOT IN (<subquery>)

現在,如果只表名稱更改和列保持不變,這個簡單的演示將做的工作:

CREATE OR REPLACE FUNCTION insert_into_tbl(_tbl text, _tbl_tmp text) 
    RETURNS void AS 
$func$ 
BEGIN 

EXECUTE format($x$ 
INSERT INTO %I (...) -- enter columns 
SELECT ...   -- enter columns 
FROM %I t 
WHERE NOT EXISTS (
    SELECT 1 
    FROM %1$I p  -- reuse first table name 
    WHERE p.num = t.num 
    ) 
AND deleted = 'no'$x$, _tbl, _tbl_tmp); 

END 
$func$ LANGUAGE plpgsql; 

退房format() in the manual
上有SO不少相關答案。 Try this search

+0

在Postgres裏,我沒有得到的錯誤,現在嘗試調用Java中此功能) –

+0

@KliverMax:注意我固定'WHERE'條件,以符合您的例子。 –

+0

我得到一個錯誤:'org.postgresql.util.PSQLException:ERROR:列 「包裹」 不exist'。在Java我調用函數:'java.sql.CallableStatement中PROC = ce_proc.prepareCall( 「{調用insert_into_wgs(」 + t_name + 「 」+ t_temp +「)}」)' –