【问题标题】:Postgres plpgsql - ARRAY record attribute asssignmentPostgres plpgsql - ARRAY 记录属性分配
【发布时间】:2018-03-22 00:51:54
【问题描述】:

如果 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

Following Works but a hack create temp, copy,assign ,modify 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** 

【问题讨论】:

    标签: postgresql postgresql-9.4


    【解决方案1】:

    问题是您的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
    

    【讨论】:

    • 感谢您的回复。抱歉,我的问题不清楚。我的问题源于 Oracle 到 postgres 的迁移。 Oracle 允许记录的单个属性(这是要更新的数组的一部分)。像 v_array[1].descr :='ZZZ';在 Postgres 不允许的情况下有效。想知道是否允许注释此类属性分配并且需要更新整个记录,这是我的语法问题并且存在一些替代语法。在我的例子中,记录结构很宽,当我们迭代地遍历数组时,只有很小的属性子集需要更新。
    • 更新了我的答案以进行澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多