2012-03-20 54 views
28

Tôi đang viết một tập lệnh plpgsql.
Tôi muốn lấy từng nội dung mảng từ một mảng hai chiều.Postgres - mảng cho vòng lặp

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

Nhưng mã trên trả về

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

trong một dòng. Tôi muốn để có thể lặp lại và gọi một chức năng mà có các thông số như:

another_func(key1,val1) 

Trả lời

79

Kể từ PostgreSQL 9.1 có sự thuận tiện 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$ 

Giải pháp cho phiên bản cũ:

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$ 

Ngoài ra, không có sự khác biệt giữa varchar[]varchar[][] cho hệ thống kiểu PostgreSQL. Tôi giải thích chi tiết hơn here.

Tuyên bố DO yêu cầu ít nhất PostgreSQL 9.0 và LANGUAGE plpgsql là mặc định (vì vậy bạn có thể bỏ qua tuyên bố).

Các vấn đề liên quan