我是postgreSQL的新手。我有两个表,观察和覆盖,我想创建一个触发器,允许更新列observation.land根据空间信息根据第二层(表) landcover.code_06。
我的意思是,如果我更新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();
发布于 2014-12-26 16:45:08
这是:
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函数时发生了什么错误,这将帮助您发现其他错误。
https://stackoverflow.com/questions/27648149
复制