1. 程式人生 > >PL/SQL之流程控制語句

PL/SQL之流程控制語句

流程控制:IF語句;CASE語句;

迴圈語句:LOOP語句,EXIT語句;

順序語句:GOTO語句,NULL語句;

1.條件語句

語法:

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;
特別注意:elsif千萬不能寫成elseif,這是PL/SQL設計者的問題

例項使用:

第一步,建立表,插入資料

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語句使用範圍很廣,包括查詢判斷,條件判斷,計算等。