PL/SQL之流程控制語句
阿新 • • 發佈:2019-01-11
流程控制:IF語句;CASE語句;
迴圈語句:LOOP語句,EXIT語句;
順序語句:GOTO語句,NULL語句;
1.條件語句
語法:
特別注意:elsif千萬不能寫成elseif,這是PL/SQL設計者的問題IF <布林表示式> THEN SQL語句和PL/SQL語句 END IF; ----------------------------- IF <布林表示式> THEN SQL語句和PL/SQL語句 ELSE 其他SQL語句和PL/SQL語句 END IF; ----------------------------- IF <布林表示式> THEN SQL語句和PL/SQL語句 ELSIF <布林表示式> THEN SQL語句和PL/SQL語句 .....可以多個elsif ELSE SQL語句和PL/SQL語句 END IF;
例項使用:
第一步,建立表,插入資料
create table mytest(
id number(3),
name varchar2(20),
age number(3)
);
insert into mytest values(1,'one',18);
insert into mytest values(2,'two',20);
insert into mytest values(3,'three',24);
commit;
第二步,使用條件語句
DECLARE v_age mytest.age%TYPE; BEGIN SELECT age INTO v_age FROM mytest WHERE id=1; IF v_age < 18 THEN--條件判斷開始 DBMS_OUTPUT.PUT_LINE('未成年'); ELSIF v_age >= 18 AND v_age <= 30 THEN DBMS_OUTPUT.PUT_LINE('青年人'); ELSIF v_age > 30 AND v_age <= 60 THEN DBMS_OUTPUT.PUT_LINE('中年人'); ELSE DBMS_OUTPUT.PUT_LINE('老年人'); END IF;--條件判斷結束 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('異常丟擲'); END;
2.CASE表示式
CASE表示式有兩種格式,在SQL和PL/SQL不一樣的是,sql中以end結束,pl/sql中以end case結束。
格式一:
CASE 條件表示式
WHEN 表示式結果1 THEN
語段1
WHEN 表示式結果2 THEN
語段2
...
[ELSE 語句段]--else為可選
END CASE;
例項:
DECLARE v_age mytest.age%TYPE; BEGIN SELECT age INTO v_age FROM mytest WHERE id = 1; CASE v_age < 18 WHEN TRUE THEN DBMS_OUTPUT.PUT_LINE('未成年人'); ELSE DBMS_OUTPUT.PUT_LINE('成年人'); END CASE; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('丟擲異常'); END;
格式二:
CASE WHEN 表示式1 THEN
語段1
WHEN 表示式2 THEN
語段2
...
[ELSE 語句段]--可選
END CASE;
例項:
DECLARE
v_age mytest.age%TYPE;
BEGIN
SELECT age INTO v_age FROM mytest WHERE id = 1;
CASE WHEN v_age < 18 THEN
DBMS_OUTPUT.PUT_LINE('未成年');
WHEN v_age >=18 AND v_age <= 60 THEN
DBMS_OUTPUT.PUT_LINE('中年人');
ELSE
DBMS_OUTPUT.PUT_LINE('老年人');
END CASE;--case語句結束
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('年齡分段開個玩笑異常了');
END;--整個塊語句結束
3.3迴圈
1.簡單迴圈
語法:
LOOP
執行目標語句;
EXIT WHEN <判斷條件>;--當不滿足條件時,退出迴圈
END LOOP;--結束迴圈
例項:
DECLARE
v_count NUMBER(2):=0;
BEGIN
LOOP
v_count := v_count+1;
DBMS_OUTPUT.PUT_LINE(v_count);
EXIT WHEN v_count = 5;
END LOOP;
END;
2.while迴圈
語法:
WHILE 布林表示式 LOOP--滿足條件進入迴圈
執行目標語句;
END LOOP;--結束迴圈
例項:
DECLARE
v_count NUMBER(2):=1;
BEGIN
WHILE v_count<6 LOOP
DBMS_OUTPUT.PUT_LINE('迴圈次數為:'||v_count);
v_count := v_count+1;
END LOOP;
END;
3.數字迴圈
語法:
FOR 迴圈計數器 IN [REVERSE] 上限..下限 LOOP
執行目標語句;
END LOOP;
--不加reverse,迴圈變數自動加1,使用reverse迴圈變數自動減1.
--上限,下限必須是整數,可以用exit退出迴圈
例項:
DECLARE
v_count NUMBER(2):= 5;
BEGIN
FOR INT IN 1..v_count LOOP--在in後面加上reverse能看到不同的效果
DBMS_OUTPUT.PUT_LINE(INT);
END LOOP;
END;
3.4標號和GOTO語句
無條件跳轉到指定的標號去,語法:
GOTO LABEL;
......
<<LABEL>>;--標號是用<<>>括起來的識別符號
例項:
DECLARE
v_age mytest.age%TYPE := 19;
BEGIN
IF v_age < 18 THEN
GOTO firstGoto;
ELSE
GOTO lastGoto;
END IF;
<<firstGoto>>
DBMS_OUTPUT.PUT_LINE('跳轉到第一個goto');
<<lastGoto>>
DBMS_OUTPUT.PUT_LINE('跳轉到第二個goto');
END;
注意,GOTO不能進行以下跳轉:
不能跳轉到迴圈,條件語句中;
不能從異常處理部分在跳回轉執行部分,邏輯亂套;
不能跳轉到字塊中;
不能從條件語句的一部分跳轉到另一部分,違反條件語句的執行邏輯;
3.5NUL語句
NULL語句使用範圍很廣,包括查詢判斷,條件判斷,計算等。