PL/SQL语言流程控制操作指南

一、基本程序块

1.条件控制-if

-- 条件控制
if 条件表达式 then
  语句块
end if;

if 条件表达式 then
  语句块1
  else
    语句块2
end if;

示例

-- 判断员工是否有奖金,升薪政策
declare
  t_empno emp.empno%type;
  t_comm emp.comm%type;
begin
  t_empno := &eno;
  select comm into t_comm from emp where empno=t_empno;
  dbms_output.put_line('原来的奖金'||t_comm);
  if t_comm = '' or t_comm is null then
    update emp set comm = sal * 0.2 where empno=t_empno;
    elsif t_comm < 1000 then
      update emp set comm = 1000 where empno=t_empno;
    else
      update emp set comm = comm * 1.1 where empno=t_empno;
    end if;
  exception
    when no_data_found then
      dbms_output.put_line('员工编号为'||t_empno||'的员工不存在');
end;

2.条件控制-case

case 表达式
  when 条件表达式的结果 then
    待执行的语句块
  when 条件表达式的结果 then
    待执行的语句块
end case;

示例:

-- 输出员工的工资等级(1000以下为C,1000-2000为B,2000以上为A)

declare
   t_sal emp.sal%type;
begin
     select sal into t_sal from emp where empno=&emp;
     case when t_sal<1000 then
       dbms_output.put_line('C级');
     when t_sal<2000 and t_sal>=1000 then
       dbms_output.put_line('B级');
     when t_sal>=2000 then
       dbms_output.put_line('A级');
     end case;
end;

3. while循环

while 条件表达式 loop 语句段;
  exit when 条件表达式
end loop;

示例:

-- 打印出从deptno从1到3的部门名称
declare
   v_dname varchar2(10);
   v_i number(2):=1;
begin
   while v_i <=3 loop
     select dname into v_dname from (select dname from dept where deptno=v_i);
     dbms_output.put_line(v_dname);
     v_i := v_i + 1;
   end loop;
end;

4.for循环

for 循环变量 in [reverse] 初始值表达式..终止值表达式 loop
  语句段;
end loop;

示例:

-- 打印出从deptno从1到3的部门名称
declare
   v_dname dept.dname%type;
begin
   for v_i in 1..3 loop
     select dname into v_dname from (select dname from dept where deptno=v_i);
     dbms_output.put_line(v_dname);
   end loop;
end;

5.异常处理-exception

-- 自定义异常
declare
  no_updata exception;
  begin
    delete from dept where deptno=11;
    if sql%notfound then
      raise no_updata;
    end if;
    exception
      when no_updata then
        dbms_output.put_line('未找到待删除的数据');
  end;

二、代码练习

包含以上所有流程,部分进行调整,可直接复制粘贴,亲测可用

declare
 t_empno emp.empno%type;
 t_ename emp.ename%type;
 t_comm emp.comm%type;
 t_sal emp.sal%type;
 t_emp emp%rowtype;
 v_i number(10):=7500;
 no_updata exception;
begin
  -- while
  while v_i<8000 loop
    begin
      select ename,comm,sal into t_ename,t_comm,t_sal from (select ename,comm,sal from emp where empno=v_i);
      dbms_output.put_line(t_ename);
      exception
        when others then
          dbms_output.put_line('无数据');
    end;
    v_i:=v_i + 1;
  end loop;
  -- for
  for t_emp in (select * from emp) loop
    select ename,comm,sal into t_ename,t_comm,t_sal from (select ename,comm,sal from emp where empno=t_emp.empno);
    dbms_output.put(t_ename||'工资为:'||t_sal||'    ');
    -- if else 
    if t_comm = '' or t_comm is null then
      dbms_output.put(t_ename||'无奖金    ');
    else
      dbms_output.put(t_ename||'奖金为:'||t_comm||'    ');
    end if;
    -- case
    case when t_sal<1000 then
      dbms_output.put(t_ename||'的工资等级为C级    ');
    when t_sal<2000 and t_sal > 1000 then
      dbms_output.put(t_ename||'的工资等级为B级    ');
    when t_sal>=2000 then
      dbms_output.put(t_ename||'的工资等级为A级    ');
    end case;
    dbms_output.put_line('');
  end loop;
  -- exception
  delete from emp where empno=1;
    if sql%notfound then
      raise no_updata;
    end if;
    exception
      when no_updata then
        dbms_output.put_line('未找到待删除的数据');
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值