控制語句幾乎是所有面向過程語言的核心,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的大小。
阅读(1339) | 评论(0) | 转发(0) |