• oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )


    IF逻辑结构:
    IF-THEN-END IF
    IF-THEN-ELSE-END IF
    IF-THEN-ELSIF-END IF


    语法

    IF condition THEN
      statements;
    [ELSIF condition THEN
      statements;]
    [ELSE
      statements;]
    END IF;

    实例

    IF v_ename = 'OSBORNE' THEN
      v_mgr := 22;
    END IF;


    if-then

    . . .

      v_job := 'SALESMAN';     
      v_deptno := 35;
      v_new_comm := sal * 0.20;
    END IF;
    if-then 语句嵌套

    If var1>10 then
       if var2<var1 then
          var2:=var1+20;
       end if;
    End if;

    注意:上面代码中的两个end if,分别对应两个不同的if。在PL/SQL中实现if逻辑有两条规则:
    规则1:每个if语句都有自己的then,以if开始的语句行不跟语句结束符(;)。
    规则2:每个if语句块以相应的end if结束。


    IF-THEN-ELSE

    这种结构与IF-THEN语句非常相似,唯一不同的是在条件为false时,执行跟在else后的一条或多条语句。
    ...
    IF v_shipdate - v_orderdate < 5 THEN  
      v_ship_flag := 'Acceptable';
    ELSE
      v_ship_flag := 'Unacceptable';
    END IF;
    ...

    IF-THEN-ELSE语句嵌套

    IF-THEN-ELSIF  这种结构用于替代嵌套if-then-else结构。
    IF v_start > 100 THEN
      v_start := 2 * v_start;
    ELSIF v_start >= 50 THEN              
      v_start := .5 * v_start;
    ELSE
      v_start := .1 * v_start;
    END IF;
    . . .


    CASE表达式

    CASE selector
    WHEN expression1 THEN sequence_of_statements1;
    WHEN expression2 THEN sequence_of_statements2;
    ...
    WHEN expressionN THEN sequence_of_statementsN;
    [ELSE sequence_of_statementsN+1;]
    END CASE;

    注意:为了避免CASE_NOT_FOUND异常,在编写CASE语句时应该带有ELSE语句。

    从emp表中查询指定员工的工资,并判断该员工的工资是否低于2000,如果条件成立,那么将该员工的工资增加200
    DECLARE
      v_sal emp.sal%TYPE;
      v_ename emp.ename%type:='&ename';
    BEGIN
      SELECT sal INTO v_sal FROM scott.emp
      WHERE LOWER(ename)=LOWER(v_ename);
      IF v_sal <2000 THEN
          UPDATE emp SET sal=v_sal+200
          WHERE LOWER(ename)=LOWER(v_ename);
      END IF;
    END;

    根据给定的职工编号从emp表中查询该职工的奖金(comm字段的值),如果奖金的值不为0那么将表中该职工的奖金增加200,否则将该职工的奖金设置为100。

    DECLARE
      v_comm emp.comm%TYPE;
      v_no emp.empno%TYPE;
    BEGIN
      v_no:=&no;
      SELECT nvl(comm,0) INTO v_comm FROM emp WHERE empno=v_no;
      IF v_comm<>0 THEN
        UPDATE emp SET comm=comm+200 WHERE empno=v_no;
      ELSE
        UPDATE emp SET comm=100 where empno=v_no;
      END IF;
    END;


    构造逻辑条件

    处理NULL值
    使用IS NULL操作符处理NULL值
    任何包含NULL的表达式其值为NULL
    用NULL值与表达式连接时, NULL值被当作空串来处理


    循环控制结构 LOOP循环

    Loops循环是一种控制结构,允许重复执行一组命令,直到决定停止循环为止.
    三种loop循环类型: Basic loop,FOR loop,WHILE loop,
    例子 给定任意一个整数,计算该数的阶乘

    DECLARE
      v_num NUMBER(2):=&num;  --用户任意给定的一个整数
      v_pro NUMBER(20):=1;  
      i NUMBER(2):=1;  --控制循环结束的循环变量
    BEGIN
      IF v_num=0 THEN
        v_pro:=1;
      ELSE
        LOOP
          v_pro:=v_pro*i;  --计算给定整数的阶乘
          i:=i+1;
          EXIT WHEN i>v_num;
        END LOOP;
      END IF;
      dbms_output.put_line('num:'||v_num||'  factorial:'||v_pro);
    END;

    (2)FOR Loop

    例子 使用FOR循环实现某数的阶乘

    DECLARE
      v_num NUMBER(2):=&num;
      v_pro NUMBER(20):=1;
    BEGIN
      IF v_num=0 THEN
        v_pro:=1;
      ELSE
        FOR i IN 1..v_num LOOP
          v_pro:=v_pro*i;      
        END LOOP;
      END IF;


      dbms_output.put_line('num:'||v_num||'  factorial:'||v_pro);
    END;

    (3)WHILE Loop

    例子 使用WHILE循环实现某数的阶乘

    DECLARE
      v_num NUMBER(2):=&num;
      v_pro NUMBER(20):=1;
      i NUMBER(2):=1;
    BEGIN
      IF v_num=0 THEN
        v_pro:=1;
      ELSE
        WHILE i<=v_num LOOP
          v_pro:=v_pro*i;
          i:=i+1;
        END LOOP;
      END IF;
      dbms_output.put_line('num:'||v_num||'  factorial:'||v_pro);
    END;

     最后还有救是loop的多层嵌套运用(Attention)


  • 相关阅读:
    ATL接口返回类型&&ATL接口返回字符串BSTR*
    不允许使用抽象类类型
    error C2039: 'SetDefaultDllDirectories'错误解决办法<转>
    directshow 虚拟摄像头 实例 代码解读
    UML建模之时序图(Sequence Diagram)<转>
    【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>
    在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW
    struct 方法使用
    2014华为机试题目
    贪心-poj-2437-Muddy roads
  • 原文地址:https://www.cnblogs.com/pacoson/p/3523201.html
Copyright © 2020-2023  润新知