IF语句
1 BEGIN
2 IF 1 = 2 THEN
3 DBMS_OUTPUT.PUT_LINE('1=2');
4 END IF;
5 END;
IF/ELSE语句
1 BEGIN
2 IF 1 = 2 THEN
3 DBMS_OUTPUT.PUT_LINE('1=2');
4 ELSE
5 DBMS_OUTPUT.PUT_LINE('1<>2');
6 END IF;
7 END;
IF/ELSEIF/ELSE语句
1 BEGIN
2 IF 1 > 2 THEN
3 DBMS_OUTPUT.PUT_LINE('1 > 2');
4 ELSIF 1 < 2 THEN
5 DBMS_OUTPUT.PUT_LINE('1 < 2');
6 ELSE
7 DBMS_OUTPUT.PUT_LINE('1 = 2');
8 END IF;
9 END;
LOOP循环,基础LOOP循环
1 DECLARE
2 V_COUNT NUMBER := 0;
3 BEGIN
4 LOOP
5 V_COUNT := V_COUNT + 1;
6 DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);
7 EXIT WHEN V_COUNT = 10;
8 END LOOP;
9 END;
LOOP循环,while__LOOP循环
1 DECLARE
2 V_COUNT NUMBER := 0;
3 BEGIN
4 WHILE V_COUNT < 10 LOOP
5 V_COUNT := V_COUNT + 1;
6 DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);
7 END LOOP;
8 END;
LOOP循环,FOR----LOOP循环
1 BEGIN
2 FOR IDX IN 1 .. 10 LOOP
3 DBMS_OUTPUT.PUT_LINE('循环到:' || IDX);
4 END LOOP;
5 END;
--GOTO语句的使用
/*
GOTO label;
<<label>> /*标号是用<< >>括起来的标识符
*/
1 BEGIN
2 FOR IDX IN 1 .. 10 LOOP
3 DBMS_OUTPUT.PUT_LINE('循环到:' || IDX);
4 GOTO TEST_11;
5 END LOOP;
6 <<TEST_11>> --定义label
7 DBMS_OUTPUT.PUT_LINE('循环到:' || 'A');
8 END;
--NULL值的使用
1 BEGIN
2 IF 1 IS NOT NULL THEN
3 1 DBMS_OUTPUT.PUT_LINE('1 不为空');
4 END IF;
5 NULL; --表示不做任何的处理
6 END;
--使用函数作为IF的条件
1 CREATE OR REPLACE FUNCTION TEST_BOOLEAN(I_DEPTNO IN DEPT.DEPTNO%TYPE)
2 RETURN BOOLEAN IS
3 V_DEPTNO DEPT.DEPTNO%TYPE;
4 BEGIN
5 SELECT D.DEPTNO INTO V_DEPTNO FROM DEPT D;
6 IF V_DEPTNO IS NULL THEN
7 DBMS_OUTPUT.PUT_LINE('');
8 RETURN TRUE;
9 ELSE
10 RETURN FALSE;
11 END IF;
12 EXCEPTION
13 WHEN TOO_MANY_ROWS THEN
14 DBMS_OUTPUT.PUT_LINE('4');
15 END;
16
17 DECLARE
18 V_DEPTNO DEPT.DEPTNO%TYPE;
19 BEGIN
20 IF TEST_BOOLEAN(&部门号码) THEN
21 DBMS_OUTPUT.PUT_LINE('1');
22 ELSE
23 DBMS_OUTPUT.PUT_LINE('2');
24 END IF;
25 END;
CASE语句的两种使用:
1 DECLARE
2 V_OUTPUT VARCHAR2(30);
3 V_ENAME EMP.ENAME%TYPE;
4 BEGIN
5 SELECT E.ENAME INTO V_ENAME FROM EMP E WHERE E.EMPNO = 7521;
6 DBMS_OUTPUT.PUT_LINE('v_ename=' || V_ENAME);
7 --测试case语句.第一种类型
8 CASE V_ENAME
9 WHEN 'SMITH' THEN
10 DBMS_OUTPUT.PUT_LINE('存在' || V_ENAME);
11 ELSE
12 DBMS_OUTPUT.PUT_LINE('不存在');
13 END CASE;
14 --测试case语句.第二种类型
15 CASE
16 WHEN 'SMITH' = V_ENAME THEN
17 DBMS_OUTPUT.PUT_LINE('存在' || V_ENAME);
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('不存在');
20 END CASE;
21 EXCEPTION
22 WHEN OTHERS THEN
23 DBMS_OUTPUT.PUT_LINE(SQLERRM);
24 END;
--使用CASE语句返回值
1 DECLARE
2 BOOLEAN_TRUE BOOLEAN := TRUE;
3 BOOLEAN_FALSE BOOLEAN := FALSE;
4 BOOLEAN_NULL BOOLEAN := NULL;
5 FUNCTION TEST_CASE(I_BOOLEAB IN BOOLEAN) RETURN VARCHAR2 IS
6 BEGIN
7 RETURN CASE I_BOOLEAB WHEN TRUE THEN 'TRUE' WHEN FALSE THEN 'FALSE' WHEN NULL THEN '没有执行这个NULL' ELSE 'NULL' END;
8 END;
9 BEGIN
10 DBMS_OUTPUT.PUT_LINE(TEST_CASE(BOOLEAN_TRUE));
11 DBMS_OUTPUT.PUT_LINE(TEST_CASE(BOOLEAN_FALSE));
12 DBMS_OUTPUT.PUT_LINE(TEST_CASE(BOOLEAN_NULL));
13 END;
--使用CASE语句动态的向存储过程传值
1 DECLARE
2 V_DEPTNO DEPT.DEPTNO%TYPE;
3 PROCEDURE TEST_CASE(I_DEPTNO IN NUMBER) IS
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE('调用了过程');
6 DBMS_OUTPUT.PUT_LINE('DEPTNO:' || I_DEPTNO);
7 END;
8 BEGIN
9 TEST_CASE(CASE WHEN 1 = 1 THEN 1 ELSE 2 END);
10 END;
LOOP循环使用EXIT退出的两种方式
1 DECLARE
2 V_COUNT NUMBER := 0;
3 BEGIN
4 <<LOOP_1>>
5 WHILE TRUE LOOP
6 V_COUNT := V_COUNT + 1;
7 DBMS_OUTPUT.PUT_LINE(V_COUNT);
8 IF V_COUNT > 10 THEN
9 EXIT;
10 END IF;
11 END LOOP LOOP_1;
12 V_COUNT := 0;
13 <<LOOP_2>>
14 WHILE TRUE LOOP
15 V_COUNT := V_COUNT + 1;
16 DBMS_OUTPUT.PUT_LINE(V_COUNT);
17 EXIT WHEN V_COUNT > 10;
18 END LOOP LOOP_2;
19 END;
--使用标签退出循环
1 DECLARE
2 V_COUNT NUMBER := 0;
3 V_COUNT_INNER NUMBER := 0;
4 BEGIN
5 <<LOOP_1>>
6 WHILE TRUE LOOP
7 V_COUNT := V_COUNT + 1;
8 DBMS_OUTPUT.PUT_LINE(V_COUNT);
9 DBMS_OUTPUT.PUT_LINE('我马上就要退出');
10 EXIT LOOP_1;
11 END LOOP LOOP_1;
12 V_COUNT := 0;
13 <<LOOP_2>>
14 WHILE TRUE LOOP
15 V_COUNT := V_COUNT + 1;
16 DBMS_OUTPUT.PUT_LINE(V_COUNT);
17 EXIT WHEN V_COUNT > 10;
18 <<LOOP_3>>
19 WHILE TRUE LOOP
20 V_COUNT_INNER := V_COUNT_INNER + 1;
21 DBMS_OUTPUT.PUT_LINE(V_COUNT_INNER);
22 DBMS_OUTPUT.PUT_LINE('我要退出外层循环');
23 EXIT LOOP_2; --使用标签退出指定的循环,默认只退出本层循环
24 END LOOP LOOP_3;
25 V_COUNT_INNER := 0;
26 END LOOP LOOP_2;
27 DBMS_OUTPUT.PUT_LINE('成功的退出外层循环');
28 END;