条件选择语句(IF,CASE)、循环语句(LOOP、WHILE和FOR)和顺序控制语句(GOTO,NULL)。
1、IF条件选择语句
1.1 简单条件判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 二重条件分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 多重条件分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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 使用单一选择符进行等值比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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子句中指定比较条件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
DECLARE
i NUMBER(10):=1;
BEGIN
WHILE i<=10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
END
LOOP;
END
;
|
5、FOR循环
1
2
3
4
5
6
7
8
9
|
BEGIN
FOR
i
IN
1..10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END
LOOP;
END
;
|
1
2
3
4
5
6
7
8
9
|
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语句
什么都不做,只是将控制权交给下一个语句。
本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1597705,如需转载请自行联系原作者