2012-03-20 278 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是默認的(因此您可以省略聲明)。