PL/SQL 第7章 编写控制结构

2012-5-22 22:33 休息
2012-5-22 23:06

7.1 条件分支语句
    条件分支语句用于依据特定情况选择要执行的操作。
    PL/SQL提供了三种条件分支语句:IF-THEN,IF-THEN-ELSE,IF-THEN-ELSIF
    语法如下:
    if condition then
       statements;
    [elsif condition then
       statements;]
    [else
       statements;]
    end if;

1.简单条件判断(用于执行单一条件判断)
declare
v_sal emp.sal%type;
begin
  select sal into v_sal from emp where lower(ename)=lower('&name');
  if v_sal<2000 then
     update emp set sal=v_sal+200
     where lower(ename)=lower('&name');
     end if;
end;
select * from emp where ename='SMITH'

2.二重条件分支(根据条件来选择两种可能性)
  语法:if..then..else...

declare
v_comm number(6,2);
begin
  select comm into v_comm from emp where empno=&no;
  if v_comm<>0 then
    update emp set comm=v_comm+100 where empno=&no;
    else
      update emp set comm=200 where empno=&no;
      end if;
      end;
     
      select * from emp where empno='7934'

3.多重条件分支(用于执行最复杂的条件分支操作)
  当使用多重条件分支时,如果满足第一个条件,则执行第一种操作;如果不满足第一个条件,则检查是否满足第二个条件,如果满足
第二个条件,则执行第二种操作;如果不满足第二个条件,则检查是否第三个条件,依此类推。如果所有条件都为false或null,那么

p/sql执行器会执行else后的操作。多重条件分支是使用if..then..elsif语句来完成的。


declare
v_job emp.job%type;
v_sal emp.sal%type;
begin
  select job,sal into v_job,v_sal
  from emp where empno=&no;
  if v_job='PRESIDENT' THEN
    UPDATE EMP SET sal=v_sal+1000 where empno=&no;
    elsif v_job='MANAGER' THEN
     update emp set sal=v_sal+500 where empno=&no;
     else
       update emp set sal=v_sal+200 where empno=&no;
       end if;
       end;

  select * from emp where empno='7788'


2.case语句

1.在CASE语句中使用单一选择符进行等值比较
  当使用CASE语句执行多重条件分支时,如果条件选择符完全相同,并且条件表达式为相等条件选择,那么可以选择单一条件选择符进

行等值比较。语法

case selector(条件选择符)
  when expression1(指定条件值的表达式) then 要执行的条件操作
  when expression2                     then
  else
end case;

如果设置的所有条件都不满足,则会执行else后的语句

例子:
declare
v_deptno emp.deptno%type;
begin
  v_deptno:=&no;
case v_deptno
    when 10 then
      update emp set comm=100 where deptno=v_deptno;
    when 20 then
        update emp set comm=80 where deptno=v_deptno;
    when 30 then
        update emp set comm=50 where deptno=v_deptno;
    else
          dbms_output.put_line('不存在该部门的编号');
end case;
end;


2.在case语句中使用多种条件比较
  如果包含有多种条件进行不等比较,那么必须在when子句中指定比较条件,语法如下:
  case
  when  search_condition1 then  当满足特定条件时要执行的操作
  when  search_condition2 then  当满足特定条件时要执行的操作
  else
  end case;
例子
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;
  case
    when v_sal<1000 then
      update emp set comm=100 where ename=v_ename;
      when v_sal<2000 then
        update emp set comm=80 where ename=v_ename;
       when v_sal<6000 then
        update emp set comm=50 where ename=v_ename; 
        end case;
        end;
     
     
     
select * from emp where ename='SCOTT'

2012-5-23 14:00
7.3循环语句(为了在编写的PL/SQL中重复执行一条语句或一组语句)

1.基本循环
  以LOOP开始,以END LOOP结束,其语法如下:
  LOOP
     statement1'
     ...
     exit [when condition];
  END LOOP;
  如上所示,当使用基本循环时,无论是否满足条件,语句至少会被执行一次。当Condition为true时,会退出循环,并执行END LOOP

后的相应操作。注意,当编写基本循环时,一定要包含EXIT语句,否则PL/SQL会陷入死循环;另外当使用基本循环时,大家还应该定义

循环控制变量,并且在循环体内修改循环控制变量的值。

实例
create table temp (cola int);
declare
i int:=1;
begin
  LOOP
    INSERT INTO temp VALUES (i);
    exit when i=5;
    i:=i+1;
    end LOOP;
    END;
   
    SELECT * FROM TEMP;

 

 
 
2.WHILE循环

  只有条件为true时,才会执行循环体内的语句。
  while循环以while..loop开始,以end loop结束。
  语法
  while condition loop
  statement1;
  statement2;
  end loop;
  如上所示,当condition为true时,PL/SQL执行器会执行循环体内的语句;否则会退出循环,并执行END LOOP后的语句。
注意,当编写WHILE循环时,应该定义循环控制变量,并且在循环体内修改循环控制变量的值。

declare
i int:=1;
begin
WHILE i<=10 LOOP
    INSERT INTO temp VALUES (i);
    i:=i+1;
    end LOOP;
    END;

3.FOR循环
  当使用基本循环或while循环时,需要定义循环控制变量,并且循环控制变量不仅可以使用number类型,也可以使用其他数据类型;

而当使用FOR循环时,Oracle会隐含定义循环控制变量。FOR循环的语法如下:
  FOR counter in [REVERSE]
  lower_bound..upper_bound LOOP
  statement1;
  statement2;
  ...
  end LOOP;
  如上所示,counter是循环控制变量,并且该变量由Oracle隐含定义,不需要显示定义;
  lower_bound和upper_bound分别对应于循环控制变量的下届值和上届值。默认情况下,当使用FOR循环时,每次循环时循环控制变量

会自动增一;如果指定REVERSE选项,那么每次循环时循环控制变量会自动减一。
实例:

begin
  for i in 1..10 loop
  insert into temp values (i);
  end loop;
  end;

4.嵌套循环和标号

  嵌套循环是指在一个循环语句之中嵌入另个循环语句,而标号则用于标记嵌套块或嵌套循环。通过在嵌套循环中使用标号,可以区分

内层循环和外层循环,并且可以在内层循环中直接退出外层循环。使用<<>>定义标号


declare
result int;
begin
<<outer>>
for i in 1..100 loop
<<inter>>
  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;

2012-05-23 22:17

7.4 顺序控制语句
  
1.GOTO
  GOTO语句用于跳转到特定标号处去执行语句。注意,GOTO语句会增加程序的复杂性,可读性变差。
  GOTO label_name;
  label_name是已经定义的标号名。注意,当使用GOTO跳转到特定标号时,标号后至少要包含一条可执行语句。

SQL>  declare
  2   i int:=1;
  3   begin
  4     loop
  5       insert into temp values (i);
  6       if(i=10) then
  7       goto end_loop;
  8       end if;
  9       i:=i+1;
 10       end loop;
 11       <<end_loop>>
 12  dbms_output.put_line('循环结束');
 13  end;
 14  /
循环结束


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;
     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值