35. //显示一下,看看对不对
36. System.out.println(\
37. System.out.println(\总页数=\ 38.
39. while(rs.next()){
40. System.out.println(\编号:\1)+\名字:\2)+\工资:\6));
41. }
42. } catch(Exception e){
43. e.printStackTrace(); 44. } finally{
45. //6.关闭各个打开的资源 46. cs.close(); 47. ct.close(); 48. } 49. } 50.}
运行,控制台输出: rowNum=19 总页数:4
编号:7369 名字:SMITH 工资:2850.0 编号:7499 名字:ALLEN 工资:2450.0 编号:7521 名字:WARD 工资:1562.0 编号:7566 名字:JONES 工资:7200.0 编号:7654 名字:MARTIN 工资:1500.0
--新的需要,要求按照薪水从低到高排序,然后取出6-10 过程的执行部分做下改动,如下: Sql代码
1. begin
2. --执行部分
3. v_sql:='select * from (select t1.*, rownum rn from ect * from '||tableName||' order by sal) t1 where um<='||v_end||') where rn>='||v_begin;
重新执行一次procedure,java不用改变,运行,控制台输出: rowNum=19 总页数:4
精选
(selrown
编号:7900 名字:JAMES 工资:950.0 编号:7876 名字:ADAMS 工资:1100.0 编号:7521 名字:WARD 工资:1250.0 编号:7654 名字:MARTIN 工资:1250.0 编号:7934 名字:MILLER 工资:1300.0
二十一:例外处理
例外处理
例外的分类
oracle将例外分为预定义例外,非预定义例外和自定义例外三种。 预定义例外用于处理常见的oracle错误
非预定义例外用于处理预定义例外不能处理的例外 自定义例外用于处理与oracle错误无关的其它情况
例外传递
如果不处理例外我们看看会出现什么情况:
案例,编写一个过程,可接收雇员的编号,并显示该雇员的姓名。 问题是,如果输入的雇员编号不存在,怎样去处理呢? Sql代码
1. --例外案例 2. declare 3. --定义
4. v_ename emp.ename%type; 5. begin 6. --
7. select ename into v_ename from emp where empno=&gno;
8. dbms_output.put_line('名字:'||v_ename) 9. /
执行,弹出框,看图:
随便输个不存在的编号,回车,会抛出异常,显示:
精选
ORA-01403: 未找到数据 ORA-06512: 在line 6 Sql代码
1. declare 2. --定义
3. v_ename emp.ename%type; 4. begin 5. --
6. select ename into v_ename from emp where empno=&gno;
7. dbms_output.put_line('名字:'||v_ename) 8. exception
9. when no_data_found then
10. dbms_output.put_line('编号没有!'); 11./
执行,输入一个不存在的编号,回车,显示: 编号没有!
处理预定义例外
预定义例外是由pl/sql所提供的系统例外。当pl/sql应用程序违反了oracle 规定的限制时,则会隐含的触发一个内部例外。pl/sql为开发人员提供了二十多个预定义例外。我们给大家介绍常用的例外。
预定义例外 case_not_found
在开发pl/sql块中编写case语句时,如果在when子句中没有包含必须的条件分支,就会触发case_not_found的例外: Sql代码
1. create or replace procedure sp_pro6(spno number) is 2. v_sal emp.sal%type; 3. begin
4. select sal into v_sal from emp where empno = spno;
5. case
6. when v_sal < 1000 then
7. update emp set sal = sal + 100 where empno = spno;
8. when v_sal < 2000 then
9. update emp set sal = sal + 200 where empno = spno; 10. end case; 11.exception
精选
12. when case_not_found then
13. dbms_output.put_line('case语句没有与' || v_sal || '相匹配的条件'); 14.end;
预定义例外 cursor_already_open
当重新打开已经打开的游标时,会隐含的触发例外cursor_already_open Sql代码
1. declare
2. cursor emp_cursor is select ename, sal from emp;
3. begin
4. open emp_cursor;
5. for emp_record1 in emp_cursor loop
6. dbms_output.put_line(emp_record1.ename); 7. end loop; 8. exception
9. when cursor_already_open then
10. dbms_output.put_line('游标已经打开'); 11.end; 12./
预定义例外 dup_val_on_index
在唯一索引所对应的列上插入重复的值时,会隐含的触发例外dup_val_on_index例外 Sql代码
1. begin
2. insert into dept values (10, '公关部', '北京'); 3. exception
4. when dup_val_on_index then
5. dbms_output.put_line('在deptno列上不能出现重复值'); 6. end;
预定义例外 invalid_cursor
当试图在不合法的游标上执行操作时,会触发该例外
例如:试图从没有打开的游标提取数据,或是关闭没有打开的游标。则会触发该例外
Sql代码
精选
1. declare
2. cursor emp_cursor is select ename, sal from emp;
3. emp_record emp_cursor%rowtype; 4. begin
5. --open emp_cursor; --打开游标
6. fetch emp_cursor into emp_record; 7. dbms_output.put_line(emp_record.ename); 8. close emp_cursor; 9. exception
10. when invalid_cursor then
11. dbms_output.put_line('请检测游标是否打开'); 12.end;
预定义例外 invalid_number
当输入的数据有误时,会触发该例外
比如:数字100写成了loo就会触发该例外 Sql代码
1. begin
2. update emp set sal= sal + 'loo'; 3. exception
4. when invalid_number then
5. dbms_output.put_line('输入的数字不正确'); 6. end;
预定义例外 no_data_found
下面是一个pl/sql块,当执行select into 没有返回行,就会触发该例外 Sql代码
1. declare
2. v_sal emp.sal%type; 3. begin
4. select sal into v_sal from emp 5. when ename='&name'; 6. exception
7. when no_data_found then
8. dbms_output.put_line('不存在该员工'); 9. end;
精选