2012-01-03 12 views
6

PostgreSQL plpgsql में लौटने,, कैसे एक समारोह से बाहर निकलने के लिए <a href="http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING" rel="noreferrer">doc</a> के अनुसार रिकॉर्ड

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; 

, एक ही रास्ता एक समारोह से बाहर तोड़ रिटर्न है। लेकिन यहां पर एक वापसी के लिए QUETURN QUERY या वापस लौटने की आवश्यकता है - फ़ंक्शन से बाहर निकलने का कोई तरीका नहीं है।

+2

() 'या' SETOF ... 'आप बस' वापसी 'कर सकते हैं; आपको उन कार्यों के बारे में सोचना चाहिए जो एक मान वापस करते हैं और उनमें 'आउट' पैरामीटर परिभाषित नहीं होता है। ** फिर ** आपको एक मूल्य वापस करने की जरूरत है। –

उत्तर

7

तो p_i < 0 वास्तव में एक त्रुटि है तो आप कर सकते थे raise an exception: बस चुपचाप लौट जाना कुछ नहीं

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

तो p_i < 0 तो आप कुछ इस तरह कर सकता है:

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; 

fine manual से:

39.6। 1.2। रिटर्न अगले और रिटर्न क्वेरी के
[...] वापस जाने के लिए RETURN NEXT या RETURN QUERY आदेशों, और फिर एक अंतिम RETURN कोई तर्क के साथ आदेश प्रयोग किया जाता है की एक श्रृंखला के द्वारा निर्दिष्ट कर रहे हैं संकेत मिलता है कि समारोह समाप्त हो गया है
अलग-अलग आइटम
निष्पादित।

जोर मेरा। तो आप क्वेरी को वापस करने के लिए अपने return query का उपयोग कर सकते हैं और कुछ भी किए बिना बाहर निकलने के लिए बस एक साधारण return; का उपयोग कर सकते हैं।

उदाहरण के लिए, return; संस्करण मुझे चीज़ें प्राप्त होती है इस तरह:

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

और अपवाद संस्करण इस करता है: (आपके जैसे) एक समारोह `टेबल वापस जाने के लिए परिभाषित किया गया है

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

खाली टेबल के लिए अच्छा विचार। अब कुछ भी वापस नहीं लौटा रहा है - एक खाली टेबल लौटने के समान ही - और काम करने लगता है। लेकिन 'ब्रेक' की तरह ही 'लूप' में होना बहुत अच्छा है, 'फ़ंक्शन' से बाहर निकलने वाला 'रिटर्न' अच्छा होगा। समस्या यह है कि 'वापसी' दो कार्यों पर लेती है: वापसी मूल्य और बाहर निकलें। –

+0

@ccyoung: मुझे कुछ स्पष्ट याद आ रही थी, आपको 'gener_series' चाल की आवश्यकता नहीं है, बस एक साधारण 'वापसी;' करूँगा। –

+0

यदि आप एक साधारण 'रिटर्न' करते हैं तो एक त्रुटि उठाई जाती है: QUERY वापसी या फिर वापस लौटना चाहिए। मुझे दोबारा जांचने दो - शायद मस्तिष्क मर गया हो। –

संबंधित मुद्दे

 संबंधित मुद्दे