1

我有一个 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);

4

1 回答 1

2

正如评论中提到的,如果要对标识符进行参数化,则必须使用动态 SQL 。EXECUTE在 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()在手册中查看。
SO上有很多相关的答案。试试这个搜索

于 2012-12-13T07:49:51.317 回答