《oracle pl/sql programming》 第四章 条件与顺序控制 第五章 迭代与循环

原创 2007年10月01日 14:07:00
第四章 条件与顺序控制
1. IF
IF THEN END IF;
    IF salary > 40000
    THEN
       give_bonus (employee_id,500);
    END IF;
IF THEN ELSE END IF;
    IF salary <= 40000
    THEN
       give_bonus (employee_id, 0);
    ELSE
       give_bonus (employee_id, 500);
    END IF;
IF THEN ELSIF ELSE END IF;
    IF salary BETWEEN 10000 AND 20000
    THEN
       give_bonus(employee_id, 1500);
    ELSIF salary BETWEEN 20000 AND 40000
    THEN
       give_bonus(employee_id, 1000);
    ELSIF salary > 40000
    THEN
       give_bonus(employee_id, 500);
    ELSE
       give_bonus(employee_id, 0);
    END IF;
 
 
IF嵌套
    IF condition1
    THEN
       IF condition2
       THEN
          statements2
       ELSE
          IF condition3
          THEN
             statements3
          ELSIF condition4
          THEN
             statements4
          END IF;
       END IF;
    END IF;
 
2.CASE
简单CASE
    CASE employee_type
    WHEN 'S' THEN
       award_salary_bonus(employee_id);
    WHEN 'H' THEN
       award_hourly_bonus(employee_id);
    WHEN 'C' THEN
       award_commissioned_bonus(employee_id);
    ELSE
       RAISE invalid_employee_type;
    END CASE;
 
   CASE TRUE
    WHEN salary >= 10000 AND salary <=20000 THEN
       give_bonus(employee_id, 1500);
    WHEN salary > 20000 AND salary <= 40000
       give_bonus(employee_id, 1000);
    WHEN salary > 40000
       give_bonus(employee_id, 500);
    ELSE
       give_bonus(employee_id, 0);
    END CASE;
 
    CASE
    WHEN salary >= 10000 AND salary <=20000 THEN
       give_bonus(employee_id, 1500);
    WHEN salary > 20000 AND salary <= 40000 THEN
       give_bonus(employee_id, 1000);
    WHEN salary > 40000 THEN
       give_bonus(employee_id, 500);
    ELSE
       give_bonus(employee_id, 0);
    END CASE;
 
CASE嵌套
    CASE
    WHEN salary >= 10000 THEN
       CASE
       WHEN salary <= 20000 THEN
          give_bonus(employee_id, 1500);
       WHEN salary > 40000 THEN
          give_bonus(employee_id, 500);
       WHEN salary > 20000 THEN
          give_bonus(employee_id, 1000);
       END CASE
;
    WHEN salary < 10000 THEN
       give_bonus(employee_id,0);
    END CASE;
 
CASE表达式
CASE表达是的一种常见用法是用于SQL语句中它有两种方式
    Simple_Case_Expression :=
       CASE expression
       WHEN result1 THEN
          result_expression1
       WHEN result2 THEN
          result_expression2
       ...
       ELSE
          result_expression_else
       END;
 
    Searched_Case_Expression :=
       CASE
       WHEN expression1 THEN
          result_expression1
       WHEN expression2 THEN
          result_expression2
       ...
       ELSE
          result_expression_else
       END;
 
举例如下
    DECLARE
       boolean_true BOOLEAN := TRUE;
       boolean_false BOOLEAN := FALSE;
       boolean_null BOOLEAN;
 
       FUNCTION boolean_to_varchar2 (flag IN BOOLEAN) RETURN VARCHAR2 IS
       BEGIN
          RETURN
          CASE flag
          WHEN TRUE THEN 'True'
          WHEN FALSE THEN 'False'
          ELSE 'NULL' END;
       END;
 
    BEGIN
       DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_true));
       DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_false));
       DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_null));
    END;
 
    DECLARE
      salary NUMBER := 20000;
      employee_id NUMBER := 36325;
 
      PROCEDURE give_bonus (emp_id IN NUMBER, bonus_amt IN NUMBER) IS
      BEGIN
        DBMS_OUTPUT.PUT_LINE(emp_id);
        DBMS_OUTPUT.PUT_LINE(bonus_amt);
      END;
 
    BEGIN
       give_bonus(employee_id,
                  CASE
                  WHEN salary >= 10000 AND salary <=20000 THEN 1500
                  WHEN salary > 20000 AND salary <= 40000 THEN 1000
                  WHEN salary > 40000 THEN 500
                  ELSE 0
                  END);
    END;
 
    DECLARE
      salary NUMBER := 20000;
      employee_id NUMBER := 36325;
      bonus_amount NUMBER;
    BEGIN
       bonus_amount :=
          CASE
          WHEN salary >= 10000 AND salary <=20000 THEN 1500
          WHEN salary > 20000 AND salary <= 40000 THEN 1000
          WHEN salary > 40000 THEN 500
          ELSE 0
          END * 10;
 
       DBMS_OUTPUT.PUT_LINE(bonus_amount);
    END;
 
    SELECT
        CASE
           WHEN DUMMY='X' THEN 'Dual is OK'
           ELSE 'Dual is messed up'
        END
    FROM DUAL;
 
3. GOTO
    BEGIN
       GOTO second_output;
 
       DBMS_OUTPUT.PUT_LINE('This line will never execute.');
 
       <<second_output>>
       DBMS_OUTPUT.PUT_LINE('We are here!');
    END;
 
