zoukankan      html  css  js  c++  java
  • 用存储过程实现二进制字段的更新

    很长时间没有更新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
  • 相关阅读:
    常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway
    Linux 路由表详解及 route 命令详解
    Flannel
    Flannel
    Hugo
    Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)
    Nginx 安装
    ETCD 简介及基本用法
    Vagrant 手册之 Multi-machine 多机器
    Vagrant 手册之 Provisioning
  • 原文地址:https://www.cnblogs.com/wljcan/p/61959.html
Copyright © 2011-2022 走看看