目錄
一、IF語句
1.1IF-THEN 組合
1.2IF-THEN-ELSE 組合
1.3?IF-THEN-ELSIF 組合
1.4區(qū)別/注意
1.4.1IF-THEN-ELSIF 和 IF-THEN-ELSE 的區(qū)別
1.4.2注意
1.5嵌套 IF 語句
二、 CASE語句
2.1簡單的CASE語句
2.2搜索型CASE語句
2.3嵌套的CASE語句
2.4區(qū)別
在 Oracle 數(shù)據(jù)庫中,可以使用多種條件和順序控制語句來實現(xiàn)程序流程的控制。下面將介紹PL/SQL的兩類控制語句:條件控制語句和順序控制語句。其中,條件控制語句賦予了代碼能夠根據(jù)條件改變執(zhí)行流程的能力。IF-THEN-ELSE和CASE語句就可以實現(xiàn)條件控制。除了CASE語句外,還有CASE表達式,二者并不完全相同,CASE表達式在某些場合下可以取代IF和CASE語句。
一、IF語句
IF 語句用于控制程序流程,根據(jù)一個條件表達式的值來選擇執(zhí)行不同的代碼塊。它的基本語法格式如下:
if 條件1 then 要執(zhí)行的語句;
...
[elsif 條件2 then 要執(zhí)行的語句;]
...
[else 要執(zhí)行的語句;]
end if;
那么根據(jù)上面的語法,可以將IF語句分為3種使用方法,如下表詳情所示:
IF ..THEN.. END IF; |
這是IF語句最簡單的用法。IF和THEN之間的條件決定了在THEN和END IF之間的一系列語句是否會被執(zhí)行。 如果條件部分的求值結(jié)果是FALSE或者NULL,這些代碼 就不會執(zhí)行。 |
IF ..THEN.. ELSE .. END IF; |
這種組合形式的IF語句實現(xiàn)了二選一的邏輯。根據(jù)對位于IF和THEN兩個關(guān)鍵字之間的條件的求值結(jié)果,或者是THEN和ELSE之間的代碼被執(zhí)行,或者是ELSE和END IF之間的 代碼被執(zhí)行??傊?,這兩部分代碼肯定有一個會被執(zhí)行。 |
IF ..THEN.. ELSIF.. ELSE .. END IF; |
這是IF語句最后一個也是最復(fù)雜的使用形式。IF語句會 從一系列互斥條件中選擇一個是TRUE的,然后執(zhí)行該條 件關(guān)聯(lián)的語句。如果是在Oracle9 i Database Release 1之后 的版本中使用這樣的IF語句,應(yīng)該考慮使用CASE語句。 |
注意:
IF 語句只能用于 PL/SQL 語言中,而不能直接用于 SQL 中。
1.1IF-THEN 組合
IF-THEN 組合是一種常見的條件控制結(jié)構(gòu),可以基于某個條件表達式的值來選擇執(zhí)行不同的代碼塊。IF-THEN 語句的基本語法格式如下:
IF condition
THEN
statement or block of statements;
END IF;
condition
是要判斷的條件表達式,如果滿足該條件,就會執(zhí)行 THEN
代碼塊中的語句。
注意:
在
THEN
后面必須以END IF
結(jié)尾,表示 IF-THEN 語句的結(jié)束。
這里舉一個簡單的例子來說明 IF-THEN 的用法。假設(shè)需要根據(jù)某一條件是否成立來輸出不同的結(jié)果,那么可以使用 IF-THEN 語句來實現(xiàn)。例如,以下代碼展示了如何判斷一個數(shù)是否為偶數(shù),并輸出不同的結(jié)果:
DECLARE
v_num NUMBER := 5;
BEGIN
IF MOD(v_num, 2) = 0 THEN
DBMS_OUTPUT.PUT_LINE('The number is even');
END IF;
END;
在上述代碼中,首先聲明了一個變量 v_num
并將其賦值為 5。然后,通過 IF-THEN 語句來檢查該變量是否為偶數(shù),如果成立,則輸出 The number is even
。
再比如一個示例,代碼如下所示:
DECLARE
x INTEGER := 7;
BEGIN
IF x < 10 THEN
DBMS_OUTPUT.PUT_LINE(x || ' is less than 10.');
END IF;
END;
以上代碼中,定義了一個整型變量 x
,然后使用 IF-THEN 語句判斷 x
是否小于 10,如果成立則輸出 "7 is less than 10."。?
1.2IF-THEN-ELSE 組合
IF-THEN-ELSE 組合也是一種常見的條件控制結(jié)構(gòu),在 IF-THEN 的基礎(chǔ)上增加了 ELSE 分支,可以在條件不成立時執(zhí)行另外一段代碼塊。IF-THEN-ELSE 語句的基本語法格式如下:
IF condition THEN
statement or block of statements;
ELSE
statement or block of statements;
END IF;
如果 condition
條件表達式為真,則執(zhí)行 THEN
代碼塊中的語句;否則將執(zhí)行 ELSE 代碼塊中的語句。在這種情況下,ELSE 關(guān)鍵字后的句號(.)和 END IF 之間不需要有其他內(nèi)容。
那么再舉一個利用 IF-THEN-ELSE 語句來判斷一個數(shù)是否為偶數(shù)的例子。與上一個IF-THEN 組合例子不同的是,在這里需要處理兩種不同情況,分別輸出兩種不同的結(jié)果。代碼示例如下:
DECLARE
v_num NUMBER := 6;
BEGIN
IF MOD(v_num, 2) = 0 THEN
DBMS_OUTPUT.PUT_LINE('The number is even');
ELSE
DBMS_OUTPUT.PUT_LINE('The number is odd');
END IF;
END;
在上述代碼中,首先聲明了一個變量 v_num
并將其賦值為 6。然后,通過 IF-THEN-ELSE 語句來檢查該變量是否為偶數(shù),如果成立,則輸出 The number is even
;否則輸出 The number is odd
。
再比如這個示例,代碼如下所示:
DECLARE
score INTEGER := 87;
grade CHAR(1);
BEGIN
IF score >= 90 THEN
grade := 'A';
ELSE
grade := 'B';
END IF;
DBMS_OUTPUT.PUT_LINE('The grade is ' || grade || ', and the score is ' || score || '.');
END;
以上代碼中,定義了一個整型變量 score
和一個字符類型變量 grade
,使用 IF-THEN-ELSE 語句根據(jù) score
的分值來確定考試等級,并將結(jié)果保存到 grade
變量中。最后通過 DBMS_OUTPUT 輸出結(jié)果:“The grade is B, and the score is 87.”?
1.3?IF-THEN-ELSIF 組合
IF-THEN-ELSIF 組合是在 IF-THEN 的基礎(chǔ)上增加了一個或多個 ELSIF 分支,能夠處理多個條件分支情況,并在每個分支中執(zhí)行不同的代碼塊。IF-THEN-ELSIF 語句的基本語法格式如下:
IF condition1 THEN
statement1;
ELSIF condition2 THEN
statement2;
...
ELSIF conditionN THEN
statementN;
ELSE
statement or block of statements;
END IF;
其中 condition1
、condition2
、...、conditionN
分別是要進行判斷的多個條件表達式,如果第一個條件表達式不成立,則繼續(xù)判斷下一個條件表達式,直到所有條件都被檢查過了為止。如果所有條件都不成立,則將執(zhí)行 ELSE 分支中的代碼塊。
下面利用 IF-THEN-ELSIF 語句來實現(xiàn)多重分支控制的例子。
示例1.假設(shè)我們需要根據(jù)考試成績來判斷學(xué)生所處的等級,并輸出相應(yīng)的結(jié)果。代碼示例如下:
DECLARE
v_score NUMBER := 75;
BEGIN
IF v_score >= 90 THEN
DBMS_OUTPUT.PUT_LINE('Grade A');
ELSIF v_score >= 80 THEN
DBMS_OUTPUT.PUT_LINE('Grade B');
ELSIF v_score >= 70 THEN
DBMS_OUTPUT.PUT_LINE('Grade C');
ELSIF v_score >= 60 THEN
DBMS_OUTPUT.PUT_LINE('Grade D');
ELSE
DBMS_OUTPUT.PUT_LINE('Grade E');
END IF;
END;
以上代碼使用 IF-THEN-ELSIF 語句實現(xiàn)了根據(jù)考試成績來判斷學(xué)生所處的等級,并輸出相應(yīng)的結(jié)果。根據(jù)分數(shù)的不同,執(zhí)行相應(yīng)的分支并輸出對應(yīng)的成績等級。
- 如果
v_score
大于等于 90,則執(zhí)行 IF 分支,輸出 "Grade A"; - 如果
v_score
在 80 到 89 之間,則執(zhí)行第一個 ELSIF 分支,輸出 "Grade B"; 依次類推,判斷學(xué)生的成績等級。 - 如果
v_score
小于 60,則執(zhí)行 ELSE 分支,輸出 "Grade E"。 - 最后輸出結(jié)果為 "Grade C",因為
v_score
等于 75,符合條件 v_score >= 70 且 v_score < 80,所以執(zhí)行第二個 ELSIF 分支并輸出 "Grade C"。
示例2.代碼如下所示:
DECLARE
num INTEGER := 5;
BEGIN
IF num = 0 THEN
DBMS_OUTPUT.PUT_LINE(num || ' is zero.');
ELSIF num > 0 THEN
DBMS_OUTPUT.PUT_LINE(num || ' is a positive number.');
ELSE
DBMS_OUTPUT.PUT_LINE(num || ' is a negative number.');
END IF;
END;
以上代碼中,定義了一個整型變量 num
,使用 IF-THEN-ELSIF 語句判斷 num
是否是 0、正數(shù)或負數(shù),并輸出相應(yīng)的結(jié)果。如果 num
不屬于上述任何一種情況,則執(zhí)行 ELSE 分支的語句。最終輸出 "5 is a positive number."
示例3.依舊判斷正負數(shù),要求是鍵盤輸入一個數(shù),如果大于0,打印正數(shù),小于0,打印負數(shù),等于零,打印零。代碼如下所示:
begin
if &a>0 then
dbms_output.put_line('&a 是正數(shù)');
elsif &a<0 then
dbms_output.put_line('&a 是負數(shù)');
else
dbms_output.put_line('&a 是零');
end if;
end;
注釋:
在Oracle數(shù)據(jù)庫中,&符號用于參數(shù)替換功能,可以用于幾乎所有版本的Oracle數(shù)據(jù)庫,包括Oracle 8i、9i、10g、11g、12c等版本。在不同的版本中,&符號的使用方式可能會有所不同。
它可以用來在SQL語句中引用用戶輸入的參數(shù)值。當(dāng)你在SQL語句中使用&符號時,Oracle會提示你輸入一個值,然后將該值替換掉&符號。
例如,你可以使用如下的SQL語句來查詢指定員工的工資:
SELECT salary FROM employees WHERE employee_id = &emp_id;
當(dāng)執(zhí)行這個SQL語句時,Oracle會提示你輸入一個員工ID的值,然后將該值替換掉&emp_id。這樣就能查詢指定員工的工資了。
但是在使用&符號時,如果用戶輸入的值中包含了單引號、雙引號等特殊字符,可能會導(dǎo)致SQL語句執(zhí)行失敗。為了避免這種情況,可以使用兩個&符號(&&)來進行參數(shù)替換,這樣Oracle會自動對特殊字符進行轉(zhuǎn)義處理。例如:
SELECT * FROM employees WHERE department_name = '&&dept_name';
其實這個符號在分頁查詢的這篇文章中第一小節(jié)也有使用到了該符號,詳情請看http://t.csdn.cn/S0G1P
示例4.從鍵盤輸入一個員工編號,如果他的工資大于2999,打印'該員工是高薪人士';
大于1999,打印'該員工是中薪人士';大于999,打印'該員工是低薪人士';否則,打印'我不認識該員工'?;代碼如下所示:
declare
v_sal number;
begin
select sal into v_sal from emp where empno=&a;
if v_sal>2999 then
dbms_output.put_line(&a||'該員工是高薪人士');
elsif v_sal>1999 then
dbms_output.put_line(&a||'該員工是中薪人士');
elsif v_sal>999 then
dbms_output.put_line(&a||'該員工是低薪人士');
else dbms_output.put_line(&a||'你不配');
end if;
end;
1.4區(qū)別/注意
1.4.1IF-THEN-ELSIF 和 IF-THEN-ELSE 的區(qū)別
- IF-THEN-ELSE 語句只有一個 ELSE 分支,如果條件不符合,則會執(zhí)行 ELSE 分支中的代碼;
- IF-THEN-ELSIF 語句可以有多個 ELSIF 分支,可以對多個條件進行判斷;
- IF-THEN-ELSIF 主要用于多重條件判斷,而 IF-THEN-ELSE 則用于單一條件情況下的處理;
- IF-THEN-ELSIF 允許在條件不滿足時再次對代碼進行評估或檢查,從而實現(xiàn)更加靈活和復(fù)雜的條件控制操作。
1.4.2注意
- 一個IF總要有一個匹配的END IF;
- 在 IF 語句中進行 NULL 值比較,應(yīng)該使用 IS NULL 或 IS NOT NULL 運算符;
- 在關(guān)鍵字END 和IF之間一定要有空格;
- 關(guān)鍵字ELSIF不要加[E]。
1.5嵌套 IF 語句
IF 語句可以嵌套使用,以實現(xiàn)更復(fù)雜的條件邏輯。嵌套 IF 語句根據(jù)條件執(zhí)行不同的代碼塊,每個代碼塊可能包含其他的嵌套 IF 語句。
IF 語句的一般格式如下:
IF condition THEN
statement1;
--...
ELSE
statement2;
--...
END IF;
其中,condition
是一個邏輯表達式,如果為真,則執(zhí)行 statement1
,否則執(zhí)行 statement2
。在嵌套 IF 語句中,statement1
和 statement2
可以是嵌套的 IF 語句。
以下是一個簡單的嵌套 IF 語句的示例:
DECLARE
i number := 70;
BEGIN
IF (i >= 0 AND i <= 50) THEN
DBMS_OUTPUT.PUT_LINE('分數(shù)不及格');
ELSE
IF (i > 50 AND i <= 70) THEN
DBMS_OUTPUT.PUT_LINE('分數(shù)及格');
ELSE
IF (i > 70 AND i <= 90) THEN
DBMS_OUTPUT.PUT_LINE('分數(shù)良好');
ELSE
DBMS_OUTPUT.PUT_LINE('分數(shù)優(yōu)秀');
END IF;
END IF;
END IF;
END;
此示例使用了三個嵌套 IF 語句來根據(jù)給定的分數(shù)打印出相應(yīng)的評價,它們依次判斷分數(shù)是否不及格、及格、良好或優(yōu)秀,并輸出相應(yīng)的信息。該示例中所有的 IF 語句都是緊密嵌套在一起的,它們可以使用 ELSEIF
關(guān)鍵字改寫成更清晰的形式。
注意:
嵌套 IF 語句可以很方便地構(gòu)造復(fù)雜的條件邏輯,但深度太深或太復(fù)雜的嵌套可能會影響代碼的可讀性和維護性。因此,在編寫嵌套 IF 語句時,應(yīng)該盡量使用合適的結(jié)構(gòu)、注釋和命名來使代碼更加易懂。
二、 CASE語句
CASE 語句是一種強大的條件表達式,可以在一個 SQL 語句中根據(jù)一個或多個條件執(zhí)行不同的操作。
2.1簡單的CASE語句
它的一般格式如下:
CASE expression
WHEN value1 THEN statement1;
WHEN value2 THEN statement2;
...
ELSE statementN;
END CASE;
其中,expression
是需要比較的表達式,value1, value2, ...
是表達式可能取到的值,如果 expression
的值等于某個 value
,則執(zhí)行相應(yīng)的 statement
;否則執(zhí)行 ELSE
后面的語句。
注意:
CASE 語句中的條件順序很重要,因為 Oracle 將按順序執(zhí)行每個
WHEN
子句,并在找到第一個匹配值后立即停止。在沒有
ELSE
的情況下,如果在所有的WHEN
分支中都沒有找到匹配的值,則該 CASE 表達式將返回空值 NULL。
一個簡單的 CASE 語句示例:
DECLARE
grade CHAR(1) := 'B';
BEGIN
CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('優(yōu)秀');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('中等');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('及格');
ELSE DBMS_OUTPUT.PUT_LINE('不及格');
END CASE;
END;
該示例使用 CASE 語句來根據(jù)給定的分數(shù)打印出相應(yīng)的評價。它首先比較 grade
和每個可能的值,并在找到匹配值后輸出相應(yīng)的消息。如果沒有匹配項,則輸出 "不及格"。
2.2搜索型CASE語句
它的格式如下所示:
case when 條件1 then 要執(zhí)行的語句;
when 條件2 then 要執(zhí)行的語句;
...
[else 要執(zhí)行的語句;]
end case;
示例1.鍵盤輸入一個字符,如果是大寫字母,打印'大寫字母';小寫打印'小寫字母'? ,否則打印'我不認識',代碼如下:
declare
v1 char:='&a';
begin
case when V1 between 'A' and 'Z' then
dbms_output.put_line('大寫字母');
when V1 between 'a' and 'z' then
dbms_output.put_line('小寫字母');
else dbms_output.put_line('我不認識');
end case;
end;
示例2.從鍵盤上輸入一個員工編號
如果他的名字的首字母是A,B,C,D,E之中的一個,打印1;
如果他的名字的首字母是F,G,H,I,J之中的一個,打印2;
如果他的名字的首字母是K,L,M,N,O之中的一個,打印3;
如果他的名字的首字母是P,Q,R,S,T之中的一個,打印4;
否則,打印5。
declare
v1 varchar2(20);
begin
select substr(ename,1,1) into v1 from emp where empno=&a;
case when v1 between 'A' and 'E' then
dbms_output.put_line(1);
when v1 between 'F' and 'J' then
dbms_output.put_line(2);
when v1 between 'K' and 'O' then
dbms_output.put_line(3);
when v1 between 'P' and 'T' then
dbms_output.put_line(4);
else dbms_output.put_line(5);
end case;
end;
2.3嵌套的CASE語句
當(dāng)需要根據(jù)一個或多個條件組合來處理非常特定的情況時,可以使用嵌套 CASE 語句。它允許在一個 WHEN
子句中包含另一個 CASE 子句。
以下是一個示例,展示如何使用嵌套 CASE 語句:
DECLARE
score NUMBER := 88;
BEGIN
CASE
WHEN score >= 90 THEN -- 外層 CASE 子句
CASE
WHEN score = 100 THEN DBMS_OUTPUT.PUT_LINE('完美成績!'); -- 內(nèi)層 CASE 子句
ELSE DBMS_OUTPUT.PUT_LINE('優(yōu)秀'); -- 內(nèi)層 CASE 子句
END CASE;
WHEN score >= 80 THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN score >= 60 THEN DBMS_OUTPUT.PUT_LINE('及格');
ELSE DBMS_OUTPUT.PUT_LINE('不及格');
END CASE;
END;
該示例根據(jù)分數(shù) score
輸出一個相關(guān)的評價。
如果分數(shù)>= 90,則會觸發(fā)外層 CASE 語句,并判斷內(nèi)層 CASE 子句是否成立;
如果分數(shù)>= 80,則直接輸出 "良好",以此類推。
注意:CASE 子句也可以無限嵌套。
2.4區(qū)別
對于sql中的 case when 和pl/sql中的case when 有什么區(qū)別?
Ⅰ、從簡單的視覺感官上可以發(fā)現(xiàn)的不同有如下:
- 1.sql中的case when 是一個列(值),plsql中的case when是條件判斷
- 2.sql中的case when 內(nèi)部不能加分號,plsql中的case when 每一個要執(zhí)行的語句后都要加分號
- 3.sql中的case when 以end 結(jié)尾,plsql中的case when 以end case 結(jié)尾
- 4.sql中的case when 不能加dml,plsql中的case when 可以加dml
Ⅱ、從使用方式、范圍和功能方面定義理解的不同有如下:
-
1.語法不同:在 SQL 中,
CASE WHEN
始終作為單獨的語句出現(xiàn),在 SELECT 語句中起到轉(zhuǎn)換數(shù)據(jù)的作用;而在 PL/SQL 中,則與其他控制結(jié)構(gòu)(如 IF 語句)一起使用,可以操作變量并控制程序流程。 -
2.語句位置不同:在 SQL 中,
CASE WHEN
只能用于查詢過濾和結(jié)果集轉(zhuǎn)換,而不能用于數(shù)據(jù)更新或刪除;但在 PL/SQL 中,CASE WHEN
可以嵌套于其他表達式或語句之中,來實現(xiàn)更復(fù)雜的邏輯操作。 -
3.功能不同:在 SQL 中,
CASE WHEN
主要用于條件過濾、計算衍生列、排序等場景;而在 PL/SQL 中,則可以用于更高級的控制邏輯,包括比較、循環(huán)、異常處理、函數(shù)返回值等。文章來源:http://www.zghlxwxcb.cn/news/detail-469144.html -
4.返回類型不同:在 SQL 中,
CASE WHEN
的返回值必須一致,且僅能返回單個值;而在 PL/SQL 中,其可以返回多種類型數(shù)據(jù),例如字符型、數(shù)字型、日期型、表等。文章來源地址http://www.zghlxwxcb.cn/news/detail-469144.html
到了這里,關(guān)于Oracle-PL/SQL中條件順序判斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!