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本文永久更新链接地址