Oracle PL/SQL异常处理

来源:互联网 发布:淘宝联盟做什么的 编辑:程序博客网 时间:2024/05/21 08:47
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,工资不增长。

declarev_job emp.job%type;v_empno emp.empno%type;v_sal emp.sal%type;beginv_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模块中。
这里写图片描述

declarev_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
优点:可用于任意列,不需要满足唯一性约束

//方案一declareexc_insert exception;v_dept dept%rowtype;v_deptcount number(4);beginv_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;/
//方案二declareexc_insert exception;v_dept dept%rowtype;v_deptcount number(4);beginv_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.关于用户自定义异常的使用

0 0
原创粉丝点击