2012-03-20 282 views
28

我正在写一个plpgsql脚本。
我想从二维数组中逐个获取数组内容。Postgres - 数组for循环

DECLARE 
    m varchar[]; 
    arr varchar[][] := array[['key1','val1'],['key2','val2']]; 
BEGIN 
    for m in select arr 
    LOOP 
    raise NOTICE '%',m; 
    END LOOP; 
END; 

但上面的代码返回

{{key1,val1},{key2,val2}} 

在一行中。我希望能够遍历和调用另一个函数,该函数的参数,如:

another_func(key1,val1) 

回答

79

因为PostgreSQL 9.1有方便FOREACH

DO 
$do$ 
DECLARE 
    m varchar[]; 
    arr varchar[] := array[['key1','val1'],['key2','val2']]; 
BEGIN 
    FOREACH m SLICE 1 IN ARRAY arr 
    LOOP 
     RAISE NOTICE 'another_func(%,%)',m[1], m[2]; 
    END LOOP; 
END 
$do$ 

解决方案旧版本

DO 
$do$ 
DECLARE 
    arr varchar[] := '{{key1,val1},{key2,val2}}'; 
BEGIN 
    FOR i IN array_lower(arr, 1) .. array_upper(arr, 1) 
    LOOP 
     RAISE NOTICE 'another_func(%,%)',arr[i][1], arr[i][2]; 
    END LOOP; 
END 
$do$ 

此外,之间没有差别PostgreSQL类型系统的和varchar[][]。我更详细地解释here

DO声明至少需要PostgreSQL 9.0,而LANGUAGE plpgsql是默认的(因此您可以省略声明)。