oracle面试

问题描述

:在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。下面的是网上的答案,不过没有看明白,那讲一下,弄细点,<% int i=1; int numPages=14; String pages = request.getParameter(page) ; int currentPage = 1; currentPage=(pages==null)?(1):{Integer.parseInt(pages)} sql = select count(*) from tables; ResultSet rs = DBLink.executeQuery(sql) ; while(rs.next()) i = rs.getInt(1) ; int intPageCount=1; intPageCount=(i%numPages==0)?(i/numPages)i/numPages+1); int nextPage ; int upPage; nextPage = currentPage+1; if (nextPage>=intPageCount) nextPage=intPageCount; upPage = currentPage-1; if (upPage<=1) upPage=1; rs.close(); sql=select * from tables; rs=DBLink.executeQuery(sql); i=0; while((i<numpages*(currentpage-1))&&rs.next()){i++;} <br="">%> //输出内容 //输出翻页连接 合计:<%=currentPage%>/<%=intPageCount%>第一页href=List.jsp?page=<%=upPage%>>上一页 <% for(int j=1;j<=intPageCount;j++){ if(currentPage!=j){ %> >[<%=j%>] <% }else{ out.println(j); } } %> >下一页>最后页为什么会有<% for(int j=1;j<=intPageCount;j++){ if(currentPage!=j){ %> >[<%=j%>] <% }else{ out.println(j); } } %> 这一段呢?他是做什么的呀,那个高手可以说说每一个代码的意思,不光是我问的这个,把上的都解释一下了

解决方案

