您不需要循环,您可以使用unnest
将数组从string_to_array
转换为一组行,然后使用一个简单的insert ... select
构造:
create or replace function ff(int, text) returns integer as $$
begin
insert into test(i, t)
select $1, s
from unnest(string_to_array($2, ',')) as dt(s);
return 0;
end
$$ language plpgsql;
在此过程中,我还更正了一些拼写错误(RETRUNS
、RETRUN
和pgsql
)。
你也可以使用regexp_split_to_table
:
create or replace function ff(int, text) returns integer as $$
begin
insert into test(i, t)
select $1, s
from regexp_split_to_table($2, ',') as dt(s);
return 0;
end
$$ language plpgsql;
如果你被困在 8.1 石器时代并且对此无能为力,那么也许这样的事情会起作用:
create or replace function ff(int, text) returns integer as $$
declare
a text[];
i int;
begin
select string_to_array($2, ',') into a;
i := 1;
loop
if i > array_upper(a, 1) then
exit;
else
insert into test(i, t) values($1, a[i]);
i := i + 1;
end if;
end loop;
return 0;
end
$$ language plpgsql;
我认为这应该适用于 8.1,但我无权访问 8.1 进行检查。