PL/SQL编程练习&显式游标&隐式游标&游标循环&自定义异常&预约义异常

一、练习使用游标,包括隐式游标、显式游标和游标FOR循环

(1)在SCOTT模式下显示工资排名前5的员工的编号、姓名和工资,并将全部执行正确的PL/SQL语句记录下来。

①使用隐式游标

记得先将显示输出打开 set serveroutput onweb

declare
	v_emp emp%rowtype;
	v_num int:=0;--用来控制输出,只输出5条
	
begin
	for  r in (select *  from emp order by sal desc)--这是隐式游标的用法,里面运用order by desc降序,asc升序
loop
	dbms_output.put_line(r.empno||' '||r.ename||' '||r.sal);
	v_num:=v_num+1;
exit when v_num=5;--到达5条结束循环
end loop;
end;

在这里插入图片描述

②使用显式游标

declare
	v_emp emp%rowtype;
	v_num int:=0;
	Cursor r is select *  from emp order by sal desc;--定义游标
begin
	open r;--打开游标
	fetch r into v_emp;--取数据
while r%found--若是结果集有数据,进入循环
loop
	dbms_output.put_line(v_emp.empno||' '||v_emp.ename||' '||v_emp.sal);
	fetch r into v_emp;--更新数据
	v_num:=v_num+1;
	exit when v_num=5;
end loop;
	
end;

在这里插入图片描述

③使用游标for循环

declare
	v_emp emp%rowtype;
	v_num int:=0;
	Cursor rs is select *  from emp order by sal desc;
begin
	for  r in rs--游标跟for循环结合,自动打开游标,取数据,更新数据,关闭游标
loop
	dbms_output.put_line(r.empno||' '||r.ename||' '||r.sal);
	v_num:=v_num+1;
exit when v_num=5;
end loop;
end;

在这里插入图片描述

2.预约义异常的应用

在SCOTT模式下,由员工编号(员工编号由用户任意输入)查找EMP表中的某一员工的姓名。若查找成功则显示该员工的姓名;若该员工编号不存在、则由教材P136表6-2中系统定义的异常NO_DATA_FOUND,输出用户自定义的错误信息“编号错误,没有找到相应的雇员!”;若发生其余类型的错误,则利用OTHERS子句捕获异常,显示自定义错误消息“发生其余错误”、出错码(SQLCODE)以及出错信息(SQLERRM)。

declare
	v_empno emp.empno%type;
	v_ename emp.ename%type;	
begin
	v_empno:=#--由键盘输入编号
	select ename into v_ename from emp where empno=v_empno;--取得数据
	dbms_output.put_line(v_ename);--打印数据
exception --若是出现异常则执行
	when NO_DATA_FOUND then --执行定义的异常
	dbms_output.put_line('编号错误,没有找到相应的雇员!');
	when others then --出现其余异常执行
	dbms_output.put_line('发生其余错误'||' '||SQLCODE||' '||SQLERRM);
	
end;

在这里插入图片描述
在这里插入图片描述

3.自定义异常的应用

自定义一个异常,在SCOTT模式下,若是查找到EMP表中的某一员工(员工编号由用户任意输入)的佣金(COMM字段)为0时,则显示自定义错误消息“该员工的佣金为0”。

declare
	v_empno emp.empno%type;
	v_comm emp.comm%type;
	v_error exception;--定义异常
	
begin
	v_empno:=#--键盘输入数据
	select comm into v_comm from emp where empno=v_empno;--获得数据
	if v_comm=0 then--若是为0 异常生效
	raise v_error;
end if;
exception 
	when v_error then --执行自定义的异常
	dbms_output.put_line('该员工的佣金为0');
	
end;

在这里插入图片描述