1、练习使用游标,包括隐士游标、显式游标和游标FOR循环。
(1)在SCOTT模式下显示工资排名前5的员工的编号、姓名和工资,并将所有执行正确的PL/SQL语句记录下来。
①使用隐士游标。
②使用显式游标。
SQL> set serveroutput on
SQL> declare
2 cursor emp_cursor is select empno,ename,sal from emp order by sal desc;
3 type employee is record(
4 id emp.empno%type,
5 name emp.ename%type,
6 v_sal emp.sal%type);
7 emp_row employee;
8 i number:=0;
9 begin
10 open emp_cursor;
11 fetch emp_cursor into emp_row;
12 while i<5
13 loop
14 dbms_output.put_line('编号:'||emp_row.id||' 姓名:'||emp_row.name||'工资:'||emp_row.v_sal);
15 i:=i+1;
16 fetch emp_cursor into emp_row;
17 end loop;
18 close emp_cursor;
19 end;
20 /
③使用游标for循环
SQL> set serveroutput on
SQL> declare
2 cursor emp_cursor is select empno,ename,sal from emp order by sal desc;
3 i number:=0;
4 begin
5 for r in emp_cursor loop
6 if i<5 then
7 dbms_output.put_line('编号:'||r.empno||' 姓名:'||r.ename||'工资:'||r.sal);
8 i:=i+1;
9 end if;
10 end loop;
11 end;
12 /
2.预定义异常的应用:在SCOTT模式下,由员工编号(员工编号由用户任意输入)查找EMP表中的某一员工的姓名。若查找成功则显示该员工的姓名;若该员工编号不存在、则由教材P136表6-2中系统定义的异常NO_DATA_FOUND,输出用户自定义的错误信息“编号错误,没有找到相应的雇员!”;若发生其他类型的错误,则利用OTHERS子句捕获异常,显示自定义错误消息“发生其他错误”、出错码(SQLCODE)以及出错信息(SQLERRM)。
SQL> set serveroutput on
SQL> declare
2 sal_err exception;
3 v_sal emp.sal%type;
4 i number:=&i;
5 begin
6 select sal into v_sal from emp where empno=i;
7 if v_sal=0 then
8 raise sal_err;
9 end if;
10 exception
11 when sal_err then
12 dbms_output.put_line(
13 '佣金为0,数据错误');
14 end;
15 /