如何在postgresql中创建函数?

时间:2012-08-06 07:56:48

标签: postgresql

我有两张桌子:

CREATE TABLE filedata_temp
(
 num serial NOT NULL,
 id integer,
 mydata character(25),
 the_geom geometry,
 CONSTRAINT filedata_pkey PRIMARY KEY (num)
)


CREATE TABLE filedata
(
 num serial NOT NULL,
 id integer,
 mydata character(25),
 the_geom geometry,
 CONSTRAINT filedata_temp_pkey PRIMARY KEY (num)
)

如果第二个表中不存在这些行,我想制作从第二个表中的第一个表插入行的函数。比较表的字段为num字段。

阅读一些例子后:

  CREATE OR REPLACE FUNCTION  insert_into_wgs()
  RETURNS void AS
  $BODY$
  BEGIN
insert into filedata 
(
    id,
    mydata,
    the_geom,

)
values
(
    id,
    mydata,
    ST_TRANSFORM(the_geom,4326)
);
 end
 $BODY$
 LANGUAGE 'plpgsql'

所以我需要一些帮助/

更新

我尝试这个功能(数据库的神说我吧)

CREATE OR REPLACE FUNCTION  insert_into_wgs()
RETURNS void AS
$$
BEGIN
 INSERT INTO filedata (id,mydata,the_geom)  
 SELECT id,mydata,ST_TRANSFORM(the_geom,4326)
 FROM filedata_temp
 WHERE id NOT IN (SELECT id FROM filedata);
end;
$$
LANGUAGE 'plpgsql'

但是没有任何内容插入表格中。

函数调用

  ce_proc = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
  CallableStatement proc = (CallableStatement) ce_proc.prepareCall("{call insert_into_wgs()}");
  proc.execute();

2 个答案:

答案 0 :(得分:1)

您可以使用INSERT ... SELECT语法将数据从一个表推送到另一个表:

INSERT INTO filedata (...) SELECT ... FROM filedata_temp WHERE NOT EXISTS 
(
    SELECT 1 FROM filedata WHERE filedata.num = filedata_temp.num
)

当然WHERE NOT EXISTS部分只是检查差异的一种方法。加入桌子是另一回事。哪个是最好的取决于您的实际数据。

其他注意事项:两个表都有num serial。但是将数据从一个表推送到另一个表中意味着两个SERIAL正相互争斗。你应该在第二个表中使它成为普通的int

答案 1 :(得分:0)

手册中最相关的部分是39.9. Trigger Procedures。那里的例子,特别是例39-4。用于审计的PL / pgSQL触发程序可以是比当前代码更好的起点。