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

21.

22. //给第一个?赋值 23. cs.setInt(1,7788); 24. //给第二个?赋值

25. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);

26. //给第三个?赋值

27. cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);

28. //给第四个?赋值

29. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR); 30.

31. //5.执行

32. cs.execute();

33. //取出返回值,要注意?的顺序 34. String name=cs.getString(2); 35. String job=cs.getString(4); 36. System.out.println(\的名字\工作:\ 37. } catch(Exception e){

38. e.printStackTrace(); 39. } finally{

40. //6.关闭各个打开的资源 41. cs.close(); 42. ct.close(); 43. } 44. } 45.}

运行,成功找出记录

有返回值的存储过程(列表[结果集])

案例:编写一个过程,输入部门号,返回该部门所有雇员信息。 对该题分析如下:

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分: 返回结果集的过程

1.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下: Sql代码

1. create or replace package testpackage as 2. TYPE test_cursor is ref cursor;

3. end testpackage;

2.建立存储过程。如下: Sql代码

1. create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is 2. begin

3. open p_cursor for

4. select * from emp where deptno = spNo; 5. end sp_pro9;

3.如何在java程序中调用该过程 Java代码

1. import java.sql.*; 2. public class Test2{

3. public static void main(String[] args){ 4. 5. try{

6. //1.加载驱动

7. Class.forName(\eDriver\

8. //2.得到连接

9. Connection ct = DriverManager.getConnection(\); 10.

11. //看看如何调用有返回值的过程 12. //3.创建CallableStatement

13. /*CallableStatement cs = ct.prepareCall(\sp_pro9(?,?)}\ 14.

15. //4.给第?赋值 16. cs.setInt(1,10); 17. //给第二个?赋值

18. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR); 19.

20. //5.执行

21. cs.execute(); 22. //得到结果集

23. ResultSet rs=(ResultSet)cs.getObject(2);

24. while(rs.next()){

25. System.out.println(rs.getInt(1)+\\2));

26. }

27. } catch(Exception e){

28. e.printStackTrace(); 29. } finally{

30. //6.关闭各个打开的资源 31. cs.close(); 32. ct.close(); 33. } 34. } 35.}

运行,成功得出部门号是10的所有用户

编写分页过程

有了上面的基础,相信大家可以完成分页存储过程了。

要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。

如果大家忘了oracle中如何分页,请参考第三天的内容。 先自己完成,老师在后面给出答案,并讲解。

--oracle的分页 Sql代码

1. select t1.*, rownum rn from (select * from emp) t1 where rownum<=10;

2. --在分页时,大家可以把下面的sql语句当做一个模板使用 3. select * from

4. (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10) 5. where rn>=6;

--开发一个包

--建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下: Sql代码

1. create or replace package testpackage as 2. TYPE test_cursor is ref cursor; 3. end testpackage;

4. --开始编写分页的过程

5. create or replace procedure fenye 6. (tableName in varchar2,

7. Pagesize in number,--一页显示记录数 8. pageNow in number,

9. myrows out number,--总记录数 10. myPageCount out number,--总页数

11. p_cursor out testpackage.test_cursor--返回的记录集

12. ) is 13.--定义部分

14.--定义sql语句 字符串 15.v_sql varchar2(1000); 16.--定义两个整数

17.v_begin number:=(pageNow-1)*Pagesize+1; 18.v_end number:=pageNow*Pagesize; 19.begin

20.--执行部分

21.v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin; 22.--把游标和sql关联

23.open p_cursor for v_sql; 24.--计算myrows和myPageCount 25.--组织一个sql语句

26.v_sql:='select count(*) from '||tableName; 27.--执行sql,并把返回的值,赋给myrows; 28.execute inmediate v_sql into myrows; 29.--计算myPageCount

30.--if myrows%Pagesize=0 then这样写是错的 31.if mod(myrows,Pagesize)=0 then 32. myPageCount:=myrows/Pagesize; 33.else

34. myPageCount:=myrows/Pagesize+1 35.end if; 36.--关闭游标

37.close p_cursor; 38.end; 39./

--使用java测试 //测试分页 Java代码

1. import java.sql.*; 2. public class FenYe{

3. public static void main(String[] args){ 4. 5. try{

6. //1.加载驱动

7. Class.forName(\eDriver\

8. //2.得到连接

9. Connection ct = DriverManager.getConnection(\); 10.

11. //3.创建CallableStatement

12. CallableStatement cs = ct.prepareCall(\fenye(?,?,?,?,?,?)}\ 13.

14. //4.给第?赋值

15. cs.seString(1,\ 16. cs.setInt(2,5); 17. cs.setInt(3,2); 18.

19. //注册总记录数

20. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);

21. //注册总页数

22. cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);

23. //注册返回的结果集

24. cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR); 25.

26. //5.执行

27. cs.execute(); 28.

29. //取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的

30. int rowNum=cs.getInt(4); 31.

32. int pageCount = cs.getInt(5);

33. ResultSet rs=(ResultSet)cs.getObject(6); 34.