Postgres plpgsql - ARRAY 记录属性赋值

Postgres plpgsql - ARRAY record attribute asssignment

如果有人可以指导 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

以下作品,但黑客创建临时、复制、分配、修改重新评估

         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** 

问题是您的 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] 编译为记录变量,它只是将其视为数组元素(因此出现错误消息)。这可以是 "fixed" 使用一个没有数组的 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