1. 程式人生 > >Oracle pl/sql的進階--控制結構(分支,迴圈,控制)

Oracle pl/sql的進階--控制結構(分支,迴圈,控制)

<strong>:pl/sql的進階--控制結構(分支,迴圈,控制)
pl/sql的進階--控制結構 
 介紹 
  在任何計算機語言(c,java,pascal)都有各種控制語句(條件語句,迴圈結構,順序控制結構...)在pl/sql中也存在這樣的控制結構。 
在本部分學習完成後,希望大家達到: 
1.使用各種if語句 
2.使用迴圈語句 
3.使用控制語句——goto和null; 

 條件分支語句 
pl/sql中提供了三種條件分支語句if—then,if – then – else,if – then – elsif – then 
這裡我們可以和java語句進行一個比較 

 簡單的條件判斷 if – then 
問題:編寫一個過程,可以輸入一個僱員名,如果該僱員的工資低於2000,就給該員工工資增加10%。 
Sql程式碼 
1.create or replace procedure sp_pro6(spName varchar2) is  
2.--定義   
3.v_sal emp.sal%type;   
4.begin  
5.    --執行   
6.    select sal into v_sal from emp where ename=spName;   
7.    --判斷   
8.    if v_sal<2000 then  
9.        update emp set sal=sal+sal*10% where ename=spName;   
10.    end if;   
11.end;   
12./  














 二重條件分支 if – then – else 
問題:編寫一個過程,可以輸入一個僱員名,如果該僱員的補助不是0就在原來的基礎上增加100;如果補助為0就把補助設為200; 
Sql程式碼 
1.create or replace procedure sp_pro6(spName varchar2) is  
2.--定義   
3.v_comm emp.comm%type;   
4.begin  
5.    --執行   
6.    select comm into v_comm from emp where ename=spName;   
7.    --判斷   
8.    if v_comm<>0 then  
9.        update emp set comm=comm+100 where ename=spName;   
10.    else  
11.        update emp set comm=comm+200 where ename=spName;   
12.    end if;   
13.end;   
14./  















 多重條件分支 if – then – elsif – then 
問題:編寫一個過程,可以輸入一個僱員編號,如果該僱員的職位是PRESIDENT就給他的工資增加1000,如果該僱員的職位是MANAGER就給他的工資增加500,其它職位的僱員工資增加200。 
Sql程式碼 
1.create or replace procedure sp_pro6(spNo number) is  
2.    --定義   
3.    v_job emp.job%type;   
4.begin  
5.    --執行   
6.    select job into v_job from emp where empno=spNo;   
7.    if v_job='PRESIDENT' then  
8.        update emp set sal=sal+1000 where empno=spNo;   
9.    elsif v_job='MANAGER' then  
10.        update emp set sal=sal+500 where empno=spNo;   
11.    else  
12.        update emp set sal=sal+200 where empno=spNo;   
13.    end if;   
14.end;   
15./  

















 迴圈語句 –loop 
  是pl/sql中最簡單的迴圈語句,這種迴圈語句以loop開頭,以end loop結尾,這種迴圈至少會被執行一次。 
案例:現有一張表users,表結構如下: 
使用者id | 使用者名稱 
       | 
請編寫一個過程,可以輸入使用者名稱,並迴圈新增10個使用者到users表中,使用者編號從1開始增加。 
Sql程式碼 
1.create or replace procedure sp_pro6(spName varchar2) is  
2.--定義  :=表示賦值   
3.    v_num number:=1;       
4.begin  
5.    loop   
6.        insert into users values(v_num,spName);   
7.        --判斷是否要退出迴圈   
8.        exit when v_num=10;   
9.        --自增   
10.        v_num:=v_num+1;   
11.    end loop;   
12.end;   
13./  















 迴圈語句 –while迴圈 
  基本迴圈至少要執行迴圈體一次,而對於while迴圈來說,只有條件為true時,才會執行迴圈體語句,while迴圈以while...loop開始,以end loop結束。 
案例:現有一張表users,表結構如下: 
使用者id 使用者名稱 

問題:請編寫一個過程,可以輸入使用者名稱,並迴圈新增10個使用者到users表中,使用者編號從11開始增加。 
Sql程式碼 
1.create or replace procedure sp_pro6(spName varchar2) is  
2.--定義  :=表示賦值   
3.    v_num number:=11;       
4.begin  
5.    while v_num<=20 loop   
6.    --執行   
7.       insert into users values(v_num,spName);   
8.       v_num:=v_num+1;   
9.    end loop;   
10.end;   
11./  













 迴圈語句 –for迴圈 
基本for迴圈的基本結構如下 
Sql程式碼 
1.begin  
2.  for i in reverse 1..10 loop   
3.    insert into users values (i, 'shunping');   
4.  end loop;   
5.end;  





我們可以看到控制變數i,在隱含中就在不停地增加。 

 順序控制語句 –goto,null 
1.goto語句 
  goto語句用於跳轉到特定符號去執行語句。注意由於使用goto語句會增加程式的複雜性,並使得應用程式可讀性變差,所以在做一般應用開發時,建議大家不要使用goto語句。 
基本語法如下 goto lable,其中lable是已經定義好的標號名, 
Sql程式碼 
1.declare  
2.  i int := 1;   
3.begin  
4.  loop   
5.    dbms_output.put_line('輸出i=' || i);   
6.    if i = 1{} then  
7.      goto end_loop;   
8.    end if;   
9.    i := i + 1;   
10.  end loop;   
11.  <<end_loop>>   
12.  dbms_output.put_line('迴圈結束');   
13.end;  















2.null 
null語句不會執行任何操作,並且會直接將控制傳遞到下一條語句。使用null語句的主要好處是可以提高pl/sql的可讀性。 
Sql程式碼 
1.declare  
2.  v_sal   emp.sal%type;   
3.  v_ename emp.ename%type;   
4.begin  
5.  select ename, sal into v_ename, v_sal from emp where empno = &no;   
6.  if v_sal < 3000 then  
7.    update emp set comm = sal * 0.1 where ename = v_ename;   
8.  else  
9.    null;   
10.  end if;   
11.end;  
</strong>