Chinaunix首页 | 论坛 | 博客
  • 博客访问: 560100
  • 博文数量: 155
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1625
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-18 16:55
文章分类

全部博文(155)

文章存档

2009年(20)

2008年(39)

2007年(66)

2006年(29)

2005年(1)

我的朋友

分类: Oracle

2006-05-25 08:23:16

   控制語句幾乎是所有面向過程語言的核心,PL/SQL也是一程過程化語言,學好PL/SQL,掌握PL/SQL中幾種控制語句的語法是必不可好的。
 
PL/SQL和其它過程化語言一樣,主要有三種結構控制語句,他們分別為:
 
1,順序結構;
2,選擇結構;
3,循環結構;
 
   順序結構比較簡單了,我們在寫PL/SQL時多注意一下實際需要就行了。我們先來看看選擇結構。
 

選擇結構語法:
主要有 IF判斷CASE判斷;
 
1,IF判斷
第一種
   if conditional then    --條件為真執行statment
 statement                --條件為NULL或否時執行 end if 以後的語句
   end if;
 
第二種
   if conditional then    --條件為真執行statement1
statement1                --條件為NULL或否時執行statement2
   else
statement2
   end if;
第三種
   if conditional1 then    --先判斷條件1
statement1                  --若為真執行statement1  
   elsif conditional2 then --再判斷條件2
statement2                 --若為真執行statement2
  ......                   
  ......
  else                     --若以上條件都為NULL或否
statementn                 --執行statementn
  end if;
 
2,CASE判斷
  case conditonal                --需要檢測的表達式
when decision1 then statement1   /*若上面的表達式值等於decision1執行statement1*/
when decision2 then statement2   /*若上面的表達式值等於decision2執行statement2*/
......
......
when decisionN then statementN   /*若上面的表達式值等於decisionN執行statementN*/
else  statementN+1               --若沒有匹配的decision執行statementN+1
end;
  注意:CASE語句中conditional和decision的數據類型必須一致,或相互兼容。
 
選擇結構中NULL值的判斷:
  在選擇結構中需要注要一點的就是NULL值的判斷,因為有時我們沒有注意NULL值的判斷會導致出現相反的結果。我們看以下兩個procedure,他們都可以判斷v_num1是否大於v_num2。

PROCEDURE CHK_NUM_1 (
              p_num1 in number,
              p_num2 in number,
              p_result  out varchar2
)
IS
     v_num1   number(2);
     v_num2   number(2);
     v_result varchar2(10);
BEGIN
  v_num1:=p_num1;
  v_num2:=p_num2;
 
  if v_num1>v_num2 then
    v_result:='YES';
  else
    v_result:='NO';
  end if;
p_result:=v_result;
dbms_output.put_line('the result is'||p_result );
END;

PROCEDURE CHK_NUM_2 (
              p_num1 in number,
              p_num2 in number,
              p_result  out varchar2
)
IS
     v_num1   number(2);
     v_num2   number(2);
     v_result varchar2(10);
BEGIN
  v_num1:=p_num1;
  v_num2:=p_num2;
 
  if v_num1    v_result:='NO';
  else
    v_result:='YES';
  end if;
p_result:=v_result;
dbms_output.put_line('the result is'||p_result );
END;
 
在邏輯上,chk_num_1和chk_num2一樣,只不過是換個表示方法。
例如:現在我們令
p_num1 = 5;
p_num2 = 3;
無論你用chk_num_1,還是chk_num_2得出的結果都是"YES".
 
但如果令:
p_num1 為空;(即為null)
P_num2 = 5;
則會出現兩種不同的結果,chk_num_1為"NO",而chk_num_2為"YES".
導致這種情況出現的原因是無論NULL和一個數的比較結果仍為NULL(NULL>5 = NULL)
因些會執行else以後的語句,而上面兩個procedure判斷順序又不一樣,所以出現了以上的兩種結果。
 
解決方法:
 在判斷之前先判斷一下是否有NULL值,將上面判斷部分加上一段:
if p_num1=null or p_num2 null then
  v_result:="parameter is NULL!";
if v_num1>num2 then 
    v_result:='YES';
  else
    v_result:='NO';
 
加上上面的判斷無論是chk_num_1或是chk_num_2都可以正確判斷p_num1和p_num2的大小。
 
 
 
 
阅读(1303) | 评论(0) | 转发(0) |
0

上一篇:通向成功的距離

下一篇:拿到Offer

给主人留下些什么吧!~~