Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了postgresql – 错误:缺少表“new”的FROM子句条目大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个父表layer_1_和一些子表layer_1_points,layer_1_lineStrings等,其中包含一些几何数据.每个子表都有自己的几何约束.因此,例如,layer_1_points具有以下约束:

CONSTraiNT enforce_geotype_geom_geom checK (geometrytype(geom) = 'POINT'::text)

而layer_1_lineStrings表具有以下约束:

CONSTraiNT enforce_geotype_geom_geom checK (geometrytype(geom) = 'lineStriNG'::text)

许多其他图层表具有相似的名称:layer_2_,layer_3_,…,layer_N_.他们都有自己的子桌.我想要实现的是当用户插入父表(layer_N_)时,应该将此insert语句转发到特定的子表(layer_N_points等).所以,当我这样做时:

INSERT INTO layer_1_ (geom) VALUES(ST_GeomFromText('POINT(0 0)',3857))

我应该插入到layer_1_points,因为geom类型是POINT.为了实现这一切,我创建了这个触发器功能和触发器本身:

CREATE OR replaCE FUNCTION trigger_layer_insert() 
  RETURNS trigger AS 
$$
DECLARE 
    var_geomtype text;
    table_@R_932_4687@t;
    layer_ID text := (TG_ARGV[0])::text;
BEGIN
    var_geomtype := geometrytype(NEW.geom);    
    IF var_geomtype = 'POINT' THEN
        table_name := (SELECT concat ('layer_',layer_ID,'_points'));
    ELSIF var_geomtype = 'MulTIPOINT' THEN
        table_name := (SELECT concat ('layer_','_multipoints'));       
    ELSIF var_geomtype = 'lineStriNG' THEN
        table_name := (SELECT concat ('layer_','_lineStrings'));
    ELSIF var_geomtype = 'MulTIlineStriNG' THEN
        table_name := (SELECT concat ('layer_','_multilineStrings'));
    ELSIF var_geomtype = 'polyGON' THEN
        table_name := (SELECT concat ('layer_','_polygons'));
    ELSIF var_geomtype = 'MulTIpolyGON' THEN
        table_name := (SELECT concat ('layer_','_multipolygons'));
    END IF;

    EXECUTE '
        INSERT INTO ' || table_name || ' 
        SELECT * FROM (SELECT NEW.*) AS t
    ';

    RETURN NulL;   
END; 
$$
LANGUAGE 'plpgsql' VolATILE;

CREATE trigGER trigger_layer_1_ BEFORE INSERT
ON layer_1_ FOR EACH ROW 
EXECUTE PROCEDURE trigger_layer_insert(1);

但是,当我做实际插入时

INSERT INTO layer_1_ (geom) VALUES(ST_GeomFromText('POINT(0 0)',3857))

我收到一条错误消息

ERROR: missing FROM-clause entry for table "new"
liNE 3:         SELECT * FROM (SELECT NEW.*) AS t
                                  ^
query:  
    INSERT INTO layer_1_points 
    SELECT * FROM (SELECT NEW.*) AS t

那么,SELECT NEW.*有什么问题?我该如何解决?谢谢!

编辑

我也试过这个:

EXECUTE '
    INSERT INTO ' || table_name || ' 
    SELECT * FROM (SELECT NEW.*) AS t
' USING NEW;

但它没有效果.

解决方法@H_801_47@
您使用PLPGsql语句EXECUTE执行某些操作时,它会在不同的上下文中运行,因此局部变量在那里不可见.传递变量’EXECUTE’< sql script>‘使用<变量列表&gt ;;使用表格:

EXECUTE 'insert into table(fIEld1,fIEld2) values ($1,$2)' USING var1,var2;

所以声明应该是:

EXECUTE 
  'INSERT INTO ' || table_name || ' SELECT * FROM SELECT $1.*) AS t'
  USING NEW;

大佬总结

以上是大佬教程为你收集整理的postgresql – 错误:缺少表“new”的FROM子句条目全部内容,希望文章能够帮你解决postgresql – 错误:缺少表“new”的FROM子句条目所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:例如