Welcome 微信登录

首页 / 数据库 / MySQL / PL/SQL流程控制语句

PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:
    控制语句: IF 语句
    循环语句: LOOP语句, EXIT语句
    顺序语句: GOTO语句, NULL语句
①if语句
IF <布尔表达式> THEN
    PL/SQL 和SQL语句;
ELSIF< 其它布尔表达式> THEN
    其它语句;
ELSIF< 其它布尔表达式> THEN
    其它语句;
ELSE
    其它语句;
END IF;例:
declare
   v_emp_name employees.last_name%type;
   v_emp_sal employees.salary%type;
   v_emp_sal_level varchar2(20);
begin
   select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;
   
   if(v_emp_sal >= 10000) then v_emp_sal_level := "salary >= 10000";
   elsif(v_emp_sal >= 5000) then v_emp_sal_level := "5000<= salary < 10000";
   else v_emp_sal_level := "salary < 5000";
   end if;
   
   dbms_output.put_line(v_emp_name||","||v_emp_sal||","||v_emp_sal_level);
end;② CASE 表达式
    CASE selector
        WHEN expression1 THEN result1
        WHEN expression2 THEN result2
        WHEN expressionN THEN resultN
        [ ELSE resultN+1]
    END;例:
declare
     v_sal employees.salary%type;
     v_msg varchar2(50);
begin   
     select salary into v_sal
     from employees
     where employee_id = 150;
     
     --case 不能向下面这样用
     /*
     case v_sal when salary >= 10000 then v_msg := ">=10000"
                  when salary >= 5000 then v_msg := "5000<= salary < 10000"
                  else v_msg := "salary < 5000"
     end;
     */
 
     v_msg :=
           case trunc(v_sal / 5000)
                  when 0 then "salary < 5000"
                  when 1 then "5000<= salary < 10000"
                  else "salary >= 10000"
           end;
     
     dbms_output.put_line(v_sal ||","||v_msg);
end;③循环
1.  简单循环
    LOOP
        要执行的语句;
        EXIT WHEN<条件语句> ; /*条件满足,退出循环语句*/
    END LOOP;2.  WHILE 循环(相较1,推荐使用2)
    WHILE<布尔表达式> LOOP
        要执行的语句;
    END LOOP;
3.数字式循环
    FOR循环计数器IN[REVERSE ] 下限.. 上限LOOP
        要执行的语句;
    END LOOP;
每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。
跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。例:使用循环语句打印 1 - 100.(三种方式)1).  LOOP ... EXIT WHEN ... END LOOP
declare
     --初始化条件
     v_i number(3) := 1;
begin
     loop
     --循环体
        dbms_output.put_line(v_i);
 --循环条件
        exit when v_i = 100;
 --迭代条件
        v_i := v_i + 1;
     end loop;
end;2). WHILE ... LOOP ... END LOOP
declare
     --初始化条件
     v_i number(3) := 1;
begin
     --循环条件
     while v_i <= 100 loop
      --循环体
           dbms_output.put_line(v_i);
      --迭代条件
           v_i := v_i + 1;
     end loop;
end;3).
begin
     for i in 1 .. 100 loop
           dbms_output.put_line(i);
     end loop;
end;例: 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).declare
    v_i int := 2;
    v_j int := 2;
    v_flag boolean := false;
begin
    while v_i < 100 loop       
        v_j := 2;
        while  v_j<sqrt(v_i) loop
            if mod(v_i,v_j) = 0 then
             v_flag := true;
             exit;
            end if;
         v_j := v_j + 1;
        end loop;       
        if v_flag = false then
         dbms_output.put_line(v_i||",是素数");
        end if;     
        v_flag := false; 
        v_i := v_i +1;   
    end loop; 
end;④标号和GOTO
PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:
GOTO label;
. . .  . . .
<<label>> /*标号是用<<>>括起来的标识符*/例:打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
(方法一)
begin
  for i in 1..100 loop
      dbms_output.put_line(i);
      if(i = 50) then
          goto label;
      end if;
  end loop;
     
  <<label>>
  dbms_output.put_line("打印结束");end;
(方法二)
begin
  for i in 1..100 loop
      dbms_output.put_line(i);
      if(i mod 50 = 0) then
          dbms_output.put_line("打印结束");
          exit;
      end if;
  end loop;
end;Oracle--plsql复合数据类型 http://www.linuxidc.com/Linux/2012-03/57482.htm--------------------------------------分割线 --------------------------------------rlwrap - 解决Linux下SQLPLUS退格、上翻键乱码问题 http://www.linuxidc.com/Linux/2013-07/87890.htmSQLPLUS spool 到动态日志文件名 http://www.linuxidc.com/Linux/2013-03/80988.htmOracle SQLPLUS提示符设置 http://www.linuxidc.com/Linux/2012-10/73326.htm通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度 http://www.linuxidc.com/Linux/2011-07/38711.htmPL/SQL Developer实用技巧分享 http://www.linuxidc.com/Linux/2014-09/107391.htm--------------------------------------分割线 --------------------------------------更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址