用存储过程实现二进制字段的更新

很长时间没有更新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

posted on   wljcan  阅读(2970)  评论(10编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通

导航

< 2004年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示