我想定义一个复合数组,初始化数组的三个元素,然后循环遍历每个元素。我需要此循环并对其进行迭代,以解决我遇到的问题。
我已经尝试了几天的时间来编写代码并引用网上的一些资源,但这没有用。有人可以帮忙吗?这是代码,即使是第一次初始化也不起作用,所以我没有满足其余要求的代码(在初始化之后进行迭代)
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;
答案 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;
希望这可以解决您的问题。