PL/SQL 03 流程控制

j04212發表於2014-02-12

--IF語法
IF condition THEN
  statements;
[ELSIF condition THEN
  statements;]
[ELSE
  statements;]
END IF;


--CASE 語法

1、在 CASE 語句中使用單一選擇符進行等值比較

CASE selector
  WHEN expression1 THEN sequence_of_statements1;
  WHEN expression2 THEN sequence_of_statements2;
  ...
  WHEN expressionN THEN sequence_of_statementsN;
  [ELSE sequence_of_statementsN+1;]
END CASE;


2、在 CASE 語句中使用多種條件比較

CASE
  WHEN search_condition1 THEN sequence_of_statements1;
  WHEN search_condition2 THEN sequence_of_statements2;
  ...
  WHEN search_conditionN THEN sequence_of_statementsN;
  [ELSE sequence_of_statementsN+1;]
END CASE;


--迴圈


1、基本迴圈 LOOP

LOOP
  statement1;
  ...
  EXIT [WHEN condition];
END LOOP;


2、WHILE 迴圈

WHILE condition LOOP
  statement1;
  statement2;
  ...
END LOOP;


3、FOR 迴圈

FOR counter in [REVERSE]
lower_bound..upper_bound LOOP
  statement1;
  statement2;
  ...
END LOOP;


4、巢狀迴圈和標號

巢狀迴圈是指在一個迴圈語句之中嵌入另一個迴圈語句,而標號(Label)則用於標記巢狀塊或巢狀迴圈。通過在巢狀迴圈中使用標號,可以區分內層迴圈和外層迴圈,並且可以在內層迴圈中直接退出外層迴圈。在編寫 PL/SQL 塊時,可以使用<>定義標號。


declare
  result int;
begin
<>
  for i in 1..100 loop
  <>
  for j in 1..100 loop
  result:=i*j;
  exit outer when result=1000;
  exit when result=500;
  end loop inner;
  dbms_output.put_line(result);
  end loop outer;
  dbms_output.put_line(result);
end;
/


如上所示,當執行 PL/SQL 塊時,如果 result=1000,那麼會直接退出外層迴圈,而當 result=500 時只會退出內層迴圈。


--順序控制語句 GOTO 、NULL

PL/SQL 不僅提供了條件分支語句和迴圈控制語句,而且還提供了順序控制語句 GOTO 和 NULL。但與 IF,CASE 和 LOOP 語句不同,GOTO 語句和 NULL 語句,一般情況下不要用。


1、GOTO

GOTO 語句用於跳轉到特定標號處去執行語句。注意,以為使用 GOTO 語句會增加程式的複雜性,並且使得應用程式可讀性差,所以開發應用程式時,一般都建議使用者不要使用 GOTO 語句。

其語法如下:

GOTO label_name;

其中,label_name 是已經定義的標號名。注意,當使用 GOTO 跳轉到特定標號時,標號後至少要包含一條可執行語句。示例如下:

declare
  i int:=1;
begin
  loop
  insert into temp values(i);
  if i=10 then
    goto end_loop;
  end if;
  i:=i+1;
  end loop;
<>
  dbms_output.put_line('迴圈結束');
end;
/

如上所示,在執行以上 PL/SQL 塊時,如果 i=10,則會跳轉到標號 end_loop,並執行隨後的語句。


2、NULL

NULL語句不會執行任何操作,並且會直接將控制傳遞到下一條語句。使用 NULL 語句的主要好處是可以提高 PL/SQL 程式的可讀性,示例如下:

declare
  v_sal emp.sal%type;
  v_ename emp.ename%type;
begin
  select ename,sal into v_ename,v_sal from emp where empno='&no';
  if v_sal<3000 then
    update emp set comm=sal*0.1 where ename=v_ename;
  else
    null;
  end if;
end;
/

當執行以上 PL/SQL 塊時,會根據輸入的僱員號確定僱員名及其工資;如果僱員工資低於3000,則將其補助設定為工資的10%;如果僱員的工資高於3000,則不會執行任何操作(NULL)。



--示例

declare
  cj xkb.chengji%type;
  state varchar2(4);
begin
  select chengji into cj from xkb
  where stuid=101 and kcid=1001;
  if cj between 90 and 100 then                         --if語句
    state:='優秀';
  elsif cj between 70 and 89 then
    state:='良好';
  elsif cj between 60 and 69 then
    state:='及格';
  else
    state:='差';
  end if;
  dbms_output.put_line('分數是:'||cj);
  dbms_output.put_line('等級是:'||state);
end;

 

select stuname,sex,
       case sex                                         --case 值的比較
         when 'm' then '男'
         when 'f' then '女'
         else '預設值'
       end "性別"
from stu

IKKI@ test10g> declare
  2  v_deptno emp.deptno%type;
  3  begin
  4    v_deptno:='&no';
  5    case v_deptno
  6    when 10 then
  7      update emp set comm=100 where deptno=v_deptno;
  8    when 20 then
  9      update emp set comm=80 where deptno=v_deptno;
 10    when 30 then
 11      update emp set comm=50 where deptno=v_deptno;
 12    else
 13      dbms_output.put_line('not found');
 14    end case;
 15  end;
 16  /
Enter value for no: 10
old   4:   v_deptno:='&no';
new   4:   v_deptno:='10';

PL/SQL procedure successfully completed.


select stuname,sex,                                    --decode 值的比較(不能條件判斷)
       decode(sex,
         'm','男',
         'f','女',
         '預設值') "性別"
from stu


select stuid,kcid,
       case                                             --case 條件判斷
         when chengji between 90 and 100 then '優秀'
         when chengji between 70 and 89 then '良好'
         when chengji between 60 and 69 then '及格'
         else '差'
       end  state
from xkb

IKKI@ test10g> declare
  2  v_sal emp.sal%type;
  3  v_ename emp.ename%type;
  4  begin
  5    select ename,sal into v_ename,v_sal
  6    from emp where empno='&no';
  7    case
  8    when v_sal<1000 then
  9      update emp set comm=100 where ename=v_ename;
 10    when v_sal<2000 then
 11      update emp set comm=80 where ename=v_ename;
 12    when v_sal<6000 then
 13      update emp set comm=50 where ename=v_ename;
 14    end case;
 15  end;
 16  /
Enter value for no: 7788
old   6:   from emp where empno='&no';
new   6:   from emp where empno='7788';

PL/SQL procedure successfully completed.

 

declare
  m int:=0;
  n int:=1;
begin
  loop                                 --loop迴圈
    m:=m+n;
    n:=n+1;
    exit when n=101;
   end loop;
   dbms_output.put_line('m is :'||m);
end;


declare
  m int:=0;
  n int:=1;
begin
  while n<=100                         --while迴圈
  loop
    m:=m+n;
    n:=n+1;
  end loop;
   dbms_output.put_line('m is :'||m);
end;


declare
  m int:=0;
  n int;
begin
  for n in 1..100                      --for迴圈
  loop
    m:=m+n;
  end loop;
   dbms_output.put_line('m is :'||m);
end;

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

相關文章