Java调用Oracle数据库的分页存储过程

本文介绍了一个用于Oracle数据库的分页存储过程实现方法,包括创建存储过程的包及包体代码,并提供了一段Java测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目进度比较缓慢,初步研究了一下Oracle的存储过程,将代码贴出来。

首先先贴出来Oracle的分页分页存储过程代码吧。

1.这是包的代码

create or replace package DB_Oper is

-- Author : LIUBING
-- Created : 2009-10-28 15:01:30
-- Purpose : 测试Oracle的分页存储过程

-- Public type declarations
type ref_DataSet is REF CURSOR;


-- Public function and procedure declarations
function GetCount(mTableName varchar2, mTerm varchar2) return number;
procedure return_DataSet(
mTableName in varchar2, --表名
mTerm in varchar2, --条件
mPageSize in number, --每页显示记录数
mPageIndex in number, --当前页
mOrderField in varchar2, --排序字段
mOrderStyle in number, --排序方式 0 升序 1 降序
mTotalRecords out number, --总记录数
mDateSet out ref_DataSet --记录
);

end DB_Oper;

2.这是包体的代码

create or replace package body DB_Oper is

----- 获取记录数 ------
function GetCount(mTableName varchar2, mTerm varchar2) return number is
i number;
vSql varchar2(1000);
begin
i := 0;
vSql := 'select count(*) from ' || mTableName ;

if length(mTerm) > 0 then
vSql := vSql || ' where ' || mTerm;
end if;

execute IMMEDIATE vSql into i;

return(i);
end;

----- 数据分页 ----------
procedure return_DataSet(
mTableName in varchar2, --表名
mTerm in varchar2, --条件
mPageSize in number, --每页显示记录数
mPageIndex in number, --当前页
mOrderField in varchar2, --排序字段
mOrderStyle in number, --排序方式 0 升序 1 降序
mTotalRecords out number, --总记录数
mDateSet out ref_DataSet --记录集
) is
begin
declare
Invalid_Input Exception;
vSql varchar2(1000);
Start_page number;
End_page number;
n_PageIndex number;
n_PageSize number;
--mTotalRecords number;
begin
mTotalRecords := GetCount(trim(mTableName), trim(mTerm));
vSql := 'select * from ' || mTableName;
if length(trim(mTerm)) > 0 then
vSql := vSql || ' where ' || trim(mTerm) ;
end if;
if length(trim(mOrderField)) > 0 then
begin
vSql := vSql || ' order by ' || trim(mOrderField);
if morderStyle > 0 then
vSql := vSql || ' desc ';
end if;
end;
end if;

--
n_PageSize := mPageSize;
if mPageSize <= 0 then
n_PageSize := 10;
end if;
n_PageIndex := mPageIndex;
if mPageIndex <= 0 then
n_PageIndex := 1;
end if;
if mTotalRecords > 0 and n_PageIndex > 1 then
begin
--如果n_pageindex大于实际的页数,则取实际页数
if n_PageIndex > round((mTotalRecords / n_PageSize) + 0.5) then
n_PageIndex := round((mTotalRecords / n_PageSize) + 0.5);
end if;
end;
end if;
Start_page := (n_PageIndex - 1) * n_PageSize + 1;
End_page := n_PageIndex * n_PageSize;
vSql := 'SELECT * FROM (SELECT A.*, rownum r FROM ( ' || vSql || ' ) A WHERE rownum <= ' || End_page || ' ) B WHERE r >= '|| Start_page;

Open mDateSet for vSql;

exception
When Invalid_Input Then
open mDateSet for select null from dual;
end;
end return_DataSet;
end DB_Oper;

3.这是Java的测试代码

public class ConnToOracle { final static Logger logger = Logger.getLogger(ConnToOracle.class); public static Connection getConnection(String url, String userName, String password) { Connection conn = null; try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); conn = DriverManager.getConnection(url, userName, password); System.out.println("Connection Starting......."); } catch (SQLException e) { logger.error("Connection error......"); } return conn; } public static void select() throws Exception { Connection conn = null; try { conn = getConnection("jdbc:oracle:thin:@192.168.6.80:1521:C2SServer", "d1xn_cmc","d1xn_cmc"); // String call= "{call DB_Oper.return_DataSet(?,?,?,?,?,?,?,?)}";这种条用方式也是OK的 String call= "begin DB_Oper.return_DataSet(?,?,?,?,?,?,?,?);end;"; CallableStatement proc = conn.prepareCall(call); proc.setString(1, "game_goods"); proc.setString(2, null); proc.setString(3, "20"); proc.setString(4, "1"); proc.setString(5, "n_ID"); proc.setString(6, "0"); proc.registerOutParameter(7, OracleTypes.NUMBER);//注册返回的总记录数的数据类型 proc.registerOutParameter(8, OracleTypes.CURSOR);//注册返回的数据结果集的数据类型 proc.execute(); int a1 = proc.getInt(7);//获得总的记录集 System.out.println(a1); ResultSet rs = (ResultSet)proc.getObject(8);//获得返回的数据集 while (rs.next()) { System.out.println(rs.getString(1)); } } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { conn.close(); } } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值