2008-10-07 11 views
33

में 'CONTINUE' कीवर्ड मैं पीएल/एसक्यूएल में एक टीएसक्यूएल संग्रहीत प्रक्रिया माइग्रेट कर रहा हूं और एक समस्या आई है - ओरेकल 10 जी में एक CONTINUE कीवर्ड की कमी।ओरेकल 10 जी पीएल/एसक्यूएल

मैंने पढ़ा है कि ओरेकल 11 जी में यह एक नई सुविधा के रूप में है, लेकिन अपग्रेडिंग दुर्भाग्य से एक विकल्प नहीं है।

क्या 10 जी में CONTINUE का कोई विकल्प है? मुझे विश्वास नहीं है कि एसपी के तर्क को काम के आसपास के रूप में पुन: व्यवस्थित करना व्यावहारिक है, क्योंकि मेरे पास बाहरी लूप, एक आईएफ, फिर एक घोंसला वाला आईएफ है, फिर उस के भीतर एक कथन ब्लॉक के अंत में CONTINUE है।

किसी भी मदद की सराहना की जाएगी, चीयर्स।

उत्तर

52

आप goto and labels का उपयोग जारी रखने का अनुकरण कर सकते हैं।

DECLARE 
    done BOOLEAN; 
BEGIN 
    FOR i IN 1..50 LOOP 
     IF done THEN 
     GOTO end_loop; 
     END IF; 
    <<end_loop>> -- not allowed unless an executable statement follows 
    NULL; -- add NULL statement to avoid error 
    END LOOP; -- raises an error without the previous NULL 
END; 
+4

+1 बदसूरत कथन को संभालने के लिए एक बदसूरत कामकाज के लिए +1 :) –

+2

कभी-कभी, हमें इसे टाइप करना होगा और बाद में हमारी नाक को कवर करना होगा। :) – jop

+0

आप एक ऐसे निर्माण का भी उपयोग कर सकते हैं जो पूरी तरह से जारी रखने की नकल करता है। और बिना किसी शून्य के :) :) नीचे मेरी प्रतिक्रिया देखें। – SRO

4

क्या आप आईएफ को किसी फ़ंक्शन में दोबारा कर सकते हैं, उपयुक्त बिंदु पर लौट सकते हैं (प्रारंभिक होने पर जल्दी)। फिर नियंत्रण प्रवाह लूप में सही जगह पर उठाएगा।

क्या यह समझ में आता है?

1

ओरेकल में वहाँ एक ऐसी ही बयान से बाहर निकलें कहा जाता है कि या तो एक पाश या एक समारोह/प्रक्रिया बाहर निकल जाता है (यदि वहाँ से बाहर निकलने के लिए कोई पाश है)। आप कुछ शर्त की जांच करने के लिए एक WHEN जोड़ सकते हैं।

ऊपर दिए गए उदाहरण पुनर्लेखन सकता है इस प्रकार है:

DECLARE 
    done BOOLEAN; 
BEGIN 
    FOR i IN 1..50 LOOP 
    EXIT WHEN done; 
    END LOOP; 
END; 

यह पर्याप्त अगर आप गहरे कुछ नेस्टेड छोरों और तर्क नीचे से बाहर निकलना चाहते हैं, लेकिन नहीं हो सकता है gotos और की एक जोड़ी की तुलना में बहुत स्पष्ट है NULLs।

+1

EXIT समाधान वास्तव में इस मामले में काम नहीं करेगा, क्योंकि यह पूरे लूप को समाप्त कर देगा, क्योंकि अगली पुनरावृत्ति शुरू होने के विपरीत ही जारी रहेगा। मुझे लगता है कि मुझे गोटो समाधान के साथ जाना होगा, हर किसी को आपके सुझावों के लिए उत्साहित करता है! –

5

यह 10 ग्राम में उपलब्ध नहीं है, लेकिन यह 11g में एक new feature है

10

हालांकि यह थोड़ा जटिल है और सिर्फ एक नकली है, तो आप अपवाद इस तरह से उपयोग कर सकते हैं:

DECLARE 
    i NUMBER :=0; 
    my_ex exception; 
BEGIN 
    FOR i IN 1..10 
    LOOP 
     BEGIN 
     IF i = 5 THEN 
      raise my_ex; 
     END IF; 
     DBMS_OUTPUT.PUT_LINE (i); 
     EXCEPTION WHEN my_ex THEN 
     NULL; 
     END; 
    END LOOP; 

END; 
2

नहीं वास्तव में सुंदर, लेकिन सरल :

DECLARE 
    done BOOLEAN; 
BEGIN 
    FOR i IN 1..50 LOOP 
     IF done THEN 
     NULL; 
     ELSE 
     <do loop stuff>; 
     END IF; 
    END LOOP; 
END; 
6

वास्तव में, पी एल एसक्यूएल जारी की जगह के लिए कुछ है करता है।

declare 
    i integer; 
begin 
    i := 0; 

    <<My_Small_Loop>>loop 

     i := i + 1; 
     if i <= 3 then goto My_Small_Loop; end if; -- => means continue 

     exit; 

    end loop; 
end; 
+1

गोटो से थोड़ी कम बदसूरत एक नल लाइन के बाद, लेकिन यह काम करता है। धन्यवाद! –

5

भविष्य की खोजों के लिए, Oracle 11g में वे एक continue बयान जोड़ा है, जो इस तरह इस्तेमाल किया जा सकता:

SQL> BEGIN 
    2  FOR i IN 1 .. 5 LOOP 
    3  IF i IN (2,4) THEN 
    4   CONTINUE; 
    5  END IF; 
    6  DBMS_OUTPUT.PUT_LINE('Reached on line ' || TO_CHAR(i)); 
    7  END LOOP; 
    8 END; 
    9/
Reached on line 1 
Reached on line 3 
Reached on line 5 

PL/SQL procedure successfully completed. 
आपको बस इतना करना है पाश के लिए एक लेबल (एक नाम) को जोड़ने के लिए है
संबंधित मुद्दे