4.null语句
NULL语句不执行任何操作一般用来提高程序代码的可读性。
    PROCEDURE calc_avg_sales
    BEGIN
       :sales.avg := :sales.month1 / :sales.total;
    EXCEPTION
       WHEN ZERO_DIVIDE
       THEN
          :sales.avg := 0;
          RAISE FORM_TRIGGER_FAILURE;
       WHEN OTHERS
       THEN
          NULL;
    END;
 
    PROCEDURE process_data (data_in IN orders%ROWTYPE,
                            data_action IN VARCHAR2) IS
    BEGIN
       -- First in series of validations.
       IF data_in.ship_date IS NOT NULL
       THEN
          status := validate_shipdate (data_in.ship_date);
          IF status != 0 THEN GOTO end_of_procedure;
       END IF;
 
       -- Second in series of validations.
       IF data_in.order_date IS NOT NULL
       THEN
          status := validate_orderdate (data_in.order_date);
          IF status != 0 THEN GOTO end_of_procedure;
       END IF;
 
       ... more validations ...
 
       << end_of_procedure >>
       NULL;
    END;
 

第五章 迭代与循环

1.循环基础

 

简单循环 (REPEAT...UNTIL...)

    PROCEDURE display_multiple_years (

       start_year_in IN PLS_INTEGER

      ,end_year_in IN PLS_INTEGER

    )

    IS

       l_current_year PLS_INTEGER := start_year_in;

    BEGIN

       LOOP

          EXIT WHEN l_current_year > end_year_in;

          display_total_sales (l_current_year);

          l_current_year :=  l_current_year + 1;

       END LOOP;

    END display_multiple_years;

 

FOR循环

    PROCEDURE display_multiple_years (

       start_year_in IN PLS_INTEGER

      ,end_year_in IN PLS_INTEGER

    )

    IS

    BEGIN

       FOR l_current_year IN start_year_in .. end_year_in

       LOOP

          display_total_sales (l_current_year);

       END LOOP;

    END display_multiple_years;

 

WHILE循环

    PROCEDURE display_multiple_years (

       start_year_in IN PLS_INTEGER

      ,end_year_in IN PLS_INTEGER

    )

    IS

       l_current_year PLS_INTEGER := start_year_in;

    BEGIN

       WHILE (l_current_year <= end_year_in)

       LOOP

          display_total_sales (l_current_year);

          l_current_year :=  l_current_year + 1;

       END LOOP;

    END display_multiple_years;

 

 

2. 游标FOR循环

语法

    FOR record_index IN { cursor_name | (explicit SELECT statement) }

    LOOP

       executable statement(s)

    END LOOP;

例子

    FOR book_cur IN (SELECT * FROM books)

    LOOP

       show_usage;

    END LOOP;

 

 1   DECLARE

 2      CURSOR occupancy_cur IS

 3         SELECT pet_id, room_number

 4           FROM occupancy WHERE occupied_dt = TRUNC (SYSDATE);

 5      occupancy_rec occupancy_cur%ROWTYPE;

 6   BEGIN

 7      OPEN occupancy_cur;

 8      LOOP

 9         FETCH occupancy_cur INTO occupancy_rec;

10         EXIT WHEN occupancy_cur%NOTFOUND;

11         update_bill

12             (occupancy_rec.pet_id, occupancy_rec.room_number);

13       END LOOP;

14       CLOSE occupancy_cur;

15    END;

可替换成FOR

    DECLARE

       CURSOR occupancy_cur IS

          SELECT pet_id, room_number

            FROM occupancy WHERE occupied_dt = TRUNC (SYSDATE);

    BEGIN

       FOR occupancy_rec IN occupancy_cur

       LOOP

          update_bill (occupancy_rec.pet_id, occupancy_rec.room_number);

       END LOOP;

    END;

 

3.标签跳转

    BEGIN

       <<outer_loop>>

       LOOP

          LOOP

             EXIT outer_loop;

          END LOOP;

          some_statement ;

       END LOOP;

    END;

 

 

oracle(02): PL/SQL基本概念,关系运算符,顺序结构,分支结构,循环结构

上一节:http://blog.csdn.net/Harry_ZH_Wang/article/details/77824963首先做点小的知识点储备,下面面的连接是oracle开发常用的图形界面工具使...

PL/SQL中操作符、条件和循环控制

1.PL/SQL是一种块结构语言,它将一组语句放在一个块中,一次性发送给服务器,先编译后执行。对于有名称的PL/SQL块,可以单独编译,永久的存在数据库中,随时准备执行。PL/SQL的优点: a.支...

oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构,

分支结构 分支结构是最基本的程序结构,分支结构由IF语句实现。 使用IF语句,根据条件可以改变程序的逻辑流程。IF语句有如下的形式: IF 条件1 THEN 语句序列1; [ELSIF 条件...

Oracle PL/SQL之LOOP循环控制语句

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。 ...
  • hwt0101
  • hwt0101
  • 2015年12月14日 17:55
  • 557

Oracle PL/SQL之LOOP循环控制语句

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。  ...
  • TrHlxc
  • TrHlxc
  • 2016年03月01日 20:47
  • 1195

Oracle PL/SQL之LOOP循环控制语句

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。 ...

二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

一、pl/sql的进阶--控制结构 在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构。 在本部分学习完...

Oracle PL/SQL之LOOP循环控制语句

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。 ...

Oracle pl/sql的进阶--控制结构(分支,循环,控制)

:pl/sql的进阶--控制结构(分支,循环,控制) pl/sql的进阶--控制结构 介绍   在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构....

oracle 11g PL/SQL Programming学习一

第一章 概览        PL/SQL历史背景(history and background)        PL/SQL是随着oracle在80年代末发展起来的.最初,其功能还很有限,但是在9...
  • edcvf3
  • edcvf3
  • 2012年08月09日 17:22
  • 2320
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《oracle pl/sql programming》 第四章 条件与顺序控制 第五章 迭代与循环
举报原因:
原因补充:

(最多只允许输入30个字)