case语句语法格式如下:
CASE <变量>
WHEN <表达式1> THEN 值1
WHEN <表达式2> THEN 值2 ……
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;