Oracle_PL_ SQL_ 教程:控制语句(条件语句、循环语句)

--######################################--
--控制语句(条件语句、循环语句)
--王林 2012.07.06
--######################################--

--between 包含边界值
--**指数运算
--单变量表达式返回true、false或null。当评估某个表达式是否为true时,false和null都是not true
--同样,当评估某个表达式是否为false时,true和null都是not false。null表达式不是true也不是false。

--######################################--
--1.IF语句
--所有语句块至少需要一条语句。
--ELSIF 不能写成 ELSEIF。
--布尔变量可以取代比较运算,返回布尔数据类型的单个函数也可以。

--(1)if-then-else语句 单分支语句

--Demo1:
BEGIN
    --比较语句外的括号不是必需的
    IF 1 = 1 THEN
        DBMS_OUTPUT.put_line( 'Condition met!' );
    --没有else块的if语句只在条件满足时执行代码
    END IF;
END;

--Demo2:
DECLARE
    equal BOOLEAN NOT NULL := TRUE;
BEGIN
    --如果评估变量或返回null值的表达式,运行时可能产生null,应用nvl避免
    IF equal THEN
        DBMS_OUTPUT.put_line( 'Condition met!' );
    END IF;
END;

--Demo3:
BEGIN
    IF 1 = 2 THEN
        DBMS_OUTPUT.put_line( 'Condition met!' );
    ELSE 
        DBMS_OUTPUT.put_line( 'Condition not met!' );
    END IF;
END;

--(2)if-then-elsif-then-else 语句

--Demo4:
DECLARE
    equal BOOLEAN NOT NULL := TRUE;
BEGIN
    --在判定第一个条件为true后退出,当没有条件满足时,运行默认的else条件
    IF 1 = 1 THEN
        DBMS_OUTPUT.put_line( 'Condition 1 met!' );
    ELSIF equal THEN
        DBMS_OUTPUT.put_line( 'Condition 2 met!' );
    ELSIF 1 =2 THEN
        DBMS_OUTPUT.put_line( 'Condition 3 met!' );
    END IF;
END; 

--######################################--
--2.CASE语句
--不可以省去else块,否则在未发现选择符时会引发CASE_NOT_FOUND或PLS-06592错误
--简单CASE语句的选择符是使用(或返回)有效数据类型(布尔类型除外)的变量或函数。
--搜索CASE语句选择符是布尔变量或返回布尔变量的函数,默认选择true

--(1)简单CASE语句
--在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE部分的语句序列。

--Demo5:
DECLARE 
    --选择符可以是除BLOB,BFILE外的任何PL/SQL数据类型或复合类型
    selector NUMBER := 0;
BEGIN
    CASE selector
        --WHEN块越多,有效性越低
        WHEN 0 THEN
            --CASE语句停止评估并在退出该语句前运行匹配的WHEN块
            DBMS_OUTPUT.put_line( 'Case 0!' );
        WHEN 1 THEN
            DBMS_OUTPUT.put_line( 'Case 1!' );
        ELSE
            DBMS_OUTPUT.put_line( 'No match' );
    END CASE;--END 后面有CASE
END;

--(2)表达式结构CASE语句
--CASE结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果。

--Demo6:
--说明:该CASE表达式通过判断变量selector的值,对变量v_result赋予不同的值。
DECLARE 
    selector NUMBER := 1;
    v_result VARCHAR2 (20);
BEGIN
    v_result:=
    CASE selector
        WHEN 1 THEN
            'First'
        WHEN 2 THEN
            'Second'
        ELSE
            'NO'
    END;
    DBMS_OUTPUT.PUT_LINE('The result is:'||v_result);
END;

--(3)CASE搜索语句
--它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
--除非想要搜索false条件,否则CASE搜索语句的选择符是隐式设置的TRUE;

--Demo7:
--说明:此结构类似于IF-THEN-ELSIF-ELSE-END IF结构。
BEGIN 
    CASE /*FALSE | TRUE*/
        WHEN 1 = 2 THEN
            DBMS_OUTPUT.put_line( '[ 1 = 2]!' );
        WHEN 2 =2 THEN
            DBMS_OUTPUT.put_line( '[ 2 = 2]!' );
        ELSE
            DBMS_OUTPUT.put_line( 'No match' );
    END CASE;
END;

--######################################--
--3.Exit When循环:
--EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。如果没有WHEN条件,遇到EXIT语句则无条件退出循环。

--Demo8:
DECLARE
    i NUMBER;
BEGIN 
    i := 0;
    LOOP
       EXIT WHEN( i > 5 );
       DBMS_OUTPUT.put_line(i);
       i := i + 1;
    END LOOP;
END;

--######################################--
--4.Loop循环:

--Demo9:
DECLARE
    i NUMBER;
BEGIN 
    i := 0;
    LOOP 
        i := i + 1;
        DBMS_OUTPUT.put_line(i);
        IF i > 5 THEN 
           EXIT;
        END IF;
   END LOOP;
END;

--######################################--
--5.WHILE LOOP循环:
--WHILE循环是有条件循环
--当条件满足时,执行循环体;当条件不满足时,则结束循环。如果第一次判断条件为假,则不执行循环体。

--Demo10:
DECLARE
    i NUMBER;
BEGIN 
    i:=0;
    WHILE i < 5 LOOP 
        i := i + 1;
        DBMS_OUTPUT.put_line(i);
    END LOOP;
END;

--######################################--
--6.FOR普通循环:
--是固定次数循环。
--循环控制变量是隐含定义的,不需要声明。
--下限和上限用于指明循环次数。正常情况下循环控制变量的取值由下限到上限递增,REVERSE关键字表示循环控制变量的取值由上限到下限递减。
--跟在IN REVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。
--可以使用EXIT退出循环。

--Demo11:
DECLARE
    i NUMBER;
BEGIN 
    i := 0;
    FOR i IN 1..5 LOOP
        DBMS_OUTPUT.put_line(i);
    END LOOP;
END;

--Demo12:
--效果同Demo11一样
BEGIN 
    FOR i IN 1..5 LOOP
        DBMS_OUTPUT.put_line(i);
    END LOOP;
END;

--Demo13:
--REVERSE倒置计数 
BEGIN 
    FOR i IN REVERSE 1..5 LOOP
        DBMS_OUTPUT.put_line(i);
    END LOOP;
END;

--######################################--
--7.For游标循环:

--Demo14:
DECLARE 
    userRow scott.emp%ROWTYPE;
    CURSOR userRows 
    IS 
        SELECT * FROM scott.emp;
BEGIN 
    FOR userRow IN userRows LOOP 
        DBMS_OUTPUT.put_line(userRow.ename||','||userRow.empno||','||userRows%ROWCOUNT);
    END LOOP;
END;

猜你喜欢

转载自overloving.iteye.com/blog/1590100