Oracle條件選擇語句和迴圈語句
Oracle條件選擇語句(IF,CASE)、迴圈語句(LOOP、WHILE和FOR)和順序控制語句(GOTO,NULL)。
1、IF條件選擇語句
1.1 簡單條件判斷
DECLARE
v_sal NUMBER(6,2);
BEGIN
SELECT sal INTO v_sal FROM emp WHERE lower(ename)=lower('&&name');
IF v_sal<2000 THEN
UPDATE emp SET sal=v_sal+200 WHERE lower(ename)=lower('&name');
END IF;
END;
1.2 二重條件分支
DECLARE
v_comm NUMBER(6,2);
BEGIN
SELECT comm INTO v_comm FROM emp WHERE empno=&no;
IF v_comm<>0 THEN
UPDATE emp SET comm=v_comm+100 WHERE empno=&no;
ELSE
UPDATE emp SET comm=200 WHERE empno=&no;
END IF;
END;
1.3 多重條件分支
DECLARE
v_job VARCHAR2(10);
V_sal NUMBER(6,2);
BEGIN
SELECT job,sal INTO v_job,v_sal FROM emp WHERE empno=&no;
IF v_job='PRESIDENT' THEN
UPDATE emp SET sal =v_sal+1000 WHERE empno=&no;
ELSEIF
v_job='MANAGER' THEN
UPDATE emp SET sal=v_sal+500 WHERE empno=&no;
ELSE
UPDATE emp SET sal=v_sal+200 WHERE empno=&no;
END IF;
END;
2、CASE條件選擇語句
2.1 使用單一選擇符進行等值比較
DECLARE
v_deptno emp.deptno%TYPE;
BEGIN
v_deptno:=&no;
CASE v_deptno
WHEN 10 THEN
UPDATE emp SET comm=100 WHERE deptno=v_deptno;
WHEN 20 THEN
UPDATE emp SET comm=80 WHERE deptno=v_deptno;
WHEN 30 THEN
UPDATE emp SET comm=30 WHERE deptno=v_deptno;
ELSE
DBMS_OUTPUT.PUT_LINE('不存在該部門');
END CASE;
END;
備忘:ELSE後為不滿足條件時預設處理結果。
2.2 在CASE語句中使用多種條件比較
當使用單一條件選擇符進行等值比較時,可以使用CASE xxx 文法來實現,如果包含有多種條件進行不等比較,那麼必須在WHEN子句中指定比較條件。
DECLARE
v_sal emp.sal%TYPE;
v_ename emp.ename%TYPE;
BEGIN
SELECT sal ,ename INTO v_sal,v_ename FROM emp WHERE empno=&no;
CASE
WHEN v_sal<1000 THEN
UPDATE emp SET comm=100 WHERE ename=v_ename;
WHEN v_sal<2000 THEN
UPDATE emp SET comm=80 WHERE ename=v_ename;
WHEN v_sal<6000 THEN
UPDATE emp SET comm=50 WHERE ename=v_ename;
END CASE;
END;
3、LOOP迴圈
DECLARE
i NUMBER(10):=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
EXIT WHEN i=10;
END LOOP;
END;
備忘:必須使用WHEN子句有條件退出迴圈。
4、WHILE迴圈
基本迴圈至少執行一次迴圈體內的語句,而對於WHILE迴圈來說,只有條件為TRUE才會執行迴圈體內的語句。以WHILE..LOOP 開始 END LOOP結束。
DECLARE
i NUMBER(10):=1;
BEGIN
WHILE i<=10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
END LOOP;
END;
5、FOR迴圈
BEGIN
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
BEGIN
FOR i IN REVERSE 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
備忘:關鍵字REVERSE表示逆向,即從最大值向下遞減。FOR迴圈可以嵌套。
6、GOTO語句
無條件跳轉到一個標籤處。eg:goto 標籤名稱;
備忘:Oracle標籤定義為:<<標籤名稱>>
Oracle使用兩個單引號表示轉義含義,eg:'''表示一個單引號。
GOTO語句對系統效能影響很大,建議盡量少用。
7、NULL語句
什麼都不做,只是將控制權交給下一個語句。