سؤال

أقوم بترحيل إجراء 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top