在plpgsql函数中UPDATE行类型数组

时间:2014-12-20 15:41:12

标签: sql postgresql sql-update plpgsql

我将表格表示某些几何图形作为分组到位置的区域(连接区域)。我有一个函数应该添加一个区域到一个地方。我收到以下错误,我不明白。

select * from addregion2place(1,1) ;
ERROR:  column "rgnz" does not exist
LINE 1: update only place set rgnz = rgnz || region, 
                                     ^
QUERY:  update only place set rgnz = rgnz || region, 
                                     bx = containingBox( region.bx, bx )
            from region
            where place_id = intoPlace_id and reg_id = region_id
CONTEXT:  PL/pgSQL function "addregion2place" line 4 at SQL statement

我正在尝试将区域添加到区域数组的末尾。有人可以告诉我为什么rgnz=的右侧而不是在左边?更重要的是,如何修复?

CREATE OR REPLACE FUNCTION addRegion2Place( reg_id integer ,  intoPlace_id integer ) returns VOID AS $ar2p$
       DECLARE
       BEGIN
        update only place set rgnz = rgnz || region, 
                                     bx = containingBox( region.bx, bx )
            from region
            where place_id = intoPlace_id and reg_id = region_id;

       END;
$ar2p$ LANGUAGE plpgsql;

-- a closed path
create table if not exists region (
       place_id integer,
       pts polygon,
       bx box CHECK (box(pts) ~= bx), 
       region_id integer DEFAULT nextval('region_region_id_seq'::regclass) NOT NULL
);

-- place: a collection of regions
create table if not exists place (
       place_id integer DEFAULT nextval('place_place_id_seq'::regclass) NOT NULL,
       bx box DEFAULT (NULL),
       rgnz region[]
);

1 个答案:

答案 0 :(得分:0)

有些列名不明确。将表限定添加到列以消除歧义。

CREATE OR REPLACE FUNCTION addRegion2Place(reg_id integer, intoplace_id integer)
  RETURNS void AS
$ar2p$
BEGIN
   UPDATE ONLY place p
   SET    rgnz = p.rgnz || r
        , bx = containingBox(r.bx, b.bx)  -- guessing; your code was ambiguous
   FROM   region r
   WHERE  p.place_id = intoplace_id       -- more guessing
   AND    r.region_id = reg_id;    
END
$ar2p$ LANGUAGE plpgsql;

特别是place_idbx含糊不清。值得注意的是,rgnz似乎没问题 - 除非您没有显示原始定义。您没有透露您的Postgres版本。旧版本对这些歧义有不同程度的容忍度(最终总会导致异常)。

同时确保region.region_idplace.place_id是唯一的,或者UPDATE变得混乱。我在表格定义中没有看到PRIMARY KEYUNIQUE约束。