Oracle PL/SQL异常处理

case语句语法格式如下:

CASE <变量> 
  WHEN <表达式1> THEN1   
  WHEN <表达式2> THEN2   …… 
  WHEN <表达式n> THEN 值n  
  ELSE 值n + 1 
END;

1、使用case语句写一个pl/sql块,要求输入员工编号,根据员工的职位进行工资提升,提升要求如下:
如果职位是CLERK,工资增长5%,
如果职位是SALESMAN,工资增长8%,
如果职位是MANAGER,工资增长10%,
如果职位是ANALYST,工资增长20%,
如果职位是PRESIDENT,工资不增长。

declare
v_job emp.job%type;
v_empno emp.empno%type;
v_sal emp.sal%type;
begin
v_empno := &员工编号;
select job,sal into v_job,v_sal from emp where empno = v_empno;
case v_job
   when 'CLERK' then
           v_sal := v_sal * 1.05;
   when 'SALESMAN' then
           v_sal := v_sal * 1.08;
   when 'MANAGER' then
           v_sal := v_sal * 1.1;
   when 'ANALYST' then
           v_sal := v_sal * 1.2;
   when 'PRESIDENT' then
           v_sal := v_sal;
   else
           dbms_output.put_line('others'||v_sal);
end case;
update emp set sal=v_sal where empno = v_empno;
dbms_output.put_line('sal='||v_sal);
end;

异常实验:
2、处理异常—-找不到数据
我们要写一个pl/sql块,功能就是由键盘输入员工编号,输出员工姓名。
如果员工编号输入有误,那么就会找不到数据。如下图所示,输入7788,输出员工姓名,输入9999,没有该员工,输出查无此人。
思路:先写一个没有exception模块的plsql块,输入一个不存在的员工编号,看看会有什么错误提示。然后把这个错误提示对应的错误代码加入到exception模块中。
这里写图片描述

declare
v_emp emp%rowtype; 
v_empno emp.empno%type;
begin 
v_empno := &员工编号;
select * into v_emp from emp where empno = v_empno;
dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
exception
    when no_data_found then
        dbms_output.put_line('不存在此项数据') ;
end;
/

3、定义一个pl/sql块为dept表增加部门信息
比如:键盘输入一个部门信息,要么异常要么正常插入到dept表。
60,defence,shanghai

如果插入的部门在dept里有,要引发异常,异常部分输出“该部门已有”
如果插入的部门在dept里没有,正常插入这一行信息,并显示“部门信息已经插入”

方案一:
利用系统提供的主键约束异常,仅用于存在唯一性约束的表
试图破坏一个唯一性约束异常 dup_val_on_index

方案二:
1.用户自定义异常,判断该表中是否已存在该项数据
2.Insert
优点:可用于任意列,不需要满足唯一性约束

//方案一
declare
exc_insert exception;
v_dept dept%rowtype;
v_deptcount number(4);
begin
v_dept.deptno := upper('&部门编号');
v_dept.dname := upper('&部门名称');
v_dept.loc := upper('&部门职位');
select count(*) into v_deptcount from emp;
insert into dept values(v_dept.deptno,v_dept.dname,v_dept.loc);
dbms_output.put_line('部门信息已经插入');
exception
   when dup_val_on_index then
           dbms_output.put_line('该项已存在,不可插入');
end;
/
//方案二
declare
exc_insert exception;
v_dept dept%rowtype;
v_deptcount number(4);
begin
v_dept.deptno := &部门编号;
v_dept.dname := &部门名称;
v_dept.loc := &部门职位;
select count(*) into v_deptcount from emp;
select count(*) v_deptcount into  from dept where deptno = v_dept.deptno;
if v_deptcount = 0 then
   reise exc_insert;
end if;
exception
   when exc_insert then
   dbms_output.put_line('erros');
end;

实验注意:

1.关于case语句的使用
2.关于用户输入适配upper('&部门编号');
3.关于用户自定义异常的使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值