20.PL/SQL分页
编写分页过程 介绍??
分页是任何一个网站(bbs,网上商城,blog)都会使用到的技术,因此学习pl/sql 编程开发就一定要掌握该技术。 无返回值的存储过程??
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单 到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存 储过程:
案例:现有一张表book,表结构如下: 书号 书名 出版社
请写一个过程,可以向book 表添加书,要求通过java 程序调用该过程。 --in:表示这是一个输入参数,默认为in --out:表示一个输出参数 Sql 代码
1. create or replace procedure sp_pro7(spBookId in number,spbookNa me in varchar2,sppublishHouse in varchar2) is 2. begin
3. insert into book values(spBookId,spbookName,sppublishHouse); 4. end; 5. /
--在java 中调用 Java 代码
1. //调用一个无返回值的过程 2. import java.sql.*; 3. public class Test2{
4. public static void main(String[] args){ 5.
6. try{
7. //1.加载驱动
8. Class.forName(\9. //2.得到连接
10. Connection ct = DriverManager.getConnection(\racle:thin@127.0.0.1:1521:MYORA1\11.
12. //3.创建CallableStatement
13. CallableStatement cs = ct.prepareCall(\7(?,?,?)}\14. //4.给?赋值
15. cs.setInt(1,10);
16. cs.setString(2,\笑傲江湖\17. cs.setString(3,\人民出版社\18. //5.执行
19. cs.execute();
20. } catch(Exception e){ 21. e.printStackTrace(); 22. } finally{
23. //6.关闭各个打开的资源 24. cs.close(); 25. ct.close(); 26. } 27. } 28.}
执行,记录被加进去了
有返回值的存储过程(非列表)??再看如何处理有返回值的存储过程:
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗 位。
Sql 代码
1. --有输入和输出的存储过程
2. create or replace procedure sp_pro8
3. (spno in number, spName out varchar2) is 4. begin
5. select ename into spName from emp where empno=spno; 6. end; 7. /
Java 代码
1. import java.sql.*; 2. public class Test2{
3. public static void main(String[] args){ 4.
5. try{
6. //1.加载驱动
7. Class.forName(\8. //2.得到连接
9. Connection ct = DriverManager.getConnection(\racle:thin@127.0.0.1:1521:MYORA1\10.
11. //3.创建CallableStatement
12. /*CallableStatement cs = ct.prepareCall(\ro7(?,?,?)}\13. //4.给?赋值
14. cs.setInt(1,10);
15. cs.setString(2,\笑傲江湖\16. cs.setString(3,\人民出版社\17.
18. //看看如何调用有返回值的过程 19. //创建CallableStatement
20. /*CallableStatement cs = ct.prepareCall(\ro8(?,?)}\21.
22. //给第一个?赋值 23. cs.setInt(1,7788); 24. //给第二个?赋值
25. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.V ARCHAR); 26.
27. //5.执行
28. cs.execute();
29. //取出返回值,要注意?的顺序 30. String name=cs.getString(2);
31. System.out.println(\的名字\32. } catch(Exception e){ 33. e.printStackTrace(); 34. } finally{
35. //6.关闭各个打开的资源 36. cs.close(); 37. ct.close(); 38. } 39. } 40.}
运行,成功得出结果。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗 位。
Sql 代码
1. --有输入和输出的存储过程
2. create or replace procedure sp_pro8
3. (spno in number, spName out varchar2,spSal out number,spJob out varchar2) is 4. begin
5. select ename,sal,job into spName,spSal,spJob from emp where empno=spno; 6. end; 7. /
Java 代码
1. import java.sql.*; 2. public class Test2{
3. public static void main(String[] args){ 4.
5. try{
6. //1.加载驱动
7. Class.forName(\8. //2.得到连接
9. Connection ct = DriverManager.getConnection(\racle:thin@127.0.0.1:1521:MYORA1\10.
11. //3.创建CallableStatement
12. /*CallableStatement cs = ct.prepareCall(\ro7(?,?,?)}\13. //4.给?赋值
14. cs.setInt(1,10);
15. cs.setString(2,\笑傲江湖\16. cs.setString(3,\人民出版社\17.
18. //看看如何调用有返回值的过程 19. //创建CallableStatement
20. /*CallableStatement cs = ct.prepareCall(\ro8(?,?,?,?)}\21.
22. //给第一个?赋值 23. cs.setInt(1,7788); 24. //给第二个?赋值
25. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.V ARCHAR);
26. //给第三个?赋值
27. cs.registerOutParameter(3,oracle.jdbc.OracleTypes.D OUBLE);
28. //给第四个?赋值
29. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.V ARCHAR); 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(\8. //2.得到连接
9. Connection ct = DriverManager.getConnection(\racle:thin@127.0.0.1:1521:MYORA1\10.
11. //看看如何调用有返回值的过程 12. //3.创建CallableStatement
13. /*CallableStatement cs = ct.prepareCall(\ro9(?,?)}\14.
15. //4.给第?赋值 16. cs.setInt(1,10);