??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合偷偷噜噜噜色,亚洲一区二区三区成人,伊人久久大香线蕉综合影院首页http://www.aygfsteel.com/freedream/category/15856.htmlI belive I canzh-cnWed, 28 Feb 2007 04:01:00 GMTWed, 28 Feb 2007 04:01:00 GMT60orcale数据分页提取?/title><link>http://www.aygfsteel.com/freedream/articles/100297.html</link><dc:creator>JAVA_UFO</dc:creator><author>JAVA_UFO</author><pubDate>Wed, 21 Feb 2007 05:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/freedream/articles/100297.html</guid><wfw:comment>http://www.aygfsteel.com/freedream/comments/100297.html</wfw:comment><comments>http://www.aygfsteel.com/freedream/articles/100297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freedream/comments/commentRss/100297.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freedream/services/trackbacks/100297.html</trackback:ping><description><![CDATA[orcale数据分页提取?br />Ҏ一:<br /><br />select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段<br /><br />10 = 每页记录?br /><br />20 = (当前?+ 1) * 每页记录?br /><br />以上语句卛_以实现分,但是最后取出的l果排序是升序,如果需要结果集为降序(例如旉Q,则有两种Ҏ可以处理<br /><br />1.使用以下语句Q但效率可能要降低一?br /><br />select * from 表名 b, (select top 10 主键字段,排序字段 from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a order by 排序字段 ) c where b.主键字段 = c.主键字段 order by c.排序字段 desc<br /><br />2.在ado里处?记录集游标Ud最后,然后前移<br /><br />''以下为asp范例<br /><br />set rsTemp = Server.CreateObject("adodb.recordset")<br /><br />rsTemp.Open 语句,conn,1,1<br /><br />rsTemp.MoveLast<br /><br />for i = 1 to rsTemp.RecordCount<br /><br />     '取?...<br /><br />    rsTemp.MovePrevious<br /><br />next<br /><br /> <br /><br />l测试,以上分页Ҏ比用时表分页速度q要快,q且单易?<br /><br />Ҏ二:<br /><br />大数据量下的分页<br /><br />    对于非常大的数据模型而言Q分|索时Q每ơ都加蝲整个数据源非常浪贏V通常的选择是检索页面大的块区的数据,而非索所有的数据Q然后单步执行当前行?br /><br />    本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页Qؓ了便于实现演C,数据表采用了Northwind数据库的Orders表(830条记录)?br /><br />    如果数据表中有唯一的自增烦引,q且q个字段没有出现断号现象。检索页面大的块区数据非常简单了。通过单的Sql语句可以实现这个功能:<br /><br />    select * from orders where orderid between 10248 and 10253<br /><br />    其中Q开始编号ؓQ?CurrentPageIndex - 1) * PageSize  l束~号为:CurrentPageIndex * PageSize<br /><br />    当然Q如果这个字D|号不是很严重Q而且允许不是很严格的按照每页条数分页Q这LҎ也是可以用的?br /><br />    如果q个字段断号Q或者需要按照其他条件排序分,p复杂些了。首先要获得q个面需要显C的~号Q然后再按照q个~号获得需要的块区数据。根据编可得块区数据很单。不q用下面方式获得数据排序q不是按照指定的id列表序Q这时候还要附加order by 命o?br /><br />select * from orders where orderid in (10248,10249,10250,10251,10252,10253) order by orderid desc<br /><br />    获得q个面需要显C的~号列表复杂多了,而且有多U方案:<br /><br />Ҏ一Q维护一个表Q这个表记录需要显C的q些~号排序序。(q个表可以是临时表,也可以是物理表)。下面演CZ利用一个全局临时表。这个全局临时表记录需要显C的~号。注意排序,q里的order by 是需要显C的排序序?br /><br />create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descselect * from ##temptabledrop table ##temptable -- 实际执行时候,删除全部临时表当然不再这里执行?br /><br />q个临时表存在,获得指定分页的分块数据就很简单了。看下面代码Q?br /><br />create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descdeclare @PageSize int,@CurrPage int,@strSQL varchar(2000),@IDStr varchar(1000)select @PageSize = 30select @CurrPage = 2select @IDStr = ''select @IDStr = @IDStr + ltrim(rtrim(str(MainID))) + ',' from ##temptable where iid between ((@CurrPage-1)*@PageSize+1) and @CurrPage*@PageSizeif @IDStr <> '' begin select @IDStr = left(@IDStr,len(@IDStr)-1)endselect @strSQL = 'select * from orders where OrderID in ('+@IDStr+')  order by OrderID desc 'exec(@strSQL)drop table ##temptable<br /><br />注意Q实际用这个方案的时候,q要考虑何时更新q个全局临时表,一般是攑ֈ计划d中,定时更新q个汇总表?br /><br />Ҏ二:每次都去查询Q每ơ获得最新的~号序。由于这时候不存在q个临时表,书写获得需要显C页面的~号的字W串需要点技巧,看下面的代码Q?ASP.net ?DataGrid 提供了用这U分区的数据的方法?DataGrid 通过 AllowCustomPaging ?VirtualItemCount 属性支持块区操作。如?AllowCustomPaging ?trueQ则 DataGrid 不会Ҏ CurrentPageIndex 计算数据模型中的起始昄位置。DataGrid 显C数据模型中的所有数据,而页D栏将当前位置报告?(VirtualItemCount+PageSize-1)/PageSize ?CurrentPageIndex c下面的CZ说明此功能?br /><br />declare @PageSize int,@CurrPage int,@topnum int,@previous intselect @PageSize = 30select @CurrPage = 2select @topnum = @CurrPage * @PageSizeselect @previous = (@CurrPage - 1) * @PageSizedeclare @i int,@IDStr nvarchar(500),@strSQL nvarchar(1000)select @i = 0select @strSQL = N''select @strSQL = @strSQL + N' select top '+str(@topnum)+ ' @i = @i + 1 'select @strSQL = @strSQL + N',  @IdStr = 'select @strSQL = @strSQL + N'case when @i > '+str(@previous)+' then  @IdStr + ltrim(rtrim(str(OrderID))) + '','' 'select @strSQL = @strSQL + N'else N''''end 'select @strSQL = @strSQL + N'from Orders 'select @strSQL = ltrim(rtrim(@strSQL)) + N' order by OrderID desc 'Select @IdStr = N''exec sp_executesql @strSQL,N'@i int,@IdStr varchar(500) output',@i,@IdStr outputif len(rtrim(ltrim(@IdStr))) > 0begin select @IdStr = left(@IdStr,len(@IdStr)-1)endselect @strSQL = 'select * from orders where OrderID in ('+@IDStr+')'exec(@strSQL)<br /><br /> <br /><br />     protected void BindDataGrid(int currpage) {  string strConn = "Data Source=(local);Integrated Security=SSPI;database=Northwind";  // L?机器?ASPNET 用户可以讉KNorthwind数据库?SqlCommand cmd = new SqlCommand();  SqlConnection conn = new SqlConnection(strConn);  SqlParameter[]  parms = new SqlParameter[] {   new SqlParameter("@PageSize",SqlDbType.Int),   new SqlParameter("@CurrPage",SqlDbType.Int),   new SqlParameter("@SearchSql",SqlDbType.NVarChar,128),   new SqlParameter("@Count",SqlDbType.Int),  };  parms[0].Value = DataGrid1.PageSize;  parms[1].Value = (currpage+1);   //  数据库的分页法W一|1  DataGrid的第一|0  parms[2].Value = DBNull.Value;  parms[3].Direction = ParameterDirection.Output;  parms[3].Value = DBNull.Value;  DataSet DS = new DataSet();  try   {   if (conn.State != ConnectionState.Open) conn.Open();   cmd.Connection = conn;   cmd.CommandText = "Selected_Page_List";   cmd.CommandType = CommandType.StoredProcedure;   if (parms != null)    {    foreach (SqlParameter parm in parms)     cmd.Parameters.Add(parm);   }   SqlDataAdapter DA = new SqlDataAdapter(cmd);   DA.Fill(DS);   int aa = Convert.ToInt32(parms[3].Value.ToString());   cmd.Parameters.Clear();   if (currpage == 0)   {    DataGrid1.VirtualItemCount = aa;   }   DataGrid1.CurrentPageIndex = currpage;   DataGrid1.DataSource = DS;   DataGrid1.DataBind();  }  catch(Exception ewx)  {   conn.Close();   Response.Write (ewx.Message.ToString());   Response.End();  } }    void Page_Load(Object sender, EventArgs E ) {  if (!IsPostBack)   {   BindDataGrid(0);   // W一ơ打开q个面Q访问分늚W一?}    }    void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e) {  BindDataGrid(e.NewPageIndex);    }<br /><br />如果你有更多数据量的表稍加修改,也可以用本演示E序。其下是演示代码下蝲Q演CZ码用的是方案二。用方法看readme.txt文g?br /><br />整个演示代码 下蝲<br /><br />http://chs.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/datagrid/doc_datagrid.aspx#paging<br />q里演示了利用DataGrid 的这个功?没有本文中讨论的利用存储q程获得分区数据)。如对DataGrid的这个功能不太熟悉,请先看这里?br /><br /> <br /><br />Ҏ?<br /><br />虽然 DataGrid 控g自己带了一个分处理机Ӟ但它是将W合查询条g的所有记录读入内存,然后q行分页昄的。随着W合条g的记录数目增多,׃出现q行效率问题Q或者至是资源的利用率下降?br /><br />下面的代码示例都以下面的表结构ؓ准:<br /><br /> <br />      Articles ?    SQL Server cd     Oracle cd<br />PK     Id     int (自增)     number(9) (插入时在当前最大g?)<br />      Author     nvarchar(10)     nvarchar2(10)<br />      Title     nvarchar(50)     nvarchar2(50)<br />      PubTime     datetime     date<br /><br />SQL Server / Access {微软品中Q我们通常的自定义分页有两U思\Q?br /><br />一U是?ASP.NET Forum Z表的、“时表”方法:卛_存储q程中徏立一个时表Q该临时表包含一个序号字D(1Q?Q?Q?...Q以及表的主键(其他能够唯一定一行记录的字段也是可以的)字段。存储过E可能如下:Q编?SS1Q?br />CREATE Procedure GetAllArticles_Paged<br />(<br />     @PageIndex int,<br />     @PageSize int,<br />     @TotalRecords out int,<br />     @TotalPages out int<br />)<br />AS<br /><br />DECLARE @PageLowerBound int<br />DECLARE @PageUpperBound int<br /><br />-- Set the page bounds<br />SET @PageLowerBound = @PageSize * @PageIndex<br />SET @PageUpperBound = @PageLowerBound + @PageSize + 1<br /><br />-- Create a temp table to store the select results<br />CREATE TABLE #tmp<br />(<br />     RecNo int IDENTITY (1, 1) NOT NULL,<br />     ArticleID int<br />)<br /><br />INSERT INTO #tmp<br />     SELECT [ID]<br />     FROM Articles<br />     ORDER BY PubTime DESC<br /><br />SELECT A.*<br />FROM Articles A (nolock), #tmp T<br />WHERE A.ID = T.ArticleID AND<br />     T.RecNo > @PageLowerBound AND<br />     T.RecNo < @PageUpperBound<br />ORDER BY T.RecNo<br /><br />GO<br /><br />另一U可能更适合E序中“拼凑?SQL 语句Q用两次 TOP 命o取得我们所要的分页数据Q例如:Q编?SS2Q?br />SELECT * FROM<br />     (<br />     SELECT TOP(PageSize) * FROM<br />     (<br />          SELECT TOP (PageSize * PageIndex) *<br />          FROM Articles<br />          ORDER BY PubTime DESC<br />     )<br />     ORDER BY PubTime ASC<br />)<br />ORDER BY PubTime DESC<br /><br />q个的想法就是“掐头去䏀,q有不少分页的方法,q里׃一一列出了?br /><br />对于 Oracle 数据库,有几处不同严重妨了上面几个Ҏ的实施,比如QOracle 不支?TOP 关键字:不过q个好像q不十分严重Q因为它提供?rownum q个隐式游标Q可以实C TOP cM的功能,如:<br />SELECT TOP 10 ... FROM WHERE ...<br /><br />要写?br />SELECT ... FROM ... WHERE ... AND rownum <= 10<br /><br />rownum 是记录序P1Q?Q?...Q,但有一个比较麻烦的事情是:如果 SQL 语句中有 ORDER BY ... 排序的时候,rownum 居然是先“标号”后排序Q这Pq个序号如果不加处理是不合乎使用需求的?br /><br />至于临时表,Oracle 的时表?SQL Server 的有很大不同Q我q没搞懂q个东西Q就不妄加揣了?br /><br />国内|站中介l?Oracle 分页的资料很,我找C一个国外站点(www.faqts.comQ的一?FAQQ根据这文章的介绍Q可以如下分:Q编?Ora1Q?br />SELECT * FROM<br />     (<br />     SELECT A.*, rownum r<br />     FROM<br />          (<br />          SELECT *<br />          FROM Articles<br />          ORDER BY PubTime DESC<br />          ) A<br />     WHERE rownum <= PageUpperBound<br />     ) B<br />WHERE r > PageLowerBound;<br /><br />其中蓝色部分可以改ؓL的、需要的 SQL SELECT 语句Q这点倒是挺方便的?br /><br />Ҏ?<br /><br />今天H然发现QOracle原来可以q样实现分页功能Q?br /><br />select * from (select rownum rdd,field1,field2 from t_table where rownum<=400) where  rdd>200<br /><br />上述语句实现了从W?01条记录开始处?00条记?img src ="http://www.aygfsteel.com/freedream/aggbug/100297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freedream/" target="_blank">JAVA_UFO</a> 2007-02-21 13:50 <a href="http://www.aygfsteel.com/freedream/articles/100297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ų</a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ض</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">뽭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank">ض</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʤ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ŷ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>