plsql_迴圈結構_do while_do unitl_while loop_end loop測試(一)

wisdomone1發表於2010-08-17

do until迴圈
 會一直迴圈,直到滿足exit條件就會退出迴圈

要中止迴圈,可以採用exit when語句或者exit if條件語句
當然,除0等異常可以中止迴圈

下為以上兩種語句的語法結構


用if語句退出迴圈
loop
 語句
 if(表示式) then exit;
 end if;
end loop;

  ---請看真正的示例
SQL> set serveroutput on
SQL> r
  1  declare
  2    counter integer:=10;
  3  begin
  4    loop
  5       dbms_output.put_line(counter);
  6       counter:=counter-1;
  7       if(counter=0) then exit;
  8       end if;
  9    end loop;
 10* end;
10
9
8
7
6
5
4
3
2
1

PL/SQL procedure successfully completed.

 

 


用exit when語句退出迴圈
loop
  語句
  exit when
end loop;


---請看如下示例


SQL> declare
  2    counter integer:=10;
  3  begin
  4    loop
  5       dbms_output.put_line(counter);
  6       counter:=counter-1;
  7       exit when counter=0;
  8    end loop;
  9  end;
 10  /
10
9
8
7
6
5
4
3
2
1

PL/SQL procedure successfully completed.

SQL>

 

 

 

---採用exception退出do unitl 迴圈
SQL> declare
  2     counter positive:=10; ---注意這裡用的是positive而非integer
  3  begin
  4     loop
  5          begin
  6               dbms_output.put_line(counter);
  7               counter:=counter-1;
  8          exception when value_error then exit; --注意:語法為  exception  when 異常名字 then 處理異常的動作;
  9          end;
 10     end loop;
 11  end;
 12  /
10
9
8
7
6
5
4
3
2
1

PL/SQL procedure successfully completed.

 

 

 


----while迴圈----
在執行迴圈之前先判斷條件,可能判斷條件後一次也進行迴圈

迴圈結構的語法

while(條件 is true) loop  --注:這個條件不能為null,否則就成死迴圈了
  語句
end loop;


示例如下:

SQL> r
  1  declare
  2  ascii_char integer:=97;          ---列印小寫字母序列
  3  alphabet varchar2(26);
  4  begin
  5  while(nvl(length(alphabet),0)<26)
  6  loop
  7    alphabet:=alphabet||chr(ascii_char);
  8    ascii_char:=ascii_char+1;
  9  end loop;
 10  dbms_output.put_line(alphabet);  --注意:此處把dbms_output放在loop迴圈外面,就是僅列印alphabet最後的變數值
 11* end;
abcdefghijklmnopqrstuvwxyz

PL/SQL procedure successfully completed.

 

 

 

 

 

 

 

 

 


---說明如何值為null的varchar型別與有值的varchar拼接,最終值為有值的varchar,而非null
SQL> declare
  2  x varchar2(100);
  3  y varchar2(10):='sex';
  4  begin
  5  x:=x||y;
  6  dbms_output.put_line(x);
  7  end;
  8  /
sex

PL/SQL procedure successfully completed.

SQL>

 

 


---for 迴圈---
語法

for c in [reverse] a..b loop
  語句
end loop;

注:for loop未必會一定迴圈,如當:a>b時,就不會迴圈
    a=b,僅會迴圈一次
    a


--示例如下:
SQL> declare        ---未執行迴圈
  2  str varchar2(10);
  3  x integer:=11;
  4  y integer:=10;
  5  begin
  6  for i in x..y loop
  7    str:=str||'abc';
  8  end loop;
  9  dbms_output.put_line(nvl(str,'never execute for loop.'));
 10  end;
 11  /
never execute for loop.

PL/SQL procedure successfully completed.

 

SQL> r                ---這個就僅執行1次迴圈
  1  declare
  2  str varchar2(10);
  3  x integer:=10;
  4  y integer:=10;
  5  begin
  6  for i in x..y loop
  7    str:=str||'abc';
  8  end loop;
  9  dbms_output.put_line(nvl(str,'never execute for loop.'));
 10* end;
abc

PL/SQL procedure successfully completed.

 

 

 

---do while do結構---
程式碼先執行一些任務,然後對條件進行判斷。如果條件滿足,則執行第2個任務

具體語法結構如下:

loop
  語句
  if(表示式) then exit;
  end if;
  語句
end loop;


loop
   語句
   exit when
   語句
end loop;


具體示例如下:

SQL> declare
  2    cursor c1 is select dname from test;
  3    cursor_record c1%rowtype;
  4  begin
  5    open c1;
  6    loop
  7      fetch c1 into cursor_record;
  8      exit when c1%notfound;
  9      dbms_output.put_line(cursor_record.dname);
 10    end loop;
 11  end;
 12  /
ACCOUNTING
RESEARCH
SALES
OPERATIONS
it2
it

PL/SQL procedure successfully completed.

 

 

SQL> r
  1  declare
  2    cursor c1 is select dname from test;
  3    cursor_record c1%rowtype;
  4  begin
  5    open c1;
  6    loop
  7      fetch c1 into cursor_record;
  8      if(c1%notfound) then exit;
  9      end if;
 10      dbms_output.put_line(cursor_record.dname);
 11    end loop;
 12* end;
ACCOUNTING
RESEARCH
SALES
OPERATIONS
it2
it

PL/SQL procedure successfully completed.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-671199/,如需轉載,請註明出處,否則將追究法律責任。

相關文章