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;

parcelsparcels_tempテーブルでのみ機能することがわかります。パラメータを使用して関数を作成するにはどうすればよいinsert_into_wgs(table, table_temp);ですか?

4

1 に答える 1

2

コメントで述べたように、識別子をパラメータ化する場合は、動的 SQLを使用する必要があります。そしてEXECUTEplpgsql で使用します

ベースクエリ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 に答える