编写分页过程
介绍
分页是任何一个网站(bbs,网上商城,blog)都会使用到的技术,因此学习pl/sql编程开发就一定要掌握该技术。看图:
无返回值的存储过程
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程:
案例:现有一张表book,表结构如下:看图:
书号 书名 出版社
请写一个过程,可以向book表添加书,要求通过java程序调用该过程
--in:表示这是一个输入参数,不写in的话默认就为in
--out:表示一个输出参数
- create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
- begin
- insert into book values(spBookId,spbookName,sppublishHouse);
- end;
- /
--在java中调用
--在java中调用
//调用一个无返回值的过程
import java.sql.*;
public class Test2{
public static void main(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
//3.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
//4.给?赋值
cs.setInt(1,10);
cs.setString(2,"笑傲江湖");
cs.setString(3,"人民出版社");
//5.执行
cs.execute();
} catch(Exception e){
e.printStackTrace();
} finally{
//6.关闭各个打开的资源
cs.close();
ct.close();
}
}
}
执行,记录被加进去了
有返回值的存储过程(非列表)
再看如何处理有返回值的存储过程:
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
- --有输入和输出的存储过程
- create or replace procedure sp_pro8
- (spno in number, spName out varchar2) is
- begin
- select ename into spName from emp where empno=spno;
- end;
- /
- import java.sql.*;
- public class Test2{
- public static void main(String[] args){
- try{
- //1.加载驱动
- Class.forName("oracle.jdbc.driver.OracleDriver");
- //2.得到连接
- Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
- //3.创建CallableStatement
- /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
- //4.给?赋值
- cs.setInt(1,10);
- cs.setString(2,"笑傲江湖");
- cs.setString(3,"人民出版社");*/
- //看看如何调用有返回值的过程
- //创建CallableStatement
- /*CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
- //给第一个?赋值
- cs.setInt(1,7788);
- //给第二个?赋值
- cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //通过这个注册的值返回来
- //5.执行
- cs.execute();
- //取出返回值,要注意?的顺序
- String name=cs.getString(2);
- System.out.println("7788的名字"+name);
- } catch(Exception e){
- e.printStackTrace();
- } finally{
- //6.关闭各个打开的资源
- cs.close();
- ct.close();
- }
- }
- }
运行,成功得出结果。。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
- --有输入和输出的存储过程
- create or replace procedure sp_pro8
- (spno in number, spName out varchar2,spSal out number,spJob out varchar2) is
- begin
- select ename,sal,job into spName,spSal,spJob from emp where empno=spno;
- end;
- /
JAVA代码:
- import java.sql.*;
- public class Test2{
- public static void main(String[] args){
- try{
- //1.加载驱动
- Class.forName("oracle.jdbc.driver.OracleDriver");
- //2.得到连接
- Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
- //3.创建CallableStatement
- /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
- //4.给?赋值
- cs.setInt(1,10);
- cs.setString(2,"笑傲江湖");
- cs.setString(3,"人民出版社");*/
- //看看如何调用有返回值的过程
- //创建CallableStatement
- /*CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");
- //给第一个?赋值
- cs.setInt(1,7788);
- //给第二个?赋值
- cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
- //给第三个?赋值
- cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);
- //给第四个?赋值
- cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);
- //注意上面的那几个都应该给他们进行赋值,否则是会出错的
- //5.执行
- cs.execute();
- //取出返回值,要注意?的顺序
- String name=cs.getString(2);
- String job=cs.getString(4);
- System.out.println("7788的名字"+name+" 工作:"+job);
- } catch(Exception e){
- e.printStackTrace();
- } finally{
- //6.关闭各个打开的资源
- cs.close();
- ct.close();
- }
- }
- }
运行,成功找出记录
有返回值的存储过程(列表[结果集])
案例:编写一个过程,输入部门号,返回该部门所有雇员信息。
对该题分析如下:
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
返回结果集的过程
1.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
- create or replace package testpackage as //注意这里是as而不是is
- TYPE test_cursor is ref cursor;
- end testpackage;
2.建立存储过程。如下:
- create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
- begin
- open p_cursor for
- select * from emp where deptno = spNo;
- end sp_pro9;