关闭

oracle中pl/sql编程(五)

标签: cursororacleplsqlsql数据库
313人阅读 评论(0) 收藏 举报
分类:
oracle中pl/sql编程(六):


重点:编写分页过程:


要求,请大家编写一个存储过程,要求可以输入表名,每页显示记录数,当前页,
返回总记录数,总页数,和返回的结果集,并且要求返回的结果集按sal从小到大
进行排序;



下面给出具体的过程:


pl/sql编写存储过程(代码如下):


--案例:实现分页功能


--因为要用到游标,所以首先创建一个包


create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;




--包创建好了,现在就开始编写存储过程


create or replace procedure fenye(
tableName in varchar2,--表名
PageSizes in number,--每一页的记录数
pageNow in number,--当前页
myrows out number,--总记录数
mypageCount out number,--总页数
p_cursor out testpackage.test_cursor) is


--定义部分 :定义sql语句(总的sql太长,这里是字符串)
v_sql varchar2(1000);
--再定义两个整数用来代表开始页和最后结束页
v_begin number:=(pageNow-1)*PageSizes+1;
v_end number:=pageNow*PageSizes;
--执行部分
begin
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||' order by sal)
t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和sql语句关联起来
open p_cursor for v_sql;
--计算总页数和总记录数
--组织一个sql语句
v_sql:='select count(*) from '||tableName;
--执行sql上面的v_sql语句,并且把返回的值,赋给myrows(总记录数)
execute immediate v_sql into myrows;
--计算(总页数)mypageCount
if mod(myrows,PageSizes)=0 then
mypageCount := myrows/PageSizes;
else
mypageCount := myrows/PageSizes+1;
end if;
--关闭游标
--close p_cursor
end;




用Java程序调用:

package javastudy;


import java.sql.*;


public class Testit2 {
/// java程序调用存储过程分页
public static void main(String[] args) {


try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "lh621366");
CallableStatement cs = conn.prepareCall("{call  fenye(?,?,?,?,?,?)}");
// 给?赋值
cs.setString(1, "emp");//输入的表名
cs.setInt(2, 5);//每页的记录数为5
cs.setInt(3, 1);//当前页为第一页
// 注册一下
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
// 更新一下
cs.execute();
// 取出参数的值
int rowNum = cs.getInt(4);// 总页数
int pageCount = cs.getInt(5);// 总记录数
ResultSet rs = (ResultSet) cs.getObject(6);// emp的结果集


while (rs.next()) {
System.out.println("编号:" + rs.getInt(1) + " 名字:" + rs.getString(2) + " 薪水:" + rs.getString(6));
}
System.out.println("总记录数:" + rowNum);
System.out.println("总页数" + pageCount);
} catch (Exception e) {
// TODO: handle exception
}
}


}



输出结果为:

编号:7369 名字:SMITH 薪水:20
编号:7788 名字:SCOTT 薪水:550
编号:7900 名字:JAMES 薪水:950
编号:7521 名字:WARD 薪水:1250
编号:7654 名字:MARTIN 薪水:1250
总记录数:16
总页数4


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38931次
    • 积分:2096
    • 等级:
    • 排名:第19024名
    • 原创:168篇
    • 转载:58篇
    • 译文:0篇
    • 评论:9条
    最新评论