java调用Oracle分页存储过程

Java程序

package com.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import com.jdbc.BaseJdbcDAO;
import oracle.jdbc.OracleTypes;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Connection conn = BaseJdbcDAO.getConnection2("com");
String sqlSel = "SELECT * FROM POSITION";
String sqlCount = "SELECT COUNT(*) FROM POSITION";
String sql = "{ call SP_PAGE(?,?,?,?,?,?,?) }";
ResultSet rs = null;
try {
CallableStatement call = conn.prepareCall(sql);
call.setInt(1, 20);
call.setInt(2, 100);
call.setString(3, sqlSel);
call.setString(4, sqlCount);
call.registerOutParameter(5, Types.INTEGER);
call.registerOutParameter(6, Types.INTEGER);
call.registerOutParameter(7, OracleTypes.CURSOR);
call.execute();
// 取出结果集
int pageCount = call.getInt(5);//总页数
int total = call.getInt(6);//总记录数

rs = (ResultSet) call.getObject(7);//信息列表集
System.out.println("页总数:" + pageCount);
System.out.println("记录总数:" + total);
int i = 1;
while (rs.next()) {
System.out.println(">>" + i + "号码:" + rs.getString(2) + "名称:"
+ rs.getString(3) + "序号:" + rs.getInt(1));
i++;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}/* 何问起 hovertree.com */

--创建游标包

create or replace PACKAGE "PKG_QUERY" AS
type refCursorType is REF CURSOR; --游标类型定义,用于返回数据集
END;/* 何问起 hovertree.com */

--存储过程

create or replace procedure sp_Page(p_PageSize int, --每页记录数
p_PageNo int, --当前页码,从 1 开始
p_SqlSelect varchar2, --查询语句,含排序部分
p_SqlCount varchar2, --获取记录总数的查询语句
p_pageCount out int,--总共多少页
p_OutRecordCount out int,--返回总记录数
p_OutCursor out PKG_QUERY.refCursorType)
as
v_sql varchar2(3000);
v_count int;
v_heiRownum int;
v_lowRownum int;
  begin
  ----取记录总数
      execute immediate p_SqlCount into v_count;
      p_OutRecordCount := v_count;
      --计算mypageCount--
    if mod(v_count,p_PageSize)=0 then
        p_pageCount:=v_count/p_PageSize;
    else
        p_pageCount:=v_count/p_PageSize+1;
    end if;

    ----执行分页查询
      v_heiRownum := p_PageNo * p_PageSize;
      v_lowRownum := v_heiRownum - p_PageSize + 1;

      v_sql := ‘SELECT B.* FROM (SELECT A.*, rownum rn FROM (‘|| p_SqlSelect ||‘) A WHERE rownum <= ‘|| to_char(v_heiRownum) || ‘ ) B WHERE rn >= ‘ || to_char(v_lowRownum) ;
    --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn

OPEN p_OutCursor FOR v_sql;

end sp_Page;/* 何问起 hovertree.com */

推荐:http://www.cnblogs.com/roucheng/p/3504465.html

时间: 2024-11-18 05:14:18

java调用Oracle分页存储过程的相关文章

java基础----&gt;java调用oracle存储过程(转)

存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天,我们就开始学习java中调用oracle的存储过程. java中调用oracle的存储过程 项目结构如下: 一. 在数据库创建存储过程的脚本,如果使用的是本地的oracle数据库,则需要开启服务:OracleOraDb11g_home1TNSListener和OracleServiceORCL.

java基础----&gt;java调用oracle存储过程

存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天,我们就开始学习java中调用oracle的存储过程. java中调用oracle的存储过程 项目结构如下: 一. 在数据库创建存储过程的脚本,如果使用的是本地的oracle数据库,则需要开启服务:OracleOraDb11g_home1TNSListener和OracleServiceORCL.

java下实现调用oracle的存储过程和函数

目录(?)[-] 创建表STOCK_PRICES 插入测试数据 建立一个返回游标 创建和存储过程P_GET_PRICE 创建函数 JAVA调用存储过程返回结果集 开发JAVA调用函数返回结果集 在oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES [cpp] view plaincopy --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED D

oracle 分页存储过程

--创建表declare num number; begin select count(1) into num from user_tables where table_name='SRCT';   --判断当前要创建的表在数据库中是否存在.if num>0 then execute immediate 'drop table '||'SRCT'; --表名要大写end if; execute immediate 'CREATE TABLE SRCT(    SN  char(11),   XM

oracle分页存储过程

oracle分页存储过程: CREATE OR REPLACE PROCEDURE FGK.prc_page (p_tableName in varchar2, --表名 p_strWhere in varchar2, --查询条件 p_orderColumn in varchar2, --排序的列 p_orderStyle in varchar2, --排序方式 p_curPage in out Number, --当前页 p_pageSize in out Number, --每页显示记录条

Java调用Oracle存储Package

Oracle的包Package中可以有很多存储,可通过该包的总调入口在java中直接调用. //java调用oracle的package代码 public boolean cal() throws java.lang.Exception { CallableStatement cstmt = null; String procedure = "{call G_IMPORT_CAL.g_entry(?,?,?) }"; cstmt = conn.prepareCall(procedure

调用MySql 分页存储过程带有输入输出参数

1 Create PROCEDURE getuser 2 ( 3 IN pageIndex INT, 4 IN pageSize INT, 5 OUT count INT 6 ) 7 8 BEGIN 9 declare pindex int DEFAULT (pageIndex-1)*pageSize; 10 11 select * from lc_user order by id LImit pindex,pageSize; 12 13 SELECT COUNT(id) INTO count

用NHibernate调用Oracle的存储过程

摘要 NHibernate2.1.1版终于可以调用Oracle的存储过程了,不过必须使用NHibernate.Driver.OracleDataClientDriver驱动(Oracle.DataAccess.dll),但这会导致hbm2ddl.keywords抛异常,所以也不是很完美. NHibernate调用Oracle的存储过程的方法 首先,在Oracle10g里面创建一个简单的存储过程,它的第一个参数必须是SYS_REFCURSOR类型的. 存储过程create or replace p

微软企业库5.0 调用 MySql 分页存储过程

1.需要完成两个前置条件后才可以使用 微软企业库5.0 调用 MySql 存储过程 微软企业库5.0 支持 MySql MySql 分页存储过程 2.需要添加一个继承 IParameterMapper 接口的类分配查询参数 using System.Data; using System.Data.Common; using Microsoft.Practices.EnterpriseLibrary.Data; using Grass.Extend; namespace Grass.MySqlDa