我是postgreSQL的新手。我有2个表,观察和landcover,我想创建一个触发器,允许根据第二层(表)landcover.code_06的空间信息更新列observation.land。
我的意思是,如果我在QGIS中更新点层观察,我希望在属性表中具有与列CODE_06中的列相同的信息。
我创造了这个,但我不知道,有什么不对或为什么它不起作用。
ALTER TABLE observation ADD COLUMN land varchar (20)
CREATE OR REPLACE FUNCTION landinfo_land()
RETURNS trigger AS
$BODY$
BEGIN
NEW.land := observation.land
FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION landinfo_land() OWNER TO postgres;
CREATE TRIGGER update_land_value
BEFORE INSERT OR UPDATE
ON observation
FOR EACH ROW
EXECUTE PROCEDURE landinfo_land();
答案 0 :(得分:1)
此:
NEW.land := observation.land
FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);
没有任何意义。
您似乎尝试使用子查询而不是简单的表达式,但是没有SELECT
个关键字。即使在PL / PgSQL中也无法做到这一点。如果它不是一个没有SQL查询关键字的简单表达式,那么它必须是一个有效的查询。
尝试:
SELECT INTO STRICT NEW.land observation.land
FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);
是的,语法很难看。
如果仍有问题,请检查PostgreSQL服务器错误日志。它们将包含指示执行PL / PgSQL函数时出错的错误消息,这将帮助您找到其他错误。