我想在循环时将一些记录插入表中。记录作为varchar选项卡传递给函数,即:。
create function a(tab varchar[]) RETURNS void AS
$$
DECLARE
b varchar(20);
BEGIN
FOREACH b IN ARRAY tab
LOOP
INSERT INTO....;
END LOOP;
RETURN;
END;
$$
LANGUAGE plpgsql;
但是,执行时会出现错误:
ERROR: syntax error at or near "FOREACH"
LINE 1: FOREACH $1 IN ARRAY tab LOOP INSERT INTO x (c, ...
QUERY: FOREACH $1 IN ARRAY tab LOOP INSERT INTO x (c) VALUES ( $1)
CONTEXT: SQL statement in PL/PgSQL function " near line ...
********** ERROR **********
ERROR: syntax error at or near "FOREACH"
有人知道为什么以及如何解决这个问题吗?
答案 0 :(得分:3)
自PostgreSQL 9.1起,还有一个built-in way to loop through array slices:
FOREACH x SLICE 1 IN ARRAY $1
LOOP
RAISE NOTICE 'row = %', x;
END LOOP;
x
必须是匹配的数组类型和...
SLICE值必须是不大于数组维数的整数常量
对于一维数组,只省略SLICE
部分,而x
可以是一个简单的类型,就像你在问题中显示一样。
答案 1 :(得分:2)
FOREACH
构造。对于早期版本,您可以通过以下方式使用unnest()
功能:
CREATE FUNCTION a(tab varchar[]) RETURNS void AS
$$
DECLARE
b varchar(20);
BEGIN
FOR b IN SELECT unnest(tab)
LOOP
INSERT INTO x(c) VALUES (b);
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
答案 2 :(得分:0)
我想添加一个东西,那就是不需要的东西会排除数组的所有级别:
select * from unnest(ARRAY[ARRAY[1,2,3],Array[5,6,7]]);
unnest
--------
1
2
3
5
6
7
(6 rows)
如果要循环遍历多维数组的一个级别,则应循环使用以下内容
FOR out_count IN
array_lower(in_transactions, 1) ..
array_upper(in_transactions, 1)
LOOP
-- Fill the bulk payments table
INSERT INTO bulk_payments_in(id, amount)
VALUES (in_transactions[out_count][1],
in_transactions[out_count][2]);
END LOOP;