در نسخه 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>