zoukankan      html  css  js  c++  java
  • PL/SQL控制语句

    本节要点:

    • l  选择结构控制语句
      •   if条件控制语句
      •   Case语句
    • l  循环结构控制语句
      •   基本loop循环
      •   for循环
      •   while循环
      •   嵌套循环

    PL/SQL既然是面向过程的编程语言,那么它就有针对逻辑的控制语句,这些语句在日常的PL/SQL编程中起着很重要的作用,可以完成业务逻辑的框架部分。下面就来介绍PL/SQL的逻辑控制语句。

    1         选择结构控制语句

    1.1         If条件控制语句

    条件控制语句就是根据当前某个参数的值来判断进入哪一个流程,这就好像做选择题一样,当满足某个条件时就进入对应的流程,否则进入另一个流程。

    语法:

    IF condition THEN

           statements;

    [ELSIF condition THEN

           statements;]

    [ELSE

           statements;]

    END IF;

    • l  在IF语句中,唯一一个必需的子句是IF子句。IF子句指出了要想执行THEN关键字之后列出的语句所必须满足的条件。如果这个条件计算为FALSE,并且提供了第一个ELSIF条件,那么Oracle将转到这个条件。
    • l  ELSIF子句用来指出在随后的条件得到满足时应该执行的另一个操作过程或一组语句。如果在ELSIF关键字之后列出的条件计算为TRUE,那么将执行在随后的THEN关键字之后列出的语句。
    • l  如果在IF和ELSIF子句中提供的条件都是FALSE,将自动执行ELSE子句中提供的任何语句。
    • l  IF语句总是以END IF关键字结束。

    注意:ELSIF子句的关键字是一个单词,不能写成“ELSEIF”或“ELSE IF”

    示例:编写PL/SQL语句块,根据所购买图书的零售价,然后确定在发货时应该包括的礼品。

    DECLARE

      v_gift VARCHAR2(20);

      c_retailprice NUMBER(5,2):=&price;

    BEGIN

      IF c_retailprice>56 THEN

        v_gift:='FREE SHIPPING';

      ELSIF c_retailprice>25 THEN

        v_gift:='BOOKCOVER';

      ELSIF c_retailprice>12 THEN

        v_gift:='BOX OF BOOK LABELS';

      ELSE

        v_gift:='BOOKMARKER';

      END IF;

      DBMS_OUTPUT.PUT_LINE('The gift for a book costing '||c_retailprice||' is a '||v_gift);

    END

    示例:请按以下对应关系,根据成绩的不同,打印出对应的级别

                    >90    A

                    >80    B

                    >70    C

                    >=60   D

                    <60    E

    DECLARE

      v_grade VARCHAR2(20);

      c_score NUMBER(5, 2) := &score;

    BEGIN

      IF c_score > 90 THEN

        v_grade := 'A';

      ELSIF c_score > 80 THEN

        v_grade := 'B';

      ELSIF c_score > 70 THEN

        v_grade := 'C';

      ELSIF c_score >= 60 THEN

        v_grade := 'D';

      ELSIF c_score < 60 THEN

        v_grade := 'E';

      ELSE

        v_grade := 'Error put in';

      END IF;

      DBMS_OUTPUT.PUT_LINE('The grade is ' || v_grade);

    END;

    1.2         CASE语句

    CASE语句同IF语句类似,也是根据条件选择对应的语句执行。

    语法:

    CASE selector

    WHEN expression1 THEN result1

    WHEN expression2 THEN result2

    WHEN expressionN THEN resultN

    [ ELSE resultN+1]

    END;

    示例:根据不同的输入打印不同的信息

    DECLARE

      v_grade     char(1) := UPPER('&p_grade');

      v_appraisal VARCHAR2(20);

    BEGIN

      v_appraisal := CASE v_grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Very Good' WHEN 'C' THEN 'Good' ELSE 'No such grade' END;

      DBMS_OUTPUT.PUT_LINE(' Grade: ' || v_grade || ' Appraisal: ' ||

                           v_appraisal);

    END;

    2         循环结构控制语句

    希望反复执行PL/SQL块的可执行部分中的语句。创建一个循环,其中包括要执行的语句,这个循环一直重复,直到满足某个条件为止,这时将会退出循环。有三种类型的循环,你可以在PL/SQL块的可执行部分使用它们,以便重复执行一组语句:

    • l  基本loop循环
    • l  FOR循环
    • l  WHILE循环

    2.1         基本loop循环

    语法:

    LOOP

           statements;

           EXIT [WHEN condition];

    END LOOP;

    • l  基本loop循环用来执行循环语句,直到满足了EXIT子句指定的条件为止。
    • l  根据指定的条件,执行循环的次数在各次执行时可能是不同的。
    • l  LOOP关键字指出循环的开始,END LOOP指出循环的结束。LOOP与END LOOP之间的所有语句将一直重复执行,直到退出循环为止。
    • l  EXIT关键字指出应该何时退出循环。

    注意:因为要执行的语句之后列出了EXIT的关键字,所以循环中任何语句至少自动执行一次。这被称为“后测试”(post-test)。在执行语句之后,将评估EXIT子句中列出的任何条件,如果添加为TRUE,那么循环将会结束,然后将执行PL/SQL块的其余部分。

    示例:创建一个打印一系列数字的循环。

    DECLARE

      v_counter NUMBER(1) := 0;

    BEGIN

      LOOP

        v_counter := v_counter + 1;

        DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||

                             v_counter);

        EXIT WHEN v_counter = 4;

      END LOOP;

    END;

    示例:打印1-10之间的偶数

    DECLARE

      v_counter NUMBER(2) := 1;

    BEGIN

      LOOP

        if mod(v_counter, 2) = 0 then

          DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||

                               v_counter);

        end if;

        v_counter := v_counter + 1;

        EXIT WHEN v_counter > 10;

      END LOOP;

    END;

    2.2         for循环

    语法:

    FOR counter IN[REVERSE] lower_limit..upper_limit LOOP

           statements;

    END LOOP;

    • l  FOR循环也使用一个计数器控制循环的执行次数
    • l  计数器不是一个必须在PL/SQL块的声明部分声明的变量。在第一次执行LOOP时,将隐含声明计数器
    • l  FOR子句要求用户指出计数器的上限和下限。也即,必须指定计数器的初始值(lower_limit)以及终止循环的值(upper_limit)。
    • l  在每一次执行循环时,计数器都将增加1。到达定义为计数器上限的值之后,就将退出这个循环。
    • l  如果在这个子句中包括了REVERSE关键字,那么计数器可以采取相反的方式(计数器减少)

    示例:FOR循环使用i作为循环计数器,IN关键字指定范围

    BEGIN

      FOR I IN 1 .. 10 LOOP

        DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' || i);

      END LOOP;

    END;

    2.3         while循环

    执行一系列语句,直到条件变为FALSE为止。与前面循环不同,如果条件最初为FALSE,那么永远不能进入这个循环。 在WHILE子句提供的条件决定了循环将在何时终止。

    语法:

    WHILE condition LOOP

           statements;

    END LOOP;

    示例:PL/SQL块中使用WHILE循环来显示变量的值,直到指定的条件为FALSE为止。

    DECLARE

      v_counter NUMBER(2):=0;

    BEGIN

      WHILE v_counter<15 LOOP

      DBMS_OUTPUT.PUT_LINE('The current  value of the counter is '||v_counter);

      v_counter:=v_counter+1;

      END LOOP;

    END;

    示例:请打印出1~10之间的偶数(注:请用While loop的语法实现)

    DECLARE

      v_counter NUMBER(2) := 1;

    BEGIN

      WHILE v_counter <= 10 LOOP

        if mod(v_counter, 2) = 0 then

          DBMS_OUTPUT.PUT_LINE('The current  value of the counter is ' ||v_counter);

        end if;

        v_counter := v_counter + 1;

      END LOOP;

    END;

    2.4         嵌套循环

    任何类型的循环都可以嵌套在另一个循环中。

    注意:在控制返回外部循环之前,必须完成内部循环的执行。在控制返回循环之后,只要外部循环的条件有效,就会再次执行外部循环,这包括了内部循环的执行。这个过程将一直继续,直到外部循环结束为止。

    示例:PL/SQL块包含了一个嵌套的FOR循环

    DECLARE

      v_counter NUMBER(2):=0;

    BEGIN

    WHILE v_counter<3 LOOP

        FOR i IN 1..2 LOOP

          DBMS_OUTPUT.PUT_LINE('The current value of the FOR LOOP counter is '||i);

        END LOOP;

        DBMS_OUTPUT.PUT_LINE('The current value of the WHILE counter is '||v_counter);

        v_counter:=v_counter+1;

      END LOOP;

    END;

  • 相关阅读:
    Django的路由系统
    Django框架简介
    模块和包
    内置函数——filter和map
    匿名函数
    Djangon 基础总结 汇总 从请求到返回页面的过程,
    Django基础 一
    异常处理
    Sqoop
    Oozie
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7357628.html
Copyright © 2011-2022 走看看