您的位置:首页 > 数据库 > Oracle

Oracle存储过程(分页、模糊查找、排序、按字段区间查找)etc.以及JAVA代码

2012-08-07 16:15 411 查看
-- 先创建包
CREATE OR REPLACE PACKAGE mypackage AS TYPE mycursor IS REF CURSOR;
END;


--创建分页存储过程
CREATE OR REPLACE PROCEDURE splitpage
(
v_tableName IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(1000);
v_begin NUMBER:=(v_pageNow-1)*v_pageSize+1;
v_end   NUMBER:=v_pageNow*v_pageSize;

BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from ' ||v_tableName||
') a1 where rownum<='||v_end||
') where rn>='||v_begin||'';
OPEN v_cursor FOR v_sql;
v_sql:='select count(*) from ' ||v_tableName||'';
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=0 THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+1;
END IF;
END;


  

public YOURClass getSplitPage(int targetPage, int eachpagenum){
Connection conn = DBConnection.getConn();//获取Oraccle 的Connection

//参数位置要与存储过程对应,其余用法跟pstmt类似
String sql = "{call splitpage(?,?,?,?,?,?)}";
try{
cs = conn.prepareCall(sql);
cs.setString(1,"tablename"); // the name of db's table
cs.setInt(2,eachpagenum); // Each page record numbers
cs.setInt(3,targetPage); // Target page number

// register the output
cs.registerOutParameter(4,OracleTypes.NUMBER);
cs.registerOutParameter(5,OracleTypes.NUMBER);
cs.registerOutParameter(6,OracleTypes.CURSOR);

cs.execute();
// get the value from CallableStatement
totalRowsCount = cs.getInt(4); // 获取总记录数
totalPagesCount = cs.getInt(5);// 获取总页数
ResultSet rs = (ResultSet) cs.getObject(6);

while(rs.next()){
// 从rs中读取数据
}
return YOURClass;
}catch (SQLException e){
e.printStackTrace();
}
return null;
}


  下面就不给出JAVA代码了,因为都是类似的。用法跟pstmt一样,只是多了注册输出变量。

--带模糊查询的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzy
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(1000);
v_begin NUMBER:=(v_pageNow-1)*v_pageSize+1;
v_end   NUMBER:=v_pageNow*v_pageSize;

BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from ' ||v_tableName||' where '||v_colName||' like ''%'|| v_keyword ||'%'' '||
') a1 where rownum<='||v_end||
') where rn>='||v_begin||'';
OPEN v_cursor FOR v_sql;
v_sql:='select count(*) from ' ||v_tableName||'';
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=0 THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+1;
END IF;
END;


  

--带模糊查询带排序的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzyorder
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_colOrder IN VARCHAR2,
v_orderType IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(1000);
v_begin NUMBER:=(v_pageNow-1)*v_pageSize+1;
v_end   NUMBER:=v_pageNow*v_pageSize;

BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from ' ||v_tableName||' where '||v_colName||' like ''%'|| v_keyword ||'%'' '||
' order by ' ||v_colOrder||' '||v_orderType||
') a1 where rownum<='||v_end||
') where rn>='||v_begin||'';
OPEN v_cursor FOR v_sql;
v_sql:='select count(*) from ' ||v_tableName||'';
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=0 THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+1;
END IF;
END;


  

--带模糊查询带排序带时间段的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzyorderdate
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_colOrder IN VARCHAR2,
v_orderType IN VARCHAR2,
v_colDate IN DATE;
v_dateBegin IN DATE,
v_dateEnd IN DATE,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(1000);
v_begin NUMBER:=(v_pageNow-1)*v_pageSize+1;
v_end   NUMBER:=v_pageNow*v_pageSize;

BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from ' ||v_tableName||' where '||v_colName||' like ''%'|| v_keyword ||'%'' '||
' and ' v_colDate||' between ' v_dateBegin ||' and '||v_dateEnd ||
' order by ' ||v_colOrder||' '||
') a1 where rownum<='||v_end||
') where rn>='||v_begin||'';
OPEN v_cursor FOR v_sql;
v_sql:='select count(*) from ' ||v_tableName||'';
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=0 THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+1;
END IF;
END;


  这几个下来想必大家也都清楚该怎么做了。如果需要添加什么条件,只需要在最内层字句中添加相应语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: