با فرمت حلقه FOR آشنا هستید:
FOR loop_counter IN [REVERSE] lowest_number..highest_number LOOP {...statements...} END LOOP;
مطابق این syntax، قرار است شمارنده(loop_counter) به صورت ترتیبی(با گام یک) از نقطه lowest_number به نقطه highest_number برسد. برای مثال، با اجرای قطعه کد زیر، اعداد 4 تا 8 نمایش داده می شوند:
SQL> set serveroutput on begin for i in 4 .. 8 loop dbms_output.put_line(i); end loop; end; / 4 5 6 7 8 PL/SQL procedure successfully completed.
اگر قرار باشد در خروجی فوق، اعداد 50 تا 55 هم نمایش داده شوند، چه تغییری باید در کد ایجاد کنیم؟ با توجه به syntax حلقهFOR(قبل از اوراکل 21c)، به ناچار باید از دو حلقه FOR استفاده کنیم:
begin for i in 4 .. 8 loop dbms_output.put_line(i); end loop; for i in 50 .. 55 loop dbms_output.put_line(i); end loop; end; / 4 5 6 7 8 50 51 52 53 54 55 PL/SQL procedure successfully completed.
اوراکل 21c با بهبودی که در کنترل حلقه FOR ایجاد کرده، حل این قبیل مسائل را ساده تر کرده است. برای مثال، کد زیر، عملکرد مشابهی با قطعه کد فوق دارد:
begin for i in 4..8,50..55 loop dbms_output.put_line(i); end loop; end; /
در ادامه با ارائه چند مثال دیگر، بیشتر با بهبودهایی اوراکل 21c در این زمینه آشنا خواهیم شد.
مثال(WHEN clause): در تکه کد زیر، با استفاده از قابلیت جدید اوراکل 21c، مضربهای عدد 4 تا قبل از عدد 30 نمایش داده می شوند:
BEGIN FOR i IN 1 .. 30 WHEN MOD(i,4) = 0 LOOP dbms_output.put_line(i); END LOOP; END; / 4 8 12 16 20 24 28
مثال(WHILE clause): عددی از کاربر گرفته می شود و تا زمانی که مقدار شمارنده از نصف عدد گرفته شده از کاربر، کوچک تر باشد، حلقه ادامه پیدا می کند:
declare n number:=10; BEGIN FOR i IN 1 .. n WHILE i<n/2 LOOP dbms_output.put_line(i); END LOOP; END; / 1 2 3 4
مثال(تعیین گام پرش): نمایش یک در میان اعداد 1 تا 10:
begin for i in 1 .. 10 by 2 loop dbms_output.put_line(i); end loop; end; / 1 3 5 7 9
مثال: مقدار شمارنده می تواند به صورت اعشاری انتخاب شود:
BEGIN FOR i number(10,5) IN 3.5..4.4 by 0.4 LOOP dbms_output.put_line(i); END LOOP; END; / 3.5 3.9 4.3
مثال(REPEAT clause): در اوراکل 21c می توان صرفا نقطه ابتدایی را برای شمارنده تعیین کرد:
BEGIN FOR i IN 5 LOOP dbms_output.put_line(i); END LOOP; END; / 5
این کار شاید کاربرد چندانی نداشته باشد اما با استفاده از REPEAT clause می توان از این قابلیت هم استفاده کاربردی داشت. برای مثال، تکه کد زیر، توانهای عدد 4 را تا عدد 1500 نمایش می دهد:
begin for i in 4, repeat i*4 while i < 1500 loop dbms_output.put_line(i); end loop; end; / 4 16 64 256 1024