एक plpgsql फ़ंक्शन स्वचालित रूप से एक लेनदेन के अंदर चलता है। यह सब सफल होता है या यह सब विफल रहता है। मैनुअल:
<ब्लॉकक्वॉट>
कार्यों और ट्रिगर प्रक्रियाओं को हमेशा बाहरी क्वेरी द्वारा स्थापित लेनदेन के भीतर निष्पादित किया जाता है - वे उस लेनदेन को शुरू या प्रतिबद्ध नहीं कर सकते हैं, क्योंकि उनके लिए निष्पादित करने के लिए कोई संदर्भ नहीं होगा। हालांकि, एक ब्लॉक जिसमें EXCEPTION
होता है क्लॉज प्रभावी रूप से एक उप-लेनदेन बनाता है जिसे बाहरी लेनदेन को प्रभावित किए बिना वापस लाया जा सकता है। इसके बारे में अधिक जानकारी के लिए धारा 42.6.6 देखें।
इसलिए, यदि आप चाहते हैं, तो आप एक अपवाद को पकड़ सकते हैं जो सैद्धांतिक रूप से हो सकता है (लेकिन इसकी संभावना बहुत कम है)।
मैनुअल में ट्रैपिंग त्रुटियों पर विवरण।
आपके कार्य की समीक्षा की गई और सरलीकृत किया गया:
CREATE FUNCTION foo(v_weather text
, v_timeofday text
, v_speed text
, v_behavior text)
RETURNS SETOF custombehavior
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM custombehavior
WHERE weather = 'RAIN'
AND timeofday = 'NIGHT'
AND speed = '45MPH';
INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE NOT EXISTS (
SELECT FROM defaultbehavior
WHERE a = 'RAIN'
AND b = 'NIGHT'
AND c = '45MPH'
);
RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;
END
$func$;
अगर आपको वास्तव में लेन-देन शुरू/समाप्त करना है जैसा कि शीर्षक में दर्शाया गया है SQL प्रक्रियाओं . को देखें पोस्टग्रेज 11 या बाद के संस्करण में (CREATE PROCEDURE
) देखें:
- PostgreSQL में, "संग्रहीत प्रक्रिया" और अन्य प्रकार के कार्यों में क्या अंतर है?