PostgreSQL 9.5:缺少FROM-clause条目表#34; new"

时间:2017-09-25 07:44:03

标签: postgresql postgis plpgsql

我看到很多像我这样的帖子,但我没有找到适合我情况的答案,这应该是我认为的基本答案。我使用扩展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语句:

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)
);

1 个答案:

答案 0 :(得分:1)

TL; DR:{strong>动态SQL 是CREATE VIEW语句所必需的。

在plpgsql中,变量不会在数据定义查询中进行插值,例如 CREATE...个问题。

更一般地说,plpgsql documentation将其描述为:

  

参数只能在参数或的地方替换   列引用在语法上是允许的

在DDL查询中,他们允许的地方是:无处

这就是为什么您的查询中的new.geom引用按字面意思理解,以及为什么将其转换为临时变量geometrie不会使其更好用。

动态SQL基本上包括构建命令字符串,然后将该字符串作为带有EXECUTE的语句执行。该字符串一旦生成,就不能再包含对变量的任何引用。 文档中的更多信息:Executing Dynamic Commands

与评论中所说的一样,每次在表格中影响一行时创建一个永久视图在概念层面上似乎完全错误。很难理解你为什么要这样做。