用預存程序實現二進位欄位的更新

來源:互聯網
上載者:User
很長時間沒有更新blog了,忙是一方面,心態浮燥可能是主要原因。

這段時間一直在實現系統在Oracle上的實現問題,由於一開始的時候,在資料庫訪問方面使用抽象工廠的模式,因此程式改動不是很大,工作量主要集中在資料庫的移植方面(表、視圖、預存程序、觸發器等)。移植之後對系統進行測試,發現了一個很有意思的問題: 使用oracle之後,系統在某些方面比在Sql server上慢很多(使用 oracle client和oledb一樣),後來發現是因為這樣引起的:

  for ()

{
    DataSet Ds=Open("select * from ... where ...")
    foreach(DataRow dr in Ds.Table[0].Rows)
    {
          ...
    }
}

改成這樣就快了很多(速度和sqlserver差不多) :
DataSet Ds=Open("select * from ...")

 for ()

{
        foreach(DataRow dr in Ds.Table[0].Select(...))
    {
          ...
    }
}

但是這一改進在Sqlserver上不是很明顯。

後來使用 Oracle的ODP.net 發現速度提高很多,效能遠高於oracle client和oledb,但是在使用的過程中發現了一個問題:在用DataSet的方式更新Blob欄位時,速度比較慢,後來考慮使用預存程序,如下:

CREATE OR REPLACE procedure updateclob(
     v_tablename  in varchar2, --要更新的表名
     v_cmid     in raw,     --表的主鍵ID
     v_geometry  in blob       --新的繪圖物件
    )
is
    lobloc  blob;
     query_str  varchar2(1000);
begin
--取出blob對象
   query_str :='select geometry from '||v_tablename||' where cmid= :id for update ';
   EXECUTE IMMEDIATE query_str INTO lobloc USING v_cmid;
   --更新
   dbms_lob.write(lobloc, utl_raw.length(v_geometry),1, v_geometry);
 
   commit;
end;
/

另外Sql server的更新過程如下:
  create     procedure updateclob(
     @tablename   varchar(60),  --要更新的表名
     @cmid      uniqueidentifier,     --主鍵ID
     @geometry   image                 --新的繪圖物件
    )
as  
     DECLARE @ptrval varbinary(16)
    declare @SQLString  nvarchar(1000)
begin
    SET @SQLString = N' SELECT  @ptrval  = TEXTPTR(geometry)  from  ' + @tablename +' where cmid=''' + cast(@cmid  as varchar(60)) + ''''
    EXECUTE sp_executesql @SQLString,N'@ptrval varbinary(16) output',@ptrval output
    set @SQLString=N'WRITETEXT ' +@tablename +'.geometry @ptrval @geometry'
    EXECUTE sp_executesql @SQLString ,N'@ptrval varbinary(16),@geometry image',@ptrval,@geometry
end
go

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.