1、练习使用游标,包括隐式游标、显式游标和游标FOR循环。
(1)在SCOTT模式下显示工资排名前5的员工的编号、姓名和工资,并将所有执行正确的PL/SQL语句记录下来。
①使用隐式游标。
set serveroutput on
declare
cursor emp_cursor is
select * from(select * from emp order by sal desc) where rownum<=5;
begin
for emp_row in emp_cursor
loop
dbms_output.put('员工编号 '||emp_row.empno||' ');
dbms_output.put('姓名 '||emp_row.ename||' ');
dbms_output.put('工资 '||emp_row.sal||' ');
end loop;
end;
/
没有结果,因为dbms_output.put只能在一行显示,不能回车,使用最后一行需要为dbms_output.put_line
set serveroutput on
declare
cursor emp_cursor is
select * from(select * from emp order by sal desc) where rownum<=5;
begin
for emp_row in emp_cursor
loop
dbms_output.put('员工编号 '||emp_row.empno||' ');
dbms_output.put('姓名 '||emp_row.ename||' ');
dbms_output.put_line('工资 '||emp_row.sal||' ');
end loop;
end;
/
②使用显式游标。
declare
cursor emp_cursor is
select * from(select * from emp order by sal desc) where rownum<=5;
v_emp emp%rowtype;
begin
open emp_cursor;
fetch emp_cursor into v_emp;
while emp_cursor%found loop
dbms_output.put('员工编号 '||v_emp.empno||' ');
dbms_output.put('姓名 '||v_emp.ename||' ');
dbms_output.put_line('工资 '||v_emp.sal||' ');
end loop;
close emp_cursor;
end;
/
③使用游标for循环
declare
cursor emp_cursor is select * from(select * from emp order by sal desc) where rownum<=5;
begin
for emp_row in emp_cursor
loop
dbms_output.put('员工编号 '||emp_row.empno||' ');
dbms_output.put('姓名 '||emp_row.ename||' ');
dbms_output.put_line('工资 '||emp_row.sal||' ');
end loop;
end;
/
2.预定义异常的应用:在SCOTT模式下,由员工编号(员工编号由用户任意输入)查找EMP表中的某一员工的姓名。若查找成功则显示该员工的姓名;若该员工编号不存在、则由教材P136表6-2中系统定义的异常NO_DATA_FOUND,输出用户自定义的错误信息“编号错误,没有找到相应的雇员!”;若发生其他类型的错误,则利用OTHERS子句捕获异常,显示自定义错误消息“发生其他错误”、出错码(SQLCODE)以及出错信息(SQLERRM)。
declare
v_no emp.empno%type:='&no';
v_name emp.ename%type;
begin
select ename into v_name from emp where empno=v_no;
dbms_output.put_line('员工姓名'||v_name);
exception
when no_data_found then
dbms_output.put_line('编号错误,没有找到相应的雇员!');
when others then
dbms_output.put_line('发生其他错误');
dbms_output.put_line('出错码<'||sqlcode||' > '||'出错信息'||sqlerrm);
end;
/
3.自定义异常的应用:自定义一个异常,在SCOTT模式下,如果查找到EMP表中的某一员工(员工编号由用户任意输入)的佣金(COMM字段)为0时,则显示自定义错误消息“该员工的佣金为0”。
declare
comm_0_found exception;
v_comm emp.comm%type;
v_no emp.empno%type:='&no';
begin
select comm into v_comm from emp where empno=v_no;
if v_comm=0 then
raise comm_0_found;
end if;
exception
when comm_0_found then
dbms_output.put_line('该员工的佣金为0');
end;
/