【发布时间】:2018-03-06 02:42:28
【问题描述】:
我看到很多类似我的帖子,但我没有找到适合我的情况的正确答案,这应该是我认为的基本答案。我使用扩展 PostGIS 2.3。这是我的代码:
CREATE OR REPLACE FUNCTION public.split_cable()
RETURNS trigger AS
$BODY$
DECLARE geometrie geometry;
BEGIN
geometrie = new.geom;
create view temp_wire as (
with brs as (select boite.geom from cablage_pays_gex.boite
where st_intersects(boite.geom, new.geom) and boite.geom not in (select st_startpoint(st_linemerge(new.geom))) and boite.geom not in (select st_endpoint(st_linemerge(new.geom)))
)
select st_dump(st_split(new.geom, brs.geom)) from brs
);
RETURN new;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
如您所见,我有一个未使用的变量“geometrie”,这是因为我试图声明一个包含我要使用的数据的变量,但未成功。我得到的错误是我的问题的标题,它指向 st_intersects() 函数(所以我第一次尝试调用 new.geom)。我究竟做错了什么?我该如何解决这个问题?
编辑:这是触发器正在执行的创建表语句:
CREATE TABLE public.cable2
(
id_cable integer NOT NULL DEFAULT nextval('cable2_seq'::regclass),
geom geometry(MultiLineString,2154),
CONSTRAINT cable2_pkey PRIMARY KEY (id_cable)
);
【问题讨论】:
-
向我们展示触发器表的
create table语句。但是在触发器中创建视图是一个真的,非常糟糕的主意 - 它会在基础表上的第二个 DML 语句之后失败。这意味着您只能运行一次 DML 语句,然后再也不能运行,因为您将收到每个后续语句的错误。 -
@a_horse_with_no_name 不确定您的意思。我主要使用第三方软件 QGIS 与数据库交互,所以我没有使用任何语句。你的意思是
create trigger声明吗? -
那么第三方软件将停止工作,因为您的触发器将在针对该表的第一个 DML 语句之后失败。要找出您的触发器出了什么问题,我们需要查看您要在其上定义触发器的表的
create table语句。 -
@a_horse_with_no_name 它在其他场合工作得很好。是什么让 NEW 不被识别?
-
我编辑了我的问题,是你要的吗?
标签: postgresql postgis plpgsql