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.