zoukankan      html  css  js  c++  java
  • PL/SQL编程基础(四):程序控制(IF,CASE,FOR,LOOP,WHILE LOOP,EXIT,CONTINUE)

    程序控制

    • 程序结构有分支结构与循环结构;
    • 分支结构语法:IFCASE
    • 循环结构:FORWHILE
      • LOOP:先执行再判断,至少执行一次;
      • WHILE LOOP:先判断再执行,如果不满足条件,就不执行
      • FOR循环:已知要循环的次数.
      • 如果明确知道循环次数,使用FOR循环;
      • 如果不知道循环次数,但是知道循环结束条件,使用LOOP循环.
    • 循环控制:EXITCONTINUE语句完成。

     

     

    • PL/SQL程序与其他编程语言一样,也拥有自己的三种程序结构:顺序结构、分支结构、循环结构。这三种不同的结构都有一个共同点,就是它们都只有一个入口,也只有一个出口,这些单一入、出口可以让程序易读、好维护,也可以减少调试的时间。

    顺序结构

    分支结构

     

     

    循环结构

     

    分支结构

    PL/SQL程序中的分支语句主要有两类种IF语句、CASE语句这两种语句都是需要进行条件的判断。

    IF语句

    • 对于IF语句有三类语法格式:

    IF语句

    IF 判断条件 THEN

    满足条件时执行语句 ;

    END IF ;

     

     

    IF…ELSE语句

    IF 判断条件 THEN

    满足条件时执行的语句 ;

    ELSE

    不满足条件时执行的语句 ;

    END IF ;

     

    IF … ELSIF…ELSE语句

    IF 判断条件1 THEN

    满足条件1时执行的语句 ;

    ELSIF 判断条件2 THEN

    满足条件2时执行的语句 ;

    ...

    ELSE

    所有条件不满足条件时执行的语句 ;

    END IF ;

     

     

     

    IF语句

    DECLARE

        V_count NUMBER;

    BEGIN

        SELECT COUNT(empno) INTO V_count FROM emp;

        IF V_count > 10 THEN

            DBMS_OUTPUT.put_line('EMP表的记录大于10');

        END IF;

    END;

    /

    IF…ELSE语句

    DECLARE

        V_COUNT NUMBER;

    BEGIN

        SELECT COUNT(empno) INTO V_COUNT FROM emp;

       IF V_COUNT >10 THEN

            DBMS_OUTPUT.put_line('EMP表的记录大于10');

        ELSE

             DBMS_OUTPUT.put_line('EMP表的记录小于10');

        END IF;

    END;

    /

    IF…ELSIF…ELSE语句

    DECLARE

        V_COUNT NUMBER;

    BEGIN

        SELECT COUNT(empno) INTO V_COUNT FROM emp;

        IF V_COUNT >10 THEN

            DBMS_OUTPUT.put_line('EMP表的记录大于10');

        ELSIF V_COUNT <10 THEN

             DBMS_OUTPUT.put_line('EMP表的记录小于10');

       ELSE

            DBMS_OUTPUT.put_line('EMP表的记录等于10');

       END IF;

    END;

    /

    查询emp表的工资,输入员工编号,根据编号查询工资,如果工资高于3000元,则显示高工资,如果工资大于2000元,则显示中等工资,如果工资小于2000元,则显示低工资。

    DECLARE

        V_empSal emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同

        V_empName emp.ename%Type;-- 定义变量与emp.ename字段类型相同

        V_eno emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同

    BEGIN

        V_eno:=&inputEmpno;-- 用户输入要查找的雇员编号-

        SELECT ename,sal INTO V_empName,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资

       IF V_empSal > 3000 THEN                -- 判断

            DBMS_OUTPUT.put_line(V_empName || '的工资属于高工资!') ;

        ELSIF v_empSal > 2000 THEN            -- 判断

            DBMS_OUTPUT.put_line(V_empName || '的工资属于中等工资!') ;

        ELSE

            DBMS_OUTPUT.put_line(V_empName || '的工资属于低工资!') ;

        END IF;

    END;

    /

    用户输入一个雇员编号,根据它所在的部门给上涨工资,规则:

    • 10部门上涨10%20上涨20%30上涨30%
    • 但是要求最高不能超过5000,超过5000就停留在5000

    DECLARE

        V_empSal    emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同

        V_dno       emp.deptno%Type;-- 定义变量与emp.ename字段类型相同

        V_eno       emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同

    BEGIN

        V_eno := &inputEmpno;-- 用户输入要查找的雇员编号-

        SELECT deptno,sal INTO V_dno,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资

       IF V_dno =10 THEN                -- 判断

            IF V_empSal*1.1 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.1 WHERE empno=V_eno;

            END IF;

        ELSIF V_dno =20 THEN            -- 判断

           IF V_empSal*1.2 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.2 WHERE empno=V_eno;

            END IF;

         ELSIF V_dno =30 THEN           -- 判断

            IF V_empSal*1.3 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.3 WHERE empno=V_eno;

            END IF;

        END IF;

    END;

    /

     

    输入一个员工的编号,那么该员工就会按照部门编号上涨工资

     

    -------------------------------------------------------------------------------------------------------------------

    常用比较运算符

    AND运算符表示将多个比较组合成一个,当每一个单独的判断语句为true时,比较的结果就为true。

    BEGIN

    IF 'MLDN' = 'MLDN' AND 100 = 100 THEN

    DBMS_OUTPUT.put_line('结果为TRUE,满足条件!') ;

    END IF ;

    END;

    /

    BETWEENAND表示的是判断某有一个值是否在指定的范围之中,同时匹配的时候会匹配边界值。

    BEGIN

    IF TO_DATE('1983-09-19','yyyy-mm-dd') BETWEEN TO_DATE('1980-01-01','yyyy-mm-dd')

    AND TO_DATE('1989-12-31','yyyy-mm-dd') THEN

    DBMS_OUTPUT.put_line('80后!') ;

    END IF ;

    END;

    /

    IN操作符表示判断指定的内容是否在给出的一组数值之中。

    BEGIN

    IF 10 IN (10,20,30) THEN

    DBMS_OUTPUT.put_line('数据已成功查找到') ;

    END IF ;

    END;

    /

    IS NULL运算符主要是检查某个变量的内容是否是null。

    DECLARE

    temp    BOOLEAN ;    -- 定义布尔变量,没有设置内容

    BEGIN

    IF temp IS NULL THEN

    DBMS_OUTPUT.put_line('temp变量的内容是null') ;

    END IF ;

    END;

    /

    LIKE主要的功能是进行模糊查找操作,可以使用_匹配任意的一个字符,也可以使用%匹配任意多个字符。

    BEGIN

    IF 'www.mldnjava.cn' LIKE '%mldn%' THEN

    DBMS_OUTPUT.put_line('可以查找到字符串:mldn') ;

    END IF ;

    END;

    /

    NOT表示的是逻辑非,即:可以返回一个布尔类型相反的值(不是null)。

    BEGIN

    IF NOT FALSE THEN

    DBMS_OUTPUT.put_line('条件满足,FALSE变为TRUE') ;

    END IF ;

    END;

    /

    OR表示的是或的关系,用于连接若干个条件,其中只要有一个条件满足,结果就为TRUE,只有都不满足的时候结果才返回FALSE。

    BEGIN

    IF 'MLDN' = 'LXH' OR 10 = 10 THEN

    DBMS_OUTPUT.put_line('有一个条件满足,返回TRUE') ;

    END IF ;

    END;

    /

     

     

    CASE语句

     

    • CASE语句是一种多条件的判断语句,其功能与IFELSIFELSE类似,其基本语法如下:

    CASE [变量]

    WHEN [值 | 表达式] THEN

    执行语句块 ;

    WHEN [值 | 表达式] THEN

    执行语句块 ;

    WHEN [值 | 表达式] THEN

    执行语句块 ;

    ELSE

    条件都不满足时执行语句块;

    END CASE ;


    使用CASE语句判断数值

    DECLARE

    v_choose    NUMBER := 1 ;

    BEGIN

    CASE v_choose

    WHEN 0 THEN

    DBMS_OUTPUT.put_line('您选择的是第0项。') ;

    WHEN 1 THEN

    DBMS_OUTPUT.put_line('您选择的是第1项。') ;

    ELSE

    DBMS_OUTPUT.put_line('没有选项满足。') ;

    END CASE ;

    END ;

    /

    输入雇员编号,根据雇员的职位进行工资提升,提升要求如下

    如果职位是办事员(CLERK),工资增长5%;

    如果职位是销售人员(SALESMAN),工资增长8%;

    如果职位为经理(MANAGER),工资增长10%;

    如果职位为分析员(ANALYST),工资增长20%;

    如果职位为总裁(PRESIDENT),工资不增长。

    DECLARE

    v_job    emp.job%TYPE ;

    v_eno        emp.empno%TYPE ;

    BEGIN

    v_eno := &inputEmpno ;

    SELECT job INTO v_job FROM emp WHERE empno=v_eno ;

    CASE v_job

    WHEN 'CLERK' THEN

    UPDATE emp SET sal=sal*1.05 WHERE empno=v_eno ;

    WHEN 'ANALYST' THEN

    UPDATE emp SET sal=sal*1.10 WHERE empno=v_eno ;

    WHEN 'SALESMAN' THEN

    UPDATE emp SET sal=sal*1.08 WHERE empno=v_eno ;

    WHEN 'MANAGERK' THEN

    UPDATE emp SET sal=sal*1.2 WHERE empno=v_eno ;

    ELSE

    DBMS_OUTPUT.put_line('雇员:' || v_eno || '工资不具备增长条件。') ;

    END CASE ;

    END ;

    /

    使用CASE进行多条件判断和使用IF ELSE实现多条件判断

    多条件判断,CASE WHEN更方便

    DECLARE

    v_salary    emp.sal%TYPE ;

    v_eno        emp.empno%TYPE ;

    BEGIN

    v_eno := &inputEmpno ;

    SELECT sal INTO v_salary FROM emp WHERE empno=v_eno ;

    CASE

    WHEN v_salary >= 3000 THEN

    DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为高工资。') ;

    WHEN v_salary >= 2000 AND v_salary <3000 THEN

    DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为中等工资。') ;

    ELSE

    DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为低工资。') ;

    END CASE ;

    END ;

    /

    DECLARE

        V_empSal    emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同

        V_dno       emp.deptno%Type;-- 定义变量与emp.ename字段类型相同

        V_eno       emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同

    BEGIN

        V_eno := &inputEmpno;-- 用户输入要查找的雇员编号-

        SELECT deptno,sal INTO V_dno,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资

       IF V_dno =10 THEN                -- 判断

            IF V_empSal*1.1 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.1 WHERE empno=V_eno;

            END IF;

        ELSIF V_dno =20 THEN            -- 判断

           IF V_empSal*1.2 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.2 WHERE empno=V_eno;

            END IF;

         ELSIF V_dno =30 THEN           -- 判断

            IF V_empSal*1.3 >5000 THEN

                UPDATE emp SET sal=5000 WHERE empno=V_eno;

            ELSE

                UPDATE emp SET sal=SAL*1.3 WHERE empno=V_eno;

            END IF;

        END IF;

    END;

    /

     

     

    循环结构

    • 循环结构是一种较为常见的语句形式,其功能就是将一段代码执行多次,在循环结构之中有三个重要的组成部分:第一个是循环的初始条件、第二个就是每次循环的判断条件、第三个是循环条件的修改,在PL/SQL程序之中,循环结构一共定义了两种:LOOP循环、FOR循环
      • LOOP:先执行再判断,至少执行一次;
      • WHILE LOOP:先判断再执行,如果不满足条件,就不执行
      • FOR循环:已知要循环的次数.

    LOOP循环

    • 语法:

    LOOP

    循环执行的语句块 ;

    EXIT WHEN 循环结束条件 ;

    循环结束条件修改 ;

    END LOOP;


    WHILE…LOOP循环

    • 语法:

    WHILE (循环结束条件) LOOP

    循环执行的语句块 ;

    循环结束条件修改 ;   

    END LOOP ;


    FOR循环语法

    语法:

    FOR 循环索引 IN [REVERSE] 循环区域下限 .. 循环区域上限 LOOP

    循环执行的语句块 ;

    END LOOP ;

    使用LOOP循环

    DECLARE

    v_i NUMBER := 1 ;    -- 定义一个变量,用于循环

    BEGIN

    LOOP

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    EXIT WHEN v_i >= 3 ;

    v_i := v_i + 1 ;

    END LOOP ;

    END ;

    /

    使用WHILE…LOOP循环

    v_i = 1

    v_i = 2

    v_i = 3

    DECLARE

    v_i NUMBER := 1 ;    -- 定义一个变量,用于循环

    BEGIN

    WHILE (v_i <= 3) LOOP

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    v_i := v_i + 1 ;

    END LOOP ;

    END ;

    /

    使用FOR循环

    v_i = 1

    v_i = 2

    v_i = 3

    DECLARE

    v_i NUMBER := 1 ;    -- 定义一个变量,用于循环

    BEGIN

    FOR v_i IN 1 .. 3 LOOP

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    END LOOP ;

    END ;

    /

    使用REVERSE操作,反转循环.

    v_i = 3

    v_i = 2

    v_i = 1

    发现结果是一种递减的方式

    DECLARE

    v_i NUMBER := 1 ;    -- 定义一个变量,用于循环

    BEGIN

    FOR v_i IN REVERSE 1 .. 3 LOOP

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    END LOOP ;

    END ;

    /

     

     

    循环控制

    • 在正常循环的操作之中,如果需要结束循环或者是退出当前循环,则可以使用EXITCONTINUE语句完成。
    • 一般这两种控制语句都要结合分支语句进行判断

     

    使用EXIT结束循环操作

    DECLARE

    v_i NUMBER := 1 ;    -- 定义一个变量,用于循环

    BEGIN

    FOR v_i IN 1 .. 10 LOOP

    IF v_i = 3 THEN    -- v_i变量增长到3时结束循环

    EXIT ;

    END IF ;

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    END LOOP ;

    END ;

    /

    使用CONTINUE控制循环操作

    单行函数-数值函数-取模

    MOD(数字,数字)

    取模,求余数

     

    SQL> SELECT MOD(10,3) FROM DUAL;

     

     MOD(10,3)

    ----------

             1

    DECLARE

    v_i NUMBER := 1 ;            -- 定义一个变量,用于循环

    BEGIN

    FOR v_i IN 1 .. 10 LOOP

    IF MOD(v_i,2) = 0 THEN    -- 为偶数的时候不执行后续方法体

    CONTINUE ;

    END IF ;

    DBMS_OUTPUT.put_line('v_i = ' || v_i) ;

    END LOOP ;

    END ;

    /

     

    使用GOTO进行跳转

    无条件跳转,最好不使用.

    DECLARE

    v_result NUMBER := 1;

    BEGIN

    FOR v_result IN 1 .. 10 LOOP

    IF v_result = 2 THEN

    GOTO endPoint ;

    END IF ;

    DBMS_OUTPUT.put_line('v_result = ' || v_result) ;

    END LOOP ;

    <<endPoint>>

    DBMS_OUTPUT.put_line('FOR循环提前结束。') ;

    END ;

    /

  • 相关阅读:
    一个很棒的DiabloII研究站:)
    跳票了?又跳了!
    羊皮卷的实践第二十四章
    羊皮卷的实践第二十六章
    羊皮卷的实践第二十五章
    Timer的控件使用
    英语名言名句集锦
    Passwordstrength控件
    羊皮卷的实践第二十三章
    羊皮卷的实践第二十二章
  • 原文地址:https://www.cnblogs.com/thescentedpath/p/CONTROL.html
Copyright © 2011-2022 走看看