如何用参数创建SQL函数?

时间:2012-12-13 07:17:10

标签: sql postgresql

我有一个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);创建函数?

1 个答案:

答案 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