当前位置:  数据库>oracle

Oracle批量导入图片到blob字段

    来源: 互联网  发布时间:2017-06-26

    本文导语: 要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间。 所以就选择先用一张临时表来暂时保存从文件系统读取的照片,...

要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间。

所以就选择先用一张临时表来暂时保存从文件系统读取的照片,用DBMS_LOB的方法来处理。

第一步:创建一个数据库可以访问的目录(注意:这个目录是数据库服务器上的目录,不是客户机上的)

-- Create directory
create or replace directory 图片目录
  as 'E:照片';

第二步:将图片文件放入刚建好的目录下面,不要在新建文件夹,就放在这个根目录

第三步:根据自己的具体需求,编写存储过程,在做之前,我也在网上找了很多,但基本都只是大概说一下,没有找到比较完整的,这里就把自己的项目源码贴出来,供大家学习交流。

CREATE OR REPLACE PROCEDURE PRO_插入图片(V_表名 IN VARCHAR2) IS
  P_FILENAME VARCHAR2(50); --照片名,动态拼接得到
  P_证件号码 VARCHAR2(50);
  P_姓名    VARCHAR2(50);--这个照片名是通过姓名+证件号拼接得到的,因为基础测试数据没有提供真实的证件号码,就选择用手机号来代替
  P_查询SQL  VARCHAR2(500);
  P_更新SQL  VARCHAR2(5000);
  P_LOB      BLOB;
  P_FILE    BFILE;
  TYPE P_REF_CURSOR IS REF CURSOR; --定义动态游标变量类型
  P_CURSOR P_REF_CURSOR; --定义动态游标变量,因为一次要插入全表的照片,所以选择用游标来处理
  TYPE P_ROW_RECORD IS RECORD(
    证件号码 VARCHAR2(50),
    姓名    VARCHAR2(50));
  C_ROW P_ROW_RECORD;
  V_ERR VARCHAR2(300);
BEGIN
  P_更新SQL := 'update ' || V_表名 || ' set 证件号码=手机号码 WHERE 证件号码 IS NULL';

--用手机号来代替证件号码为空的数据
  EXECUTE IMMEDIATE P_更新SQL;
  COMMIT;
  P_查询SQL := 'SELECT  证件号码,姓名 FROM ' || V_表名 ||
            '  WHERE 证件号码 IS NOT NULL and 照片 IS NULL order by 证件号码';
  OPEN P_CURSOR FOR P_查询SQL;
  LOOP
    begin
      FETCH P_CURSOR
        INTO C_ROW;
      EXIT WHEN P_CURSOR%NOTFOUND;

--获取证件号码和姓名,先排除空格等脏数据,然后拼接成文件名;
      P_证件号码 := C_ROW.证件号码;
      P_姓名    := C_ROW.姓名;
      SELECT REPLACE(P_证件号码, ' ', '') INTO P_证件号码 FROM DUAL;
      SELECT substr(P_证件号码, 1, 11) INTO P_证件号码 FROM DUAL;
      SELECT REPLACE(P_姓名, ' ', '') INTO P_姓名 FROM DUAL;
      P_FILENAME := P_证件号码 || P_姓名 || '.jpg';
      SELECT REPLACE(P_FILENAME, ' ', '') INTO P_FILENAME FROM DUAL;

--以下便是插入图片的核心代码
      INSERT INTO TA_照片总表_TEMP
        (证件号码, 姓名, 照片)
      VALUES
        (P_证件号码, P_姓名, EMPTY_BLOB()) RETURN 照片 INTO P_LOB;
      --获取指定目录下的文件
      P_FILE := BFILENAME('图片目录', P_FILENAME);
      --以只读的方式打开文件
      DBMS_LOB.FILEOPEN(P_FILE, DBMS_LOB.FILE_READONLY);
      --传递对象
      DBMS_LOB.LOADFROMFILE(P_LOB, P_FILE, DBMS_LOB.GETLENGTH(P_FILE));
      --关闭原始文件
      DBMS_LOB.FILECLOSE(P_FILE);
      COMMIT;

