oracle分页存储过程

[java]  view plain copy
  1. import java.sql.CallableStatement;  
  2. import java.sql.Connection;  
  3. import java.sql.DriverManager;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import java.sql.Statement;  
  7. public class TestPage {  
  8.       
  9.     public TestPage() {  
  10.     }  
  11.     public static void main(String[] args) {  
  12.         String driver = "oracle.jdbc.driver.OracleDriver";  
  13.         String strUrl = "jdbc:oracle:thin:@localhost:1521:xmgl";  
  14.         String username = "xmgl";  
  15.         String password = "xmgl";  
  16.         Statement stmt = null;  
  17.         ResultSet rs = null;  
  18.         Connection conn = null;  
  19.         try {  
  20.             Class.forName(driver);  
  21.             conn = DriverManager.getConnection(strUrl, username, password);  
  22.             System.out.println("ok");  
  23.             CallableStatement cs = null;  
  24.             //创建CallableStatement  
  25.             cs = conn.prepareCall("{call page.fenye(?,?,?,?,?,?)}");  
  26.             cs.setString(1"mytest");//表名  
  27.             cs.setInt(23);//显示几条记录  
  28.             cs.setInt(31);//第几页  
  29.             //注册总记录数,声明输出参数是什么类型的   
  30.             cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);  
  31.             //注册总页数  
  32.             cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);  
  33.             //注册返回的结果集  
  34.             cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);  
  35.             cs.execute();  
  36.             //取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的  
  37.             int rowNum=cs.getInt(4);//获得输出参数  
  38.             int pageCount = cs.getInt(5);  
  39.             rs=(ResultSet)cs.getObject(6);  
  40.               
  41.             System.out.println("rowNum="+rowNum);  
  42.             System.out.println("总页数="+pageCount);  
  43.             while (rs.next()) {  
  44.                 System.out.println("编号:"+rs.getInt(1)+" 名字:"+rs.getString(2)+" 密码:"+rs.getString(3));  
  45.             }  
  46.         } catch (SQLException ex2) {  
  47.             ex2.printStackTrace();  
  48.         } catch (Exception ex2) {  
  49.             ex2.printStackTrace();  
  50.         } finally {  
  51.             try {  
  52.                 if (rs != null) {  
  53.                     rs.close();  
  54.                     if (stmt != null) {  
  55.                         stmt.close();  
  56.                     }  
  57.                     if (conn != null) {  
  58.                         conn.close();  
  59.                     }  
  60.                 }  
  61.             } catch (SQLException ex1) {  
  62.             }  
  63.         }  
  64.     }  
  65. }  

 

 

存储语句:

[c-sharp]  view plain copy
  1. create or replace package page is  
  2.   type test_cursor is ref cursor;  
  3.   procedure fenye(tableName in varchar2,pageSize in number,pageNow in number,myRows out number,myPageCount out number,p_cursor out page.test_cursor);  
  4. end;  
  5. create or replace package body page is  
  6.   procedure fenye(  
  7.        tableName in varchar2,  
  8.        pageSize in number,--一页显示记录数  
  9.        pageNow in number,--第几页  
  10.        myRows out number,--总记录数  
  11.        myPageCount out number,--总页数  
  12.        p_cursor out page.test_cursor--返回的记录集   
  13.   )   
  14.   is  
  15.   --定义部分  
  16.   --定义sql 语句 字符串  
  17.   v_sql varchar2(1000);  
  18.   --定义两个整数  
  19.   v_begin number:=(pageNow-1)*pageSize+1;  
  20.   v_end number:=pageNow*pageSize;  
  21.   begin  
  22.   --执行部分  
  23.   v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin||' order by userid asc ';  
  24.   --把游标和sql 关联  
  25.   open p_cursor for v_sql;  
  26.   --计算myRows 和myPageCount  
  27.   --组织一个sql 语句  
  28.   v_sql:='select count(*) from '||tableName;  
  29.   --执行sql,并把返回的值,赋给myRows;  
  30.   execute immediate v_sql into myRows;  
  31.     
  32.   --计算myPageCount  
  33.   --if myrows%Pagesize=0 then 这样写是错的  
  34.   if mod(myRows,pageSize)=0 then  
  35.    myPageCount:=myrows/pageSize;  
  36.   else  
  37.    myPageCount:=myrows/pageSize+1;  
  38.   end if;  
  39.   --关闭游标  
  40.   --close p_cursor;  
  41.   end;  
  42. end;  

注:如果出现“Error: PLS-00103: 出现符号 "CREATE" Line”,可能是因为:包与包体的执行(编译)没有分开进行,得分开进行!

你可能感兴趣的:(oracle,sql,String,jdbc,null,存储)