遍历plpgsql中的复合数组

时间:2018-09-15 07:57:57

标签: postgresql plpgsql

我想定义一个复合数组,初始化数组的三个元素,然后循环遍历每个元素。我需要此循环并对其进行迭代,以解决我遇到的问题。

我已经尝试了几天的时间来编写代码并引用网上的一些资源,但这没有用。有人可以帮忙吗?这是代码,即使是第一次初始化也不起作用,所以我没有满足其余要求的代码(在初始化之后进行迭代)

CREATE TYPE temp_n_inv_item AS (
    name            text,
    supplier_id     integer,
    price           numeric
);



CREATE OR REPLACE function temp_n_bulk_load2()
returns void
as
$$
declare
   v_t temp_n_inv_item[]; 


BEGIN


      v_t[1] := ARRAY ['Item1',1,10];
      v_t[2] := ARRAY ['Item2',2,20];
      v_t[3] := ARRAY ['Item3',3,30];


 --  raise notice 'first array % ', v_t[1];
--raise notice 'first array % ', v_t[2];
--raise notice 'first array % ', v_t[3];

--iterate though each of the v_t array in a loop 

null; --added as a temporary placeholder 

END;
$$
language plpgsql;

--select temp_n_bulk_load2()

关于, DbuserN

更新 出人意料的是,在发布问题之后,我看到一个引用并且赋值现在可以正常工作,但是我尝试将返回类型更改为不起作用的数组(这是一个附加问题),尽管赋值现在已按以下方式修复,但是下面给出的错误是“错误:无法从返回复合类型的函数返回非复合值” 修改后的代码

CREATE OR REPLACE function temp_n_bulk_load2()
returns temp_n_inv_item
as
$$
declare
   v_t temp_n_inv_item[]; 


BEGIN


      v_t[1] := row ('Item1',1,10);
      v_t[2] := row ('Item2',2,20);
      v_t[3] := row ('Item3',3,30);


  raise notice 'first array % ', v_t[1];
raise notice 'first array % ', v_t[2];
raise notice 'first array % ', v_t[3];

--iterate though each of the v_t array in a loop 

null; --added as a temporary placeholder 
return v_t;

END;
$$
language plpgsql;

2 个答案:

答案 0 :(得分:3)

PLpgSQL具有用于数组迭代的特殊语句。对于大型阵列,它的效率要高得多(对于小型阵列,它并不是太重要):

create type tp as (a int, b int);

do $$
declare a tp[];
          r record;
begin
  /* composite array initialization */
  a = array[(1,2),(3,4),(5,6)];

  /* iterate over a array */
  foreach r in array a
  loop
    raise notice '% % %', r, r.a, r.b;
  end loop;
end;
$$;

NOTICE:  (1,2) 1 2
NOTICE:  (3,4) 3 4
NOTICE:  (5,6) 5 6
DO

不要害怕读documentation

答案 1 :(得分:0)

这里您正在创建使用

生成的数据类型数组
CREATE TYPE temp_n_inv_item AS (
    name            text,
    supplier_id     integer,
    price           numeric
);

因此只需返回数据类型为temp_n_inv_item[]的数组即可。

CREATE OR REPLACE FUNCTION adm.temp_n_bulk_load2()
  RETURNS boolean AS
$BODY$
declare
   v_t temp_n_inv_item[]; 


BEGIN

/*CREATE TYPE temp_n_inv_item AS (
    name            text,
    supplier_id     integer,
    price           numeric
);*/
      v_t[1] := row ('Item1',1,10);
      v_t[2] := row ('Item2',2,20);
      v_t[3] := row ('Item3',3,30);


raise notice 'first array % ', v_t[1];
raise notice 'first array % ', v_t[2];
raise notice 'first array % ', v_t[3];

--iterate though each of the v_t array in a loop 
//updated
  FOR cnt in 1..(array_length(v_t,1))
            LOOP
Raise notice ' array value % ', v_t[cnt];

 END LOOP;

return true;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

希望这可以解决您的问题。