در نسخه 21c بهبود های خوبی در حوزه کنترل FOR LOOP اتفاق افتاده که در ادامه آنها را مرور خواهیم کرد.

تغییرات FOR LOOP  در Oracle PLsql نسخه 21C

در نسخه های گذشته دستور بسیار ساده و پایه بوده که در ادامه دو نمونه از آن ارائه می گردد.

set serveroutput on

begin

  for i in 1 .. 5 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1

2

3

4

5

PL/SQL procedure successfully completed.

SQL>

 با دستور reverse حلقه به صورت معکوس عمل می کند

begin

  for i in reverse 1 .. 5 loop

    dbms_output.put_line(i);

  end loop;

end;

/

5

4

3

2

1

PL/SQL procedure successfully completed.

SQL>

نسخه 21C

چند حلفه تکرار:

در این نسخه می توان چند حلقه تکرار را در یک دستور اجرا کرد.

begin

  for i in 1 .. 3, reverse 7 .. 9, 20 .. 22 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1

2

3

9

8

7

20

21

22

PL/SQL procedure successfully completed.

SQL

گام های پرش در حلقه :

در نسخه های قبلی گام های پرش به صورت پیش فرض 1 بود که در نسخه 21C می توان این گام ها را تعریف کرد ( نزولی و صعودی ).

begin

  for i in 1 .. 5 by 2, reverse 1 .. 5 by 2 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1

3

5

5

3

1

PL/SQL procedure successfully completed.

SQL>

گام های تکرار اعشاری :

به صورت پیش فرض  اگر برای گام ها عدد اعشار در نظر گرفته شود آنها round خواهند شد.

begin

  for i in 1.2 .. 2.2 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1

2

PL/SQL procedure successfully completed.

SQL>

در نسخه 21C این امکان وجود دارد که اعداد اعشار در حلقه ها تعریف کرد اما گام ها به صورت پیش فرض 1 هستند.

begin

  for i number(5,1) in 1.2 .. 2.2 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1.2

2.2

PL/SQL procedure successfully completed.

SQL>

می توان گام ها را نیز بر مبنای اعشار تعریف کرد .

begin

  for i number(5,1) in 1.2 .. 2.2 by 0.2 loop

    dbms_output.put_line(i);

  end loop;

end;

/

1.2

1.4

1.6

1.8

2

2.2

PL/SQL procedure successfully completed.

SQL>

حلقه با یک تکرار:

در نسخه جدید می توان حلقه با یک تکرار تعریف کرد.

begin

  for i in 2 loop

    dbms_output.put_line(i);

  end loop;

end;

/

2

PL/SQL procedure successfully completed.

SQL>

جذابیت قابلیت بالا با اضافه کردن کلمه repeat تکمیل می شود . به مثال زیر توجه کنید :

begin

  for i in 1, repeat i*5 while i < 1000 loop

    dbms_output.put_line(i);

end loop;

end;

/

1 5 25 125 625

PL/SQL procedure successfully completed.

  SQL>

حلقه بر روی Collection

کلمات کلیدی Values of, Indices of و Pairs of در حلقه ها برای Collection ها، قابلیت های خوبی رو ایجاد می کنند. برای آشنایی با collection ها در اوراکل اینجا کلیک کنید

Values of برای نمایش مقادیر collection

declare

  type tab_t is table of pls_integer index by pls_integer;

  l_tab tab_t;

begin

  l_tab(1)   := 20;

  l_tab(10)  := 30;

  l_tab(100) := 40;

  for i in values of l_tab loop

    dbms_output.put_line(i);

  end loop;

end;

/

20

30

40

PL/SQL procedure successfully completed.

SQL>

declare

  type tab_t is table of pls_integer index by pls_integer;

  l_tab tab_t := tab_t(1 => 20, 10 => 30, 100 => 40);

begin

  for i in values of l_tab loop

    dbms_output.put_line(i);

  end loop;

end;

/

20

30

40

PL/SQL procedure successfully completed.

SQL>

درنسخه های قبلی برای انجام کاری مانند دستورات فوق باید کدی مانند زیر می نوشتیم

declare

  type tab_t is table of pls_integer index by pls_integer;

  l_tab tab_t := tab_t(1 => 20, 10 => 30, 100 => 40);

  l_idx pls_integer;

begin

  l_idx := l_tab.first;

  while l_idx is not null loop

    dbms_output.put_line(l_tab(l_idx));

    l_idx := l_tab.next(l_idx);

  end loop;

end;

/

20

30

40

PL/SQL procedure successfully completed.

SQL>

Indices of برای نمایش شاخص ها

declare

  type tab_t is table of pls_integer index by pls_integer;

  l_tab tab_t := tab_t(1 => 20, 10 => 30, 100 => 40);

begin

  for i in indices of l_tab loop

    dbms_output.put_line(i);

  end loop;

end;

/

1

10

100

PL/SQL procedure successfully completed.

SQL>

به مثال زیر نیز دقت کنید

declare

 type tab_t is table of varchar2(32767) index by pls_integer;

  l_main_tab  tab_t := tab_t(1 => ‘ONE’, 2 => ‘TWO’, 3 => ‘THREE’, 4 => ‘FOUR’, 5 => ‘FIVE’);

  l_idx_tab   tab_t := tab_t(1 => null, 3 => null, 5 => null);

begin

  for i in indices of l_idx_tab loop

    dbms_output.put_line(l_main_tab(i));

  end loop;

end;

/

ONE

THREE

FIVE

PL/SQL procedure successfully completed.

SQL>

دستور Pairs of :

با این دستور می توان هم مقدار و هم شاخص را داشت. به مثال زیر دقت کنید.

declare

  type tab_t is table of varchar2(32767) index by pls_integer;

  l_tab  tab_t := tab_t(1 => ‘ONE’, 2 => ‘TWO’, 3 => ‘THREE’, 4 => ‘FOUR’, 5 => ‘FIVE’);

begin

  for i,v in pairs of l_tab loop

    dbms_output.put_line(‘index=’ || i || ‘  value=’ || v);

  end loop;

end;

/

index=1  value=ONE

index=2  value=TWO

index=3  value=THREE

index=4  value=FOUR

index=5  value=FIVE

PL/SQL procedure successfully completed.

SQL>

پرش  و توقف در حلقه ها :

با دستور WHEN می توان پرش را در حلقه در کنترل داشت.

begin

  for i in 1 .. 10 when mod(i,3)=0 loop

    dbms_output.put_line(i);

  end loop;

end;

/

3

6

9

PL/SQL procedure successfully completed.

SQL>

برای در اختیار داشتن کنترل توقف در حلقه می توان از دستور WHILE استفاده کرد.

begin

  for i in 1 .. 10 while i <= 5 loop

      dbms_output.put_line(i);

end loop; end;

/

1 2 3 4 5

PL/SQL procedure successfully completed

. SQL>