oracle教程从入门到精通 下载本文

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;

精选