有了上面的基础,相信大家可以完成分页存储过程了,要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页、排序字段(deptno降序)。返回总记录数,总页数和返回结果集。
把一个字符串,当作sql语句执行,并把查询得到到结果赋给某个变量,语法如下:
execute immediate v_sql into myrows;
--1.建包,使用游标类型
create or replace package pack1 is
type my_cursor is ref cursor;
end;
--2.编写过程
create or replace procedure fenyepro(
v_in_table in varchar2,v_in_pagesize in number,v_in_pagenow in number,
v_out_result out pack1.my_cursor) is
--定义变量
v_sql varchar2(2000);
v_start number;
v_end number;
begin
--指向代码
--计算V_start和v_end是多少
v_start:=v_in_pagesize*(v_in_pagenow-1)+1;
v_end:=v_in_pagesize*v_in_pagenow;
v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '
||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start;
--打开游标,让游标指向结果集
open v_out_result for v_sql;
end;
在java中调用
package com.lsz.test;
import java.sql.*;
public class TestProcedure2 {
public static void main(String[] args) {
Connection ct=null;
CallableStatement cs=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
cs=ct.prepareCall("{call fenyepro(?,?,?,?)}");
cs.setString(1, "emp");
cs.setInt(2, 6);
cs.setInt(3,2);
//给第四个问好注册
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
//这里是关键
rs=(ResultSet)cs.getObject(4);
while(rs.next()){
System.out.println(rs.getString("ename")+" "+rs.getString("sal"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
}
n 对分页过程进行扩展,目的是让分页过程更加灵活,更加实用
要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页,返回的结果集,返回共有多少页,返回共有多少条记录。
create or replace procedure fenyepro2(
v_in_table in varchar2,v_in_pagesize in number,v_in_pagenow in number,
v_out_result out pack1.my_cursor,
v_out_rows out number,
v_out_pagecount out number) is
--定义变量
v_sql varchar2(2000);
v_start number;
v_end number;
begin
--指向代码
--计算V_start和v_end是多少
v_start:=v_in_pagesize*(v_in_pagenow-1)+1;
v_end:=v_in_pagesize*v_in_pagenow;
v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '
||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start;
--打开游标,让游标指向结果集
open v_out_result for v_sql;
--查询共有多少条计算
select count(*) into v_out_rows from emp;
if mod(v_out_rows,v_in_pagesize)=0 then
v_out_pagecount:=v_out_rows/v_in_pagesize;
else
v_out_pagecount:=v_out_rows/v_in_pagesize+1;
end if;
end;
在java中调用
package com.lsz.test;
import java.sql.*;
public class TestProcedure2 {
public static void main(String[] args) {
Connection ct=null;
CallableStatement cs=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
cs=ct.prepareCall("{call fenyepro2(?,?,?,?,?,?)}");
cs.setString(1, "emp");
cs.setInt(2, 6);
cs.setInt(3,2);
//给第四个问号注册
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR);
//给第五个问号注册
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
//给第六个问号注册
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.INTEGER);
cs.execute();
//这里是关键
rs=(ResultSet)cs.getObject(4);
while(rs.next()){
System.out.println(rs.getString("ename")+" "+rs.getString("sal"));
}
//取出记录数
int rowCount=cs.getInt(5);
System.out.println("记录总数是:"+rowCount);
int pageCount=cs.getInt(6);
System.out.println("总页数是:"+pageCount);
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
}
n 分页过程练习——课堂练习
提示:做一个基于oracle的雇员管理系统
具体完成的功能如下:
查看所有雇员的成绩——VIEW(查看要使用过程来完成,当用户输入view后提示用户输入查看第几页,每页显示几条记录,排序关键列)
按照雇员ID号码查询学生成绩——view of
添加一个雇员——add
按照id更改一个雇员的信息——change
按照id去删除一个雇员——remove
退出系统——exit