ORACLE資料庫分頁

2021-04-12 15:35:33 字數 4972 閱讀 3999

create proc p_show

@querystr nvarchar(4000),           --表名、檢視名、查詢語句

@pagesize int=10,   --每頁的大小(行數)

@pagecurrent int=1,   --要顯示的頁

@fdshow nvarchar (4000)='', --要顯示的字段列表,如果查詢結果有標識字段,需要指定此值,且不包含標識字段

@fdorder nvarchar (1000)='', --排序字段列表

@sql varchar(4000)='',

@getcount int=0 out   -- 記錄數

asbegin

exec(@sql)

endbegin

declare @fdname nvarchar(250) --表中的主鍵或表、臨時表中的標識列名

,@id1 varchar(20),@id2 varchar(20) --開始和結束的記錄號

,@obj_id int    --物件id

--表中有復合主鍵的處理

declare @strfd nvarchar(2000) --復合主鍵列表

,@strjoin nvarchar(4000) --連線字段

,@strwhere nvarchar(2000) --查詢條件

select @obj_id=object_id(@querystr)

,@fdshow=case isnull(@fdshow,'') when '' then ' *' else ' '+@fdshow end

,@fdorder=case isnull(@fdorder,'') when '' then '' else ' order by '+@fdorder end

,@querystr=case when @obj_id is not null then ' '+@querystr else ' ('+@querystr+') a' end

--如果顯示第一頁,可以直接用top來完成

if @pagecurrent=1 

begin

select @id1=cast(@pagesize as varchar(20))

exec('select top '+@id1+@fdshow+' from '+@querystr+@fdorder)

return

end--如果是表,則檢查表中是否有標識更或主鍵

if @obj_id is not null and objectproperty(@obj_id,'istable')=1

begin

select @id1=cast(@pagesize as varchar(20))

,@id2=cast((@pagecurrent-1)*@pagesize as varchar(20))

select @fdname=name from syscolumns where id=@obj_id and status=0x80

if @@rowcount=0   --如果表中無標識列,則檢查表中是否有主鍵

begin

if not exists(select 1 from sysobjects where parent_obj=@obj_id and xtype='pk')

goto lbusetemp  --如果表中無主鍵,則用臨時表處理

select @fdname=name from syscolumns where id=@obj_id and colid in(

select colid from sysindexkeys where @obj_id=id and indid in(

select indid from sysindexes where @obj_id=id and name in(

select name from sysobjects where xtype='pk' and parent_obj=@obj_id

)))if @@rowcount>1  --檢查表中的主鍵是否為復合主鍵

begin

select @strfd='',@strjoin='',@strwhere=''

select @strfd=@strfd+',['+name+']'

,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'

,@strwhere=@strwhere+' and b.['+name+'] is null'

from syscolumns where id=@obj_id and colid in(

select colid from sysindexkeys where @obj_id=id and indid in(

select indid from sysindexes where @obj_id=id and name in(

select name from sysobjects where xtype='pk' and parent_obj=@obj_id

)))select @strfd=substring(@strfd,2,2000)

,@strjoin=substring(@strjoin,5,4000)

,@strwhere=substring(@strwhere,5,4000)

goto lbusepk

endend

endelse

goto lbusetemp

/*--使用標識列或主鍵為單一欄位的處理方法--*/

lbuseidentity: 

exec('select top '+@id1+@fdshow+' from '+@querystr

+' where '+@fdname+' not in(select top '

+@id2+' '+@fdname+' from '+@querystr+@fdorder

+')'+@fdorder

)return

/*--表中有復合主鍵的處理方法--*/

lbusepk:  

exec('select '+@fdshow+' from(select top '+@id1+' a.* from

(select top 100 percent * from '+@querystr+@fdorder+') a

left join (select top '+@id2+' '+@strfd+'

from '+@querystr+@fdorder+') b on '+@strjoin+'

where '+@strwhere+') a'

)return

/*--用臨時表處理的方法--*/

lbusetemp:  

select @fdname='[id_'+cast(newid() as varchar(40))+']'

,@id1=cast(@pagesize*(@pagecurrent-1) as varchar(20))

,@id2=cast(@pagesize*@pagecurrent-1 as varchar(20))

exec('select '+@fdname+'=identity(int,0,1),'+@fdshow+'

into #tb from '+@querystr+@fdorder+'

select '+@fdshow+' from #tb where '+@fdname+' between '

+@id1+' and '+@id2

)end

goasp中使用方法:

<%

page = trim(request.querystring("page"))

if page="" then

ipage = 1

else

ipage = cint(page)

end if

pagesize = 30

set rs = server.createobject("adodb.recordset")

sqlstr="select top 1000000 id,lovedress,chattoolnote,email from [5years_vote]  order by id desc "

sqlstr1="select count(1) from [5years_vote]"

sql="p_show '"&sqlstr&"',"&pagesize&","&ipage

'response.write sql

'response.end

rs.open sql, conn, 3,3

'response.write sqlstr

'response.end

sda.fill(ds) ;

//data=ds.tables[1];

return ds ;

}private sqlcommand selectcommand ;

public static string p_show = "p_show";      // 分頁使用的儲存過程名稱

public static string querystr_parm  = "@querystr" ;  // 向分頁儲存過程裡傳入的 sql 語句

public static string sql_parm   = "@sql" ;   // 檢索行數

public static string pagesize_parm  = "@pagesize" ;  // 向分頁儲存過程裡傳入的 每頁顯示行數的值

public static string pagecurrent_parm = "@pagecurrent" ; // 當前顯示的頁碼

public static string fdshow_parm  = "@fdshow" ;   // 傳入返回時要顯示的列,用逗號隔開。例:"col1,col2"

public static string fdorder_parm  = "@fdorder" ;  // 排序

public sqlcommand getcommand()

Oracle 資料庫分頁

1.oracle 資料庫分頁 要實現資料庫的分頁,需要知道記錄的總條數totalcount,以及頁碼page,每頁的大小pagesize。1 action protected int totalcount 總條數 protected int pagesize 每頁大小 protected int p...

Oracle資料庫分頁

在oracle資料庫中進行分頁查詢需要借助rownum偽列,並且查詢語句一共分為三層 第三層限制最小記錄數 第二層限制最大記錄數 第一層做條件限制 例如 將employees表中的employee id,first name分頁顯示,每頁十條記錄。那麼第一頁 select from select f...

oracle資料庫分頁

新建乙個分頁的類 public class pager public int getcurpage public void setcurpage int curpage public int getpagesize public void setpagesize int pagesize publi...