Postgres plpgsql - ARRAY记录属性asssignment

时间:2018-03-20 16:36:04

标签: postgresql postgresql-9.4

如果有人可以指导,如果Postgres允许分配ARRAY记录属性,我们将不胜感激。例如 - 虚拟设置。

尝试更新记录的属性(数组的一部分)。 直接分配不起作用。必须创建一种创建额外记录,分配和交换的迂回方式。

 create table dummy_array (id numeric, descr varchar(100));
 insert into dummy_array values(1,'TEST1'),(2,'TEST2');
 select * from dummy_array;
 do
  $function$
   declare
    v_array dummy_array[];
    v_dummy_rec dummy_array;
       begin
        v_array=array(select ROW(id,descr) from dummy_array);
         raise notice '%',v_array[1].descr; 
         --FOLLOWING DIRECT ASSIGNMENT DOES NOT WORK
         v_array[1].descr :='ZZZ';--This assignment errors out 
         end ;
   $function$

      Errors out with SQL ERROR[42601]:ERROR:syntax error at or near "."
      Tried even  (v_array[1]).descr :='ZZZ'; does not work

关注Works但是hack创建临时,复制,分配,修改reassing

         do
         $function$
          declare
           v_array dummy_array[];
           v_dummy_rec dummy_array;
         begin
           v_array=array(select ROW(id,descr) from dummy_array);
           raise notice '%',v_array[1].descr;   
           **--v_array[1].descr :='ZZZ';--This assignment errors out**
           v_dummy_rec :=v_array[1];
           v_dummy_rec.descr :='ZZZ';
           v_array[1]:=v_dummy_rec;
           raise notice '%',v_array[1].descr;   
          end ;
         $function$

如果能够进行如上所示的直接作业,可以指导我吗

        **v_array[1].descr :='ZZZ';--This assignment errors out** 

1 个答案:

答案 0 :(得分:0)

问题是,您的v_array类型为dummy_array[],因此它只接受dummy_array[]值。

这有效v_array[1] := ROW(1,'ZZZ');

 do
  $function$
   declare
    v_array dummy_array[];
    v_dummy_rec dummy_array;
       begin
        v_array=array(select ROW(id,descr) from dummy_array);
         raise notice '%',v_array[1].descr; 
         v_array[1] := ROW(1,'ZZZ'); 
        raise notice '%',v_array[1].descr; 
         end ;
   $function$

回答澄清评论

在PostgreSQL中,可以更新记录的各个属性(see here)。在你的情况下,问题是数组,PostgreSQL失败的地方;因为它似乎在运行代码(PL)时不会将v_array[1]编译为记录变量,所以它只是将其视为数组元素(因此是错误消息)。这可以修复"使用类型dummy_array的额外变量而不使用数组;那是你的v_dummy_rec

DO $function$
DECLARE
    v_array dummy_array[];
    v_dummy_rec dummy_array;
BEGIN
    v_array=array(select ROW(id,descr) from dummy_array);
      raise notice '%',v_array[1].descr; 
    v_array[1] := ROW(1,'ZZZ'); 
      raise notice '%',v_array[1].descr;
-- Here is the use of v_dummy_rec:
    v_dummy_rec := v_array[1];
    v_dummy_rec.descr := 'AAA';
    v_array[1] := v_dummy_rec;
      raise notice '%',v_array[1].descr;
END; $function$

RAISE NOTICE输出:

NOTICE:  TEST1
NOTICE:  ZZZ
NOTICE:  AAA