--通过更新语句来向目标表插入图片
      P_更新SQL := 'UPDATE ' || V_表名 ||
                '  A SET a.照片=(SELECT 照片 FROM TA_照片总表_TEMP b
                WHERE A.证件号码 = B.证件号码 and a.姓名=b.姓名 AND ROWNUM=1)
      WHERE EXISTS (SELECT 1 FROM TA_照片总表_TEMP  B WHERE A.证件号码 = B.证件号码 and a.姓名=b.姓名)';
      EXECUTE IMMEDIATE P_更新SQL;
      COMMIT;
    EXCEPTION

--处理异常情况,这个可以在出现异常时跳过异常继续跑。正常数据依然可以插入,并且记录异常信息,方便异常处理。这个是因为第一次写的过程一报错就断掉了,本来可以插入的图片也无法继续,然后就做了这个优化。
      WHEN OTHERS THEN
        rollback;
        V_ERR := SUBSTR(SQLERRM, 1, 150) || '照片名:' || P_FILENAME;

--定义一张异常信息记录表,是一个非常好的习惯
        INSERT INTO TA_程序运行异常记录
        VALUES
          (SQ_异常序列.NEXTVAL, 'PRO_插入图片', V_ERR, SYSDATE);
        COMMIT;
    end;
  END LOOP;
  CLOSE P_CURSOR;
  COMMIT;
  DELETE TA_照片总表_TEMP;
  COMMIT;
END PRO_插入图片;

然后测试、运行,基本都没问题,不过图片的大小,很影响实际插入的时间,这个时间的优化目前还没有好的对策。


    
 
 

您可能感兴趣的文章:

  • ORACLE数据库常用字段数据类型介绍
  • oracle 实际值超过数据库某个字段指定长度报错解决
  • Oracle用什么语句查询字段?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • 与Oracle连接时,怎样添加Bolb,Clob字段?急!!!!!
  • oracle删除表字段和oracle表增加字段
  • 请问保存文章内容的字段应用什么类型的(oracle),急!!!
  • 请问jboss+oracle文件怎样配置,数据库中文字段不为乱码
  • ****请教关于oracle中date型字段的显示问题。谢谢!!!**
  • Oracle 中文字段进行排序的sql语句
  • oracle中怎么没有boolean类型的字段?应该用什么代替?
  • 怎样将当前时间写到Oracle中date类型的字段中!!!!!!!!!!!!
  • 如何向oracle库中字段类型是date的添加数据
  • Oracle中大字段问题,数据大了就写不进去了。
  • Oracle 自增(auto increment) 或 标识字段的建立方法
  • jsp显示oracle中varchar2类型字段 在线等待
  • 在oracle数据库里创建自增ID字段的步骤
  • oracle关键字作为字段名使用方法
  • Oracle 查询表信息获取表字段及字段注释
  • jsp如何选择更新oracle的date字段
  • Oracle 实现类似SQL Server中自增字段的一个办法
  • oracle 数据泵导入导出介绍 iis7站长之家
  • oracle 数据泵导入导出介绍
  • oracle10g 数据备份与导入
  • 求高手指点shell导入.dat文件到ORACLE数据库
  • 怎样把solaris系统下oracle数据导入access中??请教!!急~
  • 用Oracle管理服务器将数据导入与导出
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • Linux环境中Oracle数据导入与导出备份操作
  • oracle的导入导出注意事项及心得分享
  • oracle数据库导入导出命令使用方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 哪位大哥奉献一段调试通过的oracle中存取图片的例子oracle8.1.7,resin-2.1.6
  • ejb的bmp向oracle表插入图片记录的问题!
  • 请问如何用Java从Oracle数据库中读取媒体文件,如图片,mpeg 等
  • 用jspsmart上传图片到oracle,图片大小受限
  • 高分求助:在oracle中保存图片问题
  • 小弟想直接上传图片到Oracle的Blob中,诸位仁兄给点思路或提示或资料或源码
  • 利用可更新ResultSet的updateBinaryStream()可以把图片存到mySql数据库,却不能存到Oracle数据库,怎么办?
  • jsp向oracle数据库插入图片出错!急!为什么?
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • Oracle 12c的九大最新技术特性介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • ORACLE中DBMS_RANDOM随机数生成包
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3