الكلمة الأساسية "متابعة" في Oracle 10g PL/SQL
سؤال
أقوم بترحيل إجراء TSQL مخزن إلى PL/SQL وواجهت مشكلة - عدم وجود كلمة أساسية CONTINUE في Oracle 10g.
لقد قرأت أن Oracle 11g يشتمل على هذه الميزة الجديدة، ولكن الترقية ليست خيارًا للأسف.
هل هناك أي بديل للمتابعة في 10 جرام؟لا أعتقد أنه من العملي إعادة هيكلة منطق SP كحل بديل، لأن لدي حلقة خارجية، IF، ثم IF متداخل، ثم CONTINUE في نهاية كتلة البيان داخل IF.
أي مساعدة سيكون موضع تقدير كبير، هتاف.
المحلول
يمكنك محاكاة الاستمرار في الاستخدام غوتو والتسميات.
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;
نصائح أخرى
على الرغم من أنها معقدة بعض الشيء ومجرد وهمية، يمكنك استخدام الاستثناء بهذه الطريقة:
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;
في الواقع، لدى PL SQL ما يحل محل CONTINUE.كل ما عليك فعله هو إضافة تسمية (اسم) إلى الحلقة:
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;
لعمليات البحث المستقبلية، في 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.
إنه غير متوفر بحجم 10 جرام، ولكنه ميزة جديدة في 11 جرام
هل يمكنك إعادة صياغة IFs في دالة، والعودة إلى النقطة المناسبة (مبكرًا إذا لزم الأمر).ثم سيتم التقاط تدفق التحكم في الحلقة في المكان الصحيح.
هل هذا منطقي؟
ليست أنيقة تمامًا، ولكنها بسيطة:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
IF done THEN
NULL;
ELSE
<do loop stuff>;
END IF;
END LOOP;
END;
يوجد في Oracle عبارة مشابهة تسمى EXIT والتي إما تخرج من حلقة أو وظيفة/إجراء (إذا لم تكن هناك حلقة للخروج منها).يمكنك إضافة متى للتحقق من بعض الشروط.
يمكنك إعادة كتابة المثال أعلاه على النحو التالي:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
EXIT WHEN done;
END LOOP;
END;
قد لا يكون هذا كافيًا إذا كنت تريد الخروج من بعض الحلقات والمنطق المتداخل، ولكنه أكثر وضوحًا من اثنين من GOTOs وNULLs.