2012-04-18 38 views
22

Tôi đang cố gắng lặp qua một mảng số nguyên (integer[]) trong hàm plpgsql. Một cái gì đó như thế này:Lặp lại số nguyên [] trong PL/pgSQL

declare 
    a integer[] = array[1,2,3]; 
    i bigint; 
begin 
    for i in a 
loop 
    raise notice "% ",i; 
end loop; 
return true; 
end 

Trong trường hợp sử dụng thực tế, mảng số a được chuyển làm tham số cho hàm. Tôi nhận được lỗi này:

ERROR: syntax error at or near "$1" 
LINE 1: $1 

Làm thế nào để lặp qua mảng đúng cách?

Trả lời

50
DECLARE 
    a integer[] := array[1,2,3]; 
    i integer;     -- int, not bigint! 
BEGIN 
FOR i IN 1 .. array_upper(a, 1) 
LOOP 
    RAISE NOTICE '%', a[i];  -- single quotes! 
END LOOP; 
RETURN TRUE; 
END 

Hoặc thử new FOREACH in PostgreSQL 9.1:

FOREACH i IN ARRAY a 
LOOP 
    RAISE NOTICE '%', i; 
END LOOP; 

giải pháp Tuy nhiên, thiết lập dựa trên với generate_series() hoặc unnest() thường nhanh hơn so với vòng lặp cho bộ lớn.

ví dụ cơ bản:

Tìm kiếm các thẻ hoặc để biết thêm.

+0

ngay bây giờ tôi đang chuyển mảng tới hàm là 'f (mảng [1,2,3,4])' có cách nào tốt hơn để truyền một mảng tới hàm không? –

+3

'f ('{1,2,3,4}' :: int [])' là * một cách khác *. Tốt hơn? - bạn quyết định! –

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