Postgresql 从数组中提取字段值引发编译错误

Postgresql 从数组中提取字段值引发编译错误,postgresql,Postgresql,在编译下面的代码时,我遇到了以下错误 SQL Error [42601]: ERROR: syntax error at or near "." org.postgresql.util.PSQLException: ERROR: syntax error at or near "." 这是因为这个代码 p_csdtl(v_cn).EDT := p_dt; p_csdtl(v_cn).Amnt := p_totalamt; p_csdtl(v_cn).STDT := v_curdtl(i).p

在编译下面的代码时,我遇到了以下错误

SQL Error [42601]: ERROR: syntax error at or near "."

org.postgresql.util.PSQLException: ERROR: syntax error at or near "."
这是因为这个代码

p_csdtl(v_cn).EDT := p_dt;
p_csdtl(v_cn).Amnt := p_totalamt;
p_csdtl(v_cn).STDT := v_curdtl(i).pdtm;
请帮我解决这个问题

do $$
begin
    create type csd_schema.creRec as(
                                 CS_ID numeric,
                                 STDT DATE,
                                 EDT   DATE,
                                 Amnt numeric);
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

do $$
begin
    CREATE DOMAIN csd_schema.creinfo as csd_schema.creRec[];
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

 create or replace  function  crm.amtcalc(
                                 p_dt        IN TIMESTAMP(0),
                                 p_pid       IN NUMERIC,
                                 p_csdtl  out csd_schema.creinfo,
                                 p_totalamt out NUMERIC) RETURNS RECORD AS $body$

DECLARE

   v_curdtl crm.curdtl_v; 

    c_curdt cursor is
     select array(select ats.ppdtm, 
            SUM(atr.amount_mny)  
       from amtpays ats, 
            amtdrm atr
      where ats.iq_num = atr.iq_num 
           group by ats.ppdtm);

   v_cn INTEGER := 0;

  begin
     p_totalamt := 0;
     v_cn := 1;

        p_csdtl(v_cn).EDT := p_dt;
        p_csdtl(v_cn).Amnt := p_totalamt;

        OPEN c_curdt;

        FETCH c_curdt INTO v_curdtl; 

        CLOSE c_curdt;

        if (coalesce(array_length(v_curdtl,1),0) > 0) then         
          FOR i IN coalesce(array_lower(v_curdtl,1),0) ..coalesce(array_upper(v_curdtl,1),0)
          LOOP 

            p_csdtl(v_cn).CS_ID := p_pid;
            p_csdtl(v_cn).STDT := v_curdtl(i).pdtm;
            p_csdtl(v_cn).EDT := p_dt;        
            v_cn := v_cn + 1;

           end LOOP;
        end if;    
  end $body$ language plpgsql;

提前感谢。

数组元素是用方括号访问的
p\u csdtl[v\u cn]
该函数最好写为
返回表(…)
(而不是返回隐藏在OUT参数中的数组)。然后,您还可以删除没有实际用途的其他类型。您可能还可以摆脱游标和循环处理,但函数的实际意图非常模糊,很难判断。但是,如果我没有弄错的话,您的函数只会返回从amtpays ats选择ats.ppdtm,SUM(atr.amount)的结果,然后在ats.iq_num=atr.iq_num组上加入amtdrm atr。我已经删除了运行正常的代码。你能帮我弄一下“OUT”参数吗。