Oracle 查询结果如何分页显示(300分)

  • 主题发起人 主题发起人 Crane
  • 开始时间 开始时间
C

Crane

Unregistered / Unconfirmed
GUEST, unregistred user!
页面用JSP,象Yahoo一样显示“下一页”“上一页”等等
 
试试这个:
<p>&amp;lt;%@ page contentType=&amp;quot;text/html;charset=8859_1&amp;quot;
%&amp;gt;</p>
<p>&amp;lt;%<br>
//</font><font color="#000080" size="2">变量声明<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.sql.Connection
sqlCon;
//</font><font color="#000080" size="2">数据库连接对象<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.sql.Statement
sqlStmt;
//SQL</font><font color="#000080" size="2">语句对象<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.sql.ResultSet
sqlRst;
//</font><font color="#000080" size="2">结果集对象</font></p>
<font color="#000080" face="Verdana, Arial, Helvetica" size="2">
<p>java.lang.String strCon;
//</font><font color="#000080" size="2">数据库连接字符串<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.lang.String
strSQL;
//SQL</font><font color="#000080" size="2">语句</font></p>
<font color="#000080" face="Verdana, Arial, Helvetica" size="2">
<p>int intPageSize;
//</font><font color="#000080" size="2">一页显示的记录数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">int intRowCount;
//</font><font
color="#000080" size="2">记录总数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">int intPageCount;
//</font><font color="#000080" size="2">总页数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">int intPage;
//</font><font
color="#000080" size="2">待显示页码<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.lang.String
strPage;</p>
<p>int i;</p>
<p>//</font><font color="#000080" size="2">设置一页显示的记录数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">intPageSize = 2;</p>
<p>//</font><font color="#000080" size="2">取得待显示页码<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">strPage =
request.getParameter(&amp;quot;page&amp;quot;);<br>
if(strPage==null){//</font><font color="#000080" size="2">表明在</font><font
color="#000080" face="Verdana, Arial, Helvetica" size="2">QueryString</font><font
color="#000080" size="2">中没有</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">page</font><font color="#000080" size="2">这一个参数,此时显示第一页数据<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">intPage = 1;<br>
}<br>
else
{//</font><font color="#000080" size="2">将字符串转换成整型<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">intPage =
java.lang.Integer.parseInt(strPage);<br>
if(intPage&amp;lt;1) intPage = 1;<br>
}</p>
<p>//</font><font color="#000080" size="2">装载</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">JDBC</font><font color="#000080" size="2">驱动程序<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">java.sql.DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());</p>
<p>//</font><font color="#000080" size="2">设置数据库连接字符串<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">strCon =
&amp;quot;jdbc:oracle:thin:@linux:1521:ora4cweb&amp;quot;;</p>
<p>//</font><font color="#000080" size="2">连接数据库<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlCon =
java.sql.DriverManager.getConnection(strCon,&amp;quot;hzq&amp;quot;,&amp;quot;hzq&amp;quot;);</p>
<p>//</font><font color="#000080" size="2">创建一个可以滚动的只读的</font><font
color="#000080" face="Verdana, Arial, Helvetica" size="2">SQL</font><font color="#000080"
size="2">语句对象<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlStmt =
sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);</p>
<p>//</font><font color="#000080" size="2">准备</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">SQL</font><font color="#000080" size="2">语句<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">strSQL =
&amp;quot;select name,age from test&amp;quot;;</p>
<p>//</font><font color="#000080" size="2">执行</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">SQL</font><font color="#000080" size="2">语句并获取结果集<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlRst =
sqlStmt.executeQuery(strSQL);</p>
<p>//</font><font color="#000080" size="2">获取记录总数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlRst.last();<br>
intRowCount = sqlRst.getRow();</p>
<p>//</font><font color="#000080" size="2">记算总页数<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">intPageCount =
(intRowCount+intPageSize-1) / intPageSize;</p>
<p>//</font><font color="#000080" size="2">调整待显示的页码<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">if(intPage&amp;gt;intPageCount)
intPage = intPageCount;<br>
%&amp;gt;</p>
<p>&amp;lt;html&amp;gt;<br>
&amp;lt;head&amp;gt;<br>
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot;
content=&amp;quot;text/html;
charset=gb2312&amp;quot;&amp;gt;<br>
&amp;lt;title&amp;gt;JSP</font><font color="#000080" size="2">数据库操作例程 </font><font
color="#000080" face="Verdana, Arial, Helvetica" size="2">- </font><font color="#000080"
size="2">数据分页显示 </font><font color="#000080" face="Verdana, Arial, Helvetica"
size="2">- JDBC 2.0 - Oracle&amp;lt;/title&amp;gt;<br>
&amp;lt;/head&amp;gt;</p>
<p>&amp;lt;body&amp;gt;</p>
<p>&amp;lt;table border=&amp;quot;1&amp;quot;
cellspacing=&amp;quot;0&amp;quot;
cellpadding=&amp;quot;0&amp;quot;&amp;gt;<br>
&amp;lt;tr&amp;gt;<br>
&amp;lt;th&amp;gt;</font><font color="#000080" size="2">姓名</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">&amp;lt;/th&amp;gt;<br>
&amp;lt;th&amp;gt;</font><font color="#000080" size="2">年龄</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">&amp;lt;/th&amp;gt;<br>
&amp;lt;/tr&amp;gt;</p>
<p>&amp;lt;%<br>
if(intPageCount&amp;gt;0){<br>
//</font><font color="#000080" size="2">将记录指针定位到待显示页的第一条记录上<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlRst.absolute((intPage-1)
* intPageSize + 1);</p>
<p>//</font><font color="#000080" size="2">显示数据<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">i = 0;<br>
while(i&amp;lt;intPageSize &amp;amp;&amp;amp;
!sqlRst.isAfterLast()){<br>
%&amp;gt;<br>
&amp;lt;tr&amp;gt;<br>
&amp;lt;td&amp;gt;&amp;lt;%=sqlRst.getString(1)%&amp;gt;&amp;lt;/td&amp;gt;<br>
&amp;lt;td&amp;gt;&amp;lt;%=sqlRst.getString(2)%&amp;gt;&amp;lt;/td&amp;gt;<br>
&amp;lt;/tr&amp;gt;<br>
&amp;lt;%<br>
sqlRst.next();<br>
i++;<br>
}<br>
}<br>
%&amp;gt;</p>
<p>&amp;lt;/table&amp;gt;</p>
</font>
<p><font color="#000080" size="2">第</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">&amp;lt;%=intPage%&amp;gt;</font><font color="#000080"
size="2">页</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">&amp;amp;nbsp;&amp;amp;nbsp;</font><font
color="#000080" size="2">共</font><font color="#000080" face="Verdana, Arial, Helvetica"
size="2">&amp;lt;%=intPageCount%&amp;gt;</font><font color="#000080" size="2">页</font><font
color="#000080" face="Verdana, Arial, Helvetica" size="2">&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;%if(intPage&amp;lt;intPageCount){%&amp;gt;&amp;lt;a
href=&amp;quot;jdbc20-oracle.jsp?page=&amp;lt;%=intPage+1%&amp;gt;&amp;quot;&amp;gt;</font><font
color="#000080" size="2">下一页</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">&amp;lt;/a&amp;gt;&amp;lt;%}%&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;%if(intPage&amp;gt;1){%&amp;gt;&amp;lt;a
href=&amp;quot;jdbc20-oracle.jsp?page=&amp;lt;%=intPage-1%&amp;gt;&amp;quot;&amp;gt;</font><font
color="#000080" size="2">上一页</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">&amp;lt;/a&amp;gt;&amp;lt;%}%&amp;gt;</p>
<p>&amp;lt;/body&amp;gt;<br>
&amp;lt;/html&amp;gt;</p>
<p>&amp;lt;%<br>
//</font><font color="#000080" size="2">关闭结果集<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlRst.close();</p>
<p>//</font><font color="#000080" size="2">关闭</font><font color="#000080"
face="Verdana, Arial, Helvetica" size="2">SQL</font><font color="#000080" size="2">语句对象<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlStmt.close();</p>
<p>//</font><font color="#000080" size="2">关闭数据库<br>
</font><font color="#000080" face="Verdana, Arial, Helvetica" size="2">sqlCon.close();<br>
%&amp;gt;</font></p>
 
eguy:
非常感谢鼎立相助,有一些地方还是有点疑惑
1.这是一般常规的做法吗。
2.如果一下得到整个数据集,如果查到10000条纪录,岂不是很占内存?还是
Oracle自己就能先提取一部分?
3.为什么不用Fetch等等(虽然我不会用)
 
是不是能用Web_Bean保存一部分结果,这样就不用每次都去search数据库了。
(只是想法,没试过,不知道可不可行)
 
1.这只是一个示例而已。具体情况你可以根据自己的要求而调整。
2.如果不得到整个数据集,怎么计算总页数呢。
3.显示完后,可以将ResultSet关闭,内存可以释放。
4.也可以将ResultSet保存起来,供client下一次访问。性能的好坏看你怎么取舍了。
实际上数据库查询更花时间。
 
有更好的办法吗?比如用JDBC2.0的Fetch等等?
 
eguy: Oralce能设成Oci的吗?我老是是不出来。
 
Oci??,Oci是什么意思
 
Oracle的jdbc Driver 分oci和thin 两种,前者支持Bolb长字段。
你的Oracle Jdbc Driver 是怎么安装的?我这里用thin后
原来的字符字段都变成了诸如0x2145234523452345。
后来改为sqlCon.createStatement()就恢复正常了。
我的WebServer 是Weblogic5.10。我感觉是不是Oracle需要安装JDBC驱动什么的。
能告诉我你是怎么安装的吗?
 
一般情况下,应该是:
--将[ORACLE_HOME]/jdbc/lib/classes12.zip和nls_charset12.zip加入classpath
--将[ORACLE_HOME]/jdbc/lib加入PATH.
在Weblogic5.10,应该是修改weblogic.class.path,
将[ORACLE_HOME]/jdbc/lib/classes12.zip和nls_charset12.zip加入。(或者修改
Weblogic的classpath).你试试看。
你原来用的是不是WebLogic jDriver for Oracle
又:
>>oci和thin 两种,前者支持Bolb长字段。
好象不是这样吧。oci是2类的JDBC driver,需要oracle client library的支持。
 
eguy:你的回答越来越棒,我都不好意思只给你300分了,你的方法我还没试,不过再
多问几句,
1。nls_charset12.zip缺省Oracle中有吗,是不是down下来的?
2。nls_charset12.zip是用于支持中文的吗?
3。我down了一个jDriver,不过是一些类,我看他们与Class中的OCI也没什么区别,你觉得呢?
在NT下weblogic好像自动安装JDriver(其实应该就是JDBC Driver).
 
eguy:你在吗?
 
Crane:Sorry.我一般在周末不来大富翁.
1。nls_charset12.zip缺省Oracle中有,不是down下来.
2。如果你有以下要求,就添加nls_charset12.zip:
- Oracle Character sets for CHAR/VARCHAR/LONGVARCHAR/CLOB type data
that is retrieved or inserted as a data member of an Oracle 8
Object or Collection type.
- NLS support for CHAR/VARCHAR data members of Objects and
Collections for character sets not including US7ASCII, WE8DEC, WE8ISO8859P1 and UTF8.
3。jDriver就是Class中的OCI
 
我用的分页方法:
sqls1="select * from table where rownum <"+maxtmp;
sqls2="select * from table where rownum <"+mintmp;
sqls=sqls1+" MINUS "+sqls2;
需要多少,需要那些,改变maxtmp和mintmp就行了
把需求交给ORACLE,她给我所需的。
数据量太大也会不行,上万还是没问题
这是我知道的最好的方法了,如果有更好的请告诉我哦!
 
写成一个select用and连接不是更好,否则取的是数据还是太多。
或者用entity bean,这样速度会好些
 
谢谢,我也了解
 
接受答案了.
 
后退
顶部