--IF语法
IF condition THEN
  statements;
[ELSIF condition THEN
  statements;]
[ELSE
  statements;]
END IF;

--CASE 语法

1、在 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;

2、在 CASE 语句中使用多种条件比较

CASE
  WHEN search_condition1 THEN sequence_of_statements1;
  WHEN search_condition2 THEN sequence_of_statements2;
  ...
  WHEN search_conditionN THEN sequence_of_statementsN;
  [ELSE sequence_of_statementsN+1;]
END CASE;

--循环

1、基本循环 LOOP

LOOP
  statement1;
  ...
  EXIT [WHEN condition];
END LOOP;

2、WHILE 循环

WHILE condition LOOP
  statement1;
  statement2;
  ...
END LOOP;

3、FOR 循环

FOR counter in [REVERSE]
lower_bound..upper_bound LOOP
  statement1;
  statement2;
  ...
END LOOP;

4、嵌套循环和标号

嵌套循环是指在一个循环语句之中嵌入另一个循环语句,而标号(Label)则用于标记嵌套块或嵌套循环。通过在嵌套循环中使用标号,可以区分内层循环和外层循环,并且可以在内层循环中直接退出外层循环。在编写 PL/SQL 块时,可以使用<<label_name>>定义标号。

declare
  result int;
begin
<>
  for i in 1..100 loop
  <>
  for j in 1..100 loop
  result:=i*j;
  exit outer when result=1000;
  exit when result=500;
  end loop inner;
  dbms_output.put_line(result);
  end loop outer;
  dbms_output.put_line(result);
end;
/

如上所示,当执行 PL/SQL 块时,如果 result=1000,那么会直接退出外层循环,而当 result=500 时只会退出内层循环。

--顺序控制语句 GOTO 、NULL

PL/SQL 不仅提供了条件分支语句和循环控制语句,而且还提供了顺序控制语句 GOTO 和 NULL。但与 IF,CASE 和 LOOP 语句不同,GOTO 语句和 NULL 语句,一般情况下不要用。

1、GOTO

GOTO 语句用于跳转到特定标号处去执行语句。注意,以为使用 GOTO 语句会增加程序的复杂性,并且使得应用程序可读性差,所以开发应用程序时,一般都建议用户不要使用 GOTO 语句。

其语法如下:

GOTO label_name;

其中,label_name 是已经定义的标号名。注意,当使用 GOTO 跳转到特定标号时,标号后至少要包含一条可执行语句。示例如下:

declare
  i int:=1;
begin
  loop
  insert into temp values(i);
  if i=10 then
    goto end_loop;
  end if;
  i:=i+1;
  end loop;
<<end_loop>>
  dbms_output.put_line('循环结束');
end;
/

如上所示,在执行以上 PL/SQL 块时,如果 i=10,则会跳转到标号 end_loop,并执行随后的语句。

2、NULL

NULL语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用 NULL 语句的主要好处是可以提高 PL/SQL 程序的可读性,示例如下:

declare
  v_sal emp.sal%type;
  v_ename emp.ename%type;
begin
  select ename,sal into v_ename,v_sal from emp where empno='&no';
  if v_sal<3000 then
    update emp set comm=sal*0.1 where ename=v_ename;
  else
    null;
  end if;
end;
/

当执行以上 PL/SQL 块时,会根据输入的雇员号确定雇员名及其工资;如果雇员工资低于3000,则将其补助设置为工资的10%;如果雇员的工资高于3000,则不会执行任何操作(NULL)。

--示例

declare
  cj xkb.chengji%type;
  state varchar2(4);
begin
  select chengji into cj from xkb
  where stuid=101 and kcid=1001;
  if cj between 90 and 100 then                         --if语句
    state:='优秀';
  elsif cj between 70 and 89 then
    state:='良好'; 
  elsif cj between 60 and 69 then
    state:='及格';
  else
    state:='差';
  end if;
  dbms_output.put_line('分数是:'||cj);
  dbms_output.put_line('等级是:'||state);
end;

select stuname,sex,
       case sex                                         --case 值的比较
         when 'm' then '男'
         when 'f' then '女'
         else '默认值'
       end "性别"
from stu

IKKI@ test10g> declare
  2  v_deptno emp.deptno%type;
  3  begin
  4    v_deptno:='&no';
  5    case v_deptno
  6    when 10 then
  7      update emp set comm=100 where deptno=v_deptno;
  8    when 20 then
  9      update emp set comm=80 where deptno=v_deptno;
 10    when 30 then
 11      update emp set comm=50 where deptno=v_deptno;
 12    else
 13      dbms_output.put_line('not found');
 14    end case;
 15  end;
 16  /
Enter value for no: 10
old   4:   v_deptno:='&no';
new   4:   v_deptno:='10';

