2012-12-13 63 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 +“)}”)' –