प्रश्न एक बहु-कथन बैच स्क्रिप्ट दिखाता है। RAISE_APPLICATION_ERROR() केवल PL/SQL ब्लॉक (उप-प्रोग्राम) से बाहर निकलता है, समग्र स्क्रिप्ट से बाहर नहीं (जैसा कि जस्टिन द्वारा बताया गया है) इसलिए यह आने वाले बयानों के साथ जारी रहेगा।
बैच स्क्रिप्ट के लिए, जब भी SQLERROR EXIT का उपयोग करना सबसे अच्छा है। हाँ, यह एक SQLप्लस निर्देश है, मानक SQL नहीं है, लेकिन काफी पोर्टेबल है; सबसे लोकप्रिय Oracle उपकरण जो स्क्रिप्ट का समर्थन करते हैं, कम से कम आंशिक रूप से इस निर्देश का समर्थन करते हैं। निम्न उदाहरण SQL में काम करता है साथ ही, SQL*Developer, Toad, SQLsmith और संभवत:अन्य, और यदि आप लाइन आउट पर टिप्पणी करते हैं, तो समस्या को प्रदर्शित करता है।
set serveroutput on
-- Without this line, things keep going
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
BEGIN
IF (1 > 0) THEN
DBMS_OUTPUT.PUT_LINE('First thing');
RAISE_APPLICATION_ERROR(-20000, 'Test failed'); -- not enough
END IF;
END;
/
-- This will execute if you remove WHEN SQLERROR.., so RAISE_APPLICATION_ERROR is not enough
BEGIN
DBMS_OUTPUT.PUT_LINE('Second thing - Executes anyway');
END;
/
यदि आप WHEN SQLERROR को हटाते हैं, तो स्क्रिप्ट जारी रहेगी और दूसरा ब्लॉक आदि निष्पादित करेगी, जो कि प्रश्न से बचने के लिए बिल्कुल सही है।
इस उदाहरण में, sqlplus का अनुकरण करने वाले ग्राफिकल टूल का लाभ यह है कि वे वास्तव में स्क्रिप्ट को रोकते हैं और शेष स्क्रिप्ट को शेल कमांड के रूप में कमांड शेल में सबमिट नहीं करते हैं, जो कि SQL में स्क्रिप्ट पेस्ट करने पर होता है। एम> प्लस कंसोल विंडो में चल रहा है। एसक्यूएल प्लस त्रुटि पर बाहर निकल सकता है, लेकिन शेष बफ़र किए गए आदेशों को तब OS शेल द्वारा नियंत्रित किया जाएगा, जो थोड़ा गड़बड़ और संभावित रूप से जोखिम भरा है, यदि आपके पास टिप्पणियों में शेल कमांड थे (जो अनसुना नहीं है)। SQLPlus के साथ, कनेक्ट करना, और फिर स्क्रिप्ट को निष्पादित करना, या इससे बचने के लिए कमांड लाइन तर्क (sqlplus scott/tiger @foo.sql) में इसे पास करना हमेशा सर्वोत्तम होता है।