熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

為數據庫的表自動生成行號----為分頁打好基礎

2013-11-13 15:25:38  來源: Oracle 

  在以數據庫為基礎的應用程序開發中分頁是一個比較常用的操作
可惜的是SQL Server中沒有Oracle中相應的ROWNUM屬性可用
觸發器生成一個ROWNUM列]
勉強可以一用當然用如下的SQL語句也可以生成第i頁每頁n行tid是主鍵列
select top n  * from tab
 where strWhere  and  tid>(select max(tid)
                                          from (select top (i)*n  tid from tab  where  strWhere  order by tid ) as T)
                                         )
order by tid
也可以但是我想用另一種方法也未嘗不可
因此就有自動生成ROWNUM列的想法
eg:
     建表
CREATE TABLE [dbo][orderEmp] (
 [rownum] [int] NOT NULL 同時該列要求有唯一性約束
 [ordID] [int] IDENTITY ( ) NOT NULL 主鍵列
 [empID] [int] NOT NULL
 [empTxt] [varchar] () COLLATE Chinese_PRC_CI_AS NOT NULL
 [empDate] [datetime] NOT NULL 此列上建聚集索引
) ON [PRIMARY]
對插入語句處理的觸發器
CREATE  TRIGGER orderEmpAddTrg
ON  orderEmp
instead of   INSERT
AS
begin
    declare  @rw int
    select  @rw=
    select @rw=max(rownum) from orderEmp
    if(@rw is null)
         select @rw=
    select  @rw=@rw+
  INSERT INTO orderEmp(rownumempIDempTxtempDate)
  SELECT @rw iempIDiempTxtiempDate
  FROM inserted  i
end

  刪除的觸發器
CREATE TRIGGER orderEmpDelTrg
ON dboorderEmp
FOR  DELETE
AS
begin
    set nocount on
    declare  @rw int
    declare   @tab table(rw int)
    insert into @tab
    select   rownum from deleted
    order by rownum desc  不可以掉至於為什麼大家自己試試就知道了
    declare  cp cursor
     for
     select   rw from @tab
     open cp
     fetch next from cp into  @rw
     while  @@fetch_status=
      begin
         update    orderEmp
          set        rownum=rownum
         where     rownum>@rw
         fetch next from cp into @rw
      end
    close  cp
    deallocate cp
    set nocount off
end
這個觸發器是為屏掉用戶直接從SQL企業管理器 打開表後對表中的ROWNUM列進行修改
可能不完全
但是通過UPdate語句操作表的時只要不修改rownum列是不會出現問題的
CREATE TRIGGER orderEmpUpdTrg
ON orderEmp
FOR  UPDATE
AS
  begin
  IF UPDATE (rownum)
     RAISERROR (ROWNUM列不可以自行修改! )
  ROLLBACK TRANSACTION

  end  
添加新記錄的存儲過程如下
create    PROCEDURE [addOrderEmp]
 ( @empID  [int]
  @empTxt  [varchar]()
  @empDate  [datetime])

  AS INSERT INTO [orderEmp]
  (  [rownum]  [empID]  [empTxt]  [empDate])
 
VALUES
 (          @empID  @empTxt  @empDate)是一定要的但是不會影響ROWNUM列只是為了
占用內存而已
下面是我的測試用例:

  insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
select    * from orderemp  order by rownum
delete from  orderemp where   empid> and empid<
select    * from orderemp  order by rownum
至於更新的語句嗎
只要不更新ROWNUM列就不用處理了

  注一定要把數據庫的服務器設置>服務器行為>第二個選項不要選中


From:http://tw.wingwit.com/Article/program/Oracle/201311/16686.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.