PL/SQL procedure successfully completed.

select stuname,sex,                                    --decode 值的比较(不能条件判断)
       decode(sex,
         'm','男',
         'f','女',
         '默认值') "性别"
from stu

select stuid,kcid,
       case                                             --case 条件判断
         when chengji between 90 and 100 then '优秀'
         when chengji between 70 and 89 then '良好'
         when chengji between 60 and 69 then '及格'
         else '差'
       end  state 
from xkb

IKKI@ test10g> declare
  2  v_sal emp.sal%type;
  3  v_ename emp.ename%type;
  4  begin
  5    select ename,sal into v_ename,v_sal
  6    from emp where empno='&no';
  7    case
  8    when v_sal<1000 then
  9      update emp set comm=100 where ename=v_ename;
 10    when v_sal<2000 then
 11      update emp set comm=80 where ename=v_ename;
 12    when v_sal<6000 then
 13      update emp set comm=50 where ename=v_ename;
 14    end case;
 15  end;
 16  /
Enter value for no: 7788
old   6:   from emp where empno='&no';
new   6:   from emp where empno='7788';

PL/SQL procedure successfully completed.

declare
  m int:=0;
  n int:=1;
begin
  loop                                 --loop循环
    m:=m+n;
    n:=n+1;
    exit when n=101;
   end loop;
   dbms_output.put_line('m is :'||m);
end;

declare
  m int:=0;
  n int:=1;
begin
  while n<=100                         --while循环
  loop
    m:=m+n;
    n:=n+1;
  end loop;
   dbms_output.put_line('m is :'||m);
end;

declare
  m int:=0;
  n int;
begin
  for n in 1..100                      --for循环
  loop
    m:=m+n;
  end loop;
   dbms_output.put_line('m is :'||m);
end;

PL/SQL 03 流程控制的更多相关文章

  1. PL/SQL之--流程控制语句

    一.简介 像编程语言一样,oracle PL/SQL也有自己的流程控制语句.通过流程控制语句,我们可以在PL/SQL中实现一下比较复杂的业务逻辑操作.而无需到程序中去控制,在一定程度上提高了效率,这也 ...

  2. JavaSE学习笔记03流程控制

    Java流程控制 1.顺序结构 java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句往下执行. 顺序结构是最简单的算法结构,它是任何一个算法都离不开的一种基本算法结构. 2. 选择结构 ...

  3. SQL Server 流程控制

    流程控制语句: BEGIN ... END WAITFOR GOTO WHILE IF ... ELSE BREAK RETURN CONTINURE   1.BEGIN ... END BEGIN ...

  4. C语言-03流程控制

    1.选择结构 char c = '+'; ; ; // 如果要在case后面定义新的变量,必须用大括号{}包住 注意变量的作用域的紊乱 if语句不加括号时,也要注意此问题 switch (c) { c ...

  5. PL/SQL程序设计、流程控制

    PL/SQL是 Procedure Language & Structured Query Language 的缩写 PL/SQL是对SQL语言存储过程语言的扩展 PL/SQL程序由三个块组成 ...

  6. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  7. PL/SQL流程控制语句

    PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...

  8. oracle数据库之PL/SQL 流程控制语句

    介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...

  9. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

随机推荐

  1. BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图

    Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...

  2. Week1 Team Homework #1 from Z.XML-总结学长经验教训

    谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...

  3. 基于twemproxy和vip实现redis集群的无感知弹性扩容

    目标是实现redis集群的无感知弹性扩容 关键点 1.是无感知,即对redis集群的用户来说服务ip和port保持不变 2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量. 1.业务场景 ...

  4. C语言循环结构作业总结

    循环作业总结 1.1 基本要求 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 博客作业不规范,没有Markdown语法 - 扣分 泛泛而谈(最多七分) 1.2 ...

  5. tar 加密压缩和解密解压

    加密压缩 tar -czvf - file | openssl des3 -salt -k password -out /path/to/file.tar.gz 解密解压 openssl des3 - ...

  6. 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交 ...

  7. 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 LCT

    题目描述 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如 ...

  8. 颜色采集器colpick Color Picker

    简单 RGB.HSB.十六进制颜色选取器 jQuery 插件. 非常直观类似 Photoshop 的界面. 光明和黑暗很容易自定义 CSS3 外观. 28 KB 总由浏览器加载看起来不错甚至在 IE7 ...

  9. dp类模板

    1.n串最长公共子序列 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...

  10. 你试过不用if写代码吗?

    我在教新手编程时,喜欢给他们一些小小的挑战,比如:不使用if语句(或者三元运算符.switch语句等)解决一些编程问题.这样做有什么意义吗?事实上,它可以迫使你从不同的角度寻找解决方法,也许可以找到更 ...