我有一个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;
您发现它仅适用于parcels
,parcels_temp
表。如何使用参数insert_into_wgs(table, table_temp);
创建函数?
答案 0 :(得分:1)
如评论中所述,如果要参数化标识符,则必须使用动态SQL 。并使用EXECUTE
in plpgsql。
在基本查询中,最好使用NOT EXISTS
代替col 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