2012-01-03 33 views
6

trong plpgsql postgresql,trong plpgsql, làm thế nào để thoát khỏi một hàm trả về hồ sơ

create function f1(p_i int) returns table(c1 int) as $$ 
begin 
    -- wish to exit, do not wish to return anything 
    if p_i < 0 then 
    -- cannot RETURN - since can only return record! 
    end if; 

    -- continue processing 
    return query select c2 from t1 where c1 = p_i; 
    ... 
end; 
$$ language plpgsql; 

theo doc, cách duy nhất để thoát ra khỏi một chức năng là RETURN. nhưng RETURN ở đây yêu cầu trả lại QUERY hoặc RETURN NEXT - dường như không có cách nào để thoát khỏi chức năng.

+2

Nếu một hàm (như của bạn) được định nghĩa để trở lại 'TABLE () 'hoặc' SETOF ... 'bạn có thể chỉ đơn giản là' RETURN; '. Bạn phải suy nghĩ về các hàm trả về một giá trị và không có tham số 'OUT' được định nghĩa. ** Sau đó, ** bạn cần trả về một giá trị. –

Trả lời

7

Nếu p_i < 0 thực sự là một lỗi sau đó bạn có thể raise an exception:

if p_i < 0 then 
    raise exception 'Don''t know what to do with %', p_i 
end if; 

Nếu p_i < 0 nên chỉ lặng lẽ trở về không có gì thì bạn có thể làm điều gì đó như thế này:

create or replace function f1(p_i int) returns table(c1 int) as $$ 
begin 
    if p_i < 0 then 
     return; 
    end if; 
    return query select c2 from t1 where c1 = p_i; 
end; 
$$ language plpgsql; 

Từ fine manual:

39.6. 1.2. RETURN NEXT và RETURN QUERY
[...]
các mục cá nhân để trở lại được quy định bởi một chuỗi các RETURN NEXT hoặc RETURN QUERY lệnh, và sau đó một thức RETURN lệnh không có tham số được sử dụng để chỉ ra rằng chức năng đã hoàn tất thực hiện.

Mỏ nhấn mạnh. Vì vậy, bạn có thể sử dụng return query để trả lại truy vấn và chỉ cần return; đơn giản để giải cứu mà không cần làm gì cả.

Ví dụ, phiên bản return; mang lại cho tôi những thứ như thế này:

=> select * from f1(-1); 
c1 
---- 
(0 rows) 
=> select * from f1(1); 
c1 
---- 
    1 
    1 
    ... 
(15 rows) 

và phiên bản ngoại lệ thực hiện điều này:

=> select * from f1(-1); 
ERROR: Don't know what to do with -1 
+0

ý tưởng hay cho bảng trống. bây giờ không trả lại bất cứ thứ gì - giống như trả lại một cái bàn trống - và dường như làm việc. nhưng cũng giống như 'break' rất tuyệt khi có trong một' loop', một 'return' sẽ thoát khỏi' function' sẽ là tốt đẹp để có. vấn đề là 'return' nhận hai nhiệm vụ: giá trị trả về và thoát. –

+0

@ccyoung: Tôi đã bỏ sót điều gì đó hiển nhiên, bạn không cần thủ thuật 'generate_series', chỉ đơn giản là' return; 'sẽ làm. –

+0

nếu bạn thực hiện trả lại 'lỗi' đơn giản, lỗi được nêu ra: phải trả về QUERY hoặc RETURN NEXT. hãy để tôi kiểm tra lại - có thể đã chết não. –

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