<%int i=1;int numPages=14;//每页的记录数String pages = request.getParameter(page) ; // 取出当前页码参数int currentPage = 1;currentPage=(pages==null)?(1):{Integer.parseInt(pages)} //转换成数字sql = select count(*) from tables; ResultSet rs = DBLink.executeQuery(sql) ;while(rs.next()) i = rs.getInt(1) ; //连接数据库,查询总记录数int intPageCount=1;intPageCount=(i%numPages==0)?(i/numPages)i/numPages+1);//计算出总页数int nextPage ;int upPage;nextPage = currentPage+1;if (nextPage>=intPageCount) nextPage=intPageCount;//下页的页码upPage = currentPage-1;if (upPage<=1) upPage=1;//上页的页码rs.close();sql=select * from tables;rs=DBLink.executeQuery(sql);i=0;while((i<numPages*(currentPage-1))&&rs.next()){i++;}//这是查询记录,但是忽略当前页码前面的记录。。好土的办法,貌似oracle有更好的参数%>//输出内容//输出翻页连接合计:<%=currentPage%>/<%=intPageCount%><a href=List.jsp?page=1>第一页</a><ahref=List.jsp?page=<%=upPage%>>上一页</a><%for(int j=1;j<=intPageCount;j++){if(currentPage!=j){%><a href=list.jsp?page=<%=j%>>[<%=j%>]</a>//其实page作为一个页码的参数<%}else{out.println(j);}}%><a href=List.jsp?page=<%=nextPage%>>下一页</a><a href=List.jsp?page=<%=intPageCount%>>最后页</a>为什么会有<%for(int j=1;j<=intPageCount;j++){if(currentPage!=j){%><a href=list.jsp?page=<%=j%>>[<%=j%>]</a><%}else{out.println(j);}}%> 这段存在是因为,这个页码除了显示上一页,下一页,还显示第x页的功能,看看javaeye论坛的分页那个样子。而且当前页是不做连接处理。。。ok,还有什么问题?
解决方案二:
至于页面上的,你可以用ecside、extrememComponent、displayTag、ext grid之类的表格组件,页面会很干净,springside1.0m3的文档中也介绍过一个分页标签,不错的。总之不要在页面嵌入<%%>,象我等老土偶尔也用用<%%>,但那是懒+土的结果。
解决方案三:
<% for(int j=1;j<=intPageCount;j++){ if(currentPage!=j){ %> <a href=list.jsp?page=<%=j%>>[<%=j%>]</a> <% }else{ out.println(j); } } %> 就是把每一个页码都建一个连接到后台去查询该页内容。就像 1 2 3 4 5。。这样
解决方案四:
忘了说,前面这段代码返值就是分页SQL了。你给出的那些网上的代码把java和jsp混在一起,而且用next分页,实在是...无语了,千万别看了,我也不详细解释它了。反正根据你的题目,给出了最好的了。
解决方案五:
同意,纯粹误导读者。。。。那段jsp代码很恶心。。。。
解决方案六:
上面的代码前面一段是计算页码、起始位置什么的,然后是一条一条的往下next移动到起始位置的,数据大了会很慢很慢,而且还混合了jsp页面上的代码,晕呀,纯粹误导读者。/**这个比较简单,是Hibernate源码,可以吧一个普通sql通过ROW_NUM这个隐藏列转换为分页SQL,应该是最好的解决方案了。页面上可以自己搞,这个问题似乎和页面无关。@param sql 原来的sql@param hasOffset 如果为false,表示从第一条记录开始(第一页)*/public String getLimitString(String sql, boolean hasOffset) {sql = sql.trim();//把锁去掉boolean isForUpdate = false;if ( sql.toLowerCase().endsWith(" for update") ) {sql = sql.substring( 0, sql.length()-11 );isForUpdate = true;}StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );//开始折腾SQL了,是否有offset是不同的,看不明白可以去掉else里面的代码,只保留if里面的代码(连if也去掉,只要里面的)if (hasOffset) {pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");}else {pagingSelect.append("select * from ( ");}pagingSelect.append(sql);if (hasOffset) {//第一个?是起始行,第二个是终止行pagingSelect.append(" ) row_ ) where rownum_ <= ? and rownum_ > ?");}else {pagingSelect.append(" ) where rownum <= ?");}//折腾完了 再加上锁(如果以前有锁)if ( isForUpdate ) {pagingSelect.append( " for update" );}return pagingSelect.toString();}

时间: 2024-10-22 12:58:49

oracle面试的相关文章

Oracle面试问题-技术篇

oracle|问题 Oracle面试问题-技术篇 这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答.这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度.  1.解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份

ORACLE 面试问题-技术篇(2)

oracle|问题                    ORACLE 面试问题-技术篇(2) 21. 如何判断数据库的时区?解答:SELECT DBTIMEZONE FROM DUAL; 22. 解释GLOBAL_NAMES设为TRUE的用途解答:GLOBAL_NAMES指明联接数据库的方式.如果这个参数设置为TRUE,在建立数据库链接时就必须用相同的名字连结远程数据库 23.如何加密PL/SQL程序?解答:WRAP 24. 解释FUNCTION,PROCEDURE和PACKAGE区别解答:f

Oracle面试题目及解答 轻松应对面试官

本文出自:http://www.dbasupport.com 这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度. 1. 解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点.冷备份

ORACLE 面试问题-技术篇(1)

oracle|问题        这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答(这部分将在下几期中出现).这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度.   1. 解释冷备份和热备份的不同点以及各自的优点   解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模

【面试虐菜】—— Oracle中CHAR、VARCHAR的区别

1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim(). 2.VARCHAR. 存储变长数据,但存储效率没有CHAR高.如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的.VARCHAR类型的实际长度是它的值的实际长度+1.为什么"+1"呢?这一个

【面试虐菜】—— Oracle知识整理《收获,不止Oracle》

普通堆表不足之处:     表更新有日志开销     表删除有瑕疵     表记录太大检索较慢     索引回表读开销很大     有序插入难有序读出 DELETE产生的undo最多,redo也最多,因为undo也需要redo保护 全局临时表: 1 高效删除记录 基于事务的全局临时表commit或者session连接退出后,自动删除 基于回话的全局临时表在退出回话后自动删除 2 针对不同的会话数据独立,不同的session访问全局临时表,看到的结果不同 全局临时表在程序的一次调用执行过程中,需要

Oracle 常见问题解答

oracle|解答|问题 以前搜集的一个Oracle比较常见问题的列表,忘记了是从哪来的 关于 SELECT N 问题 有感于一些网友多次咨询和讨论选取某些指定行数据的问题, 我写了下面这样的简单说明, 请大家指正. 这里描述的 SELECT N 包括这样几种情况:1. 选取TOP N行记录2. 选取N1-N2行记录3. 选取FOOT N行记录当然需要考虑是否有ORDER BY子句的情况, 下面试以系统视图CAT为例分别说明.注: A. 为没有ORDER BY的情况B. 有ORDER BY的情况

Oracle UPDATE语句深入解析

这是曾经Oracle原厂的一位兄弟问我的一个问题,后来也有些人问起这个问题: 用ORACLE内部原理描述以下过程: 1.sqlplus gyj/gyj@orcl 2.updatet_gyj set name='gyj1' where id=1; 3.commit; 4.exit 一看这个问题是不是灰常复杂,阿里系的童鞋特别喜欢用类似这样的题目面试人,从中可以快速的判断你是哪个级别的DBA(初级/中级/高级),在这个问题上我给大家抛砖迎玉,由于能力有限只能做简单解释,欢迎大家一起参与讨论并补充.嘿

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