ORACLE批量导入图片到BLOB字段代码示例

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

所以就选择先用一张临时表来暂时保存从文件系统读取的照片,用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批量导入图片到BLOB字段代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:oracle 数据库启动阶段分析 、ORACLE SQL语句优化技术要点解析 、oracle中length、lengthb、substr、substrb函数用法介绍 等,有什么问题可以随时留言,小编会及时回复大家的。也希望朋友们对我们网站多多支持!

(0)

相关推荐

  • ORACLE SQL语句优化技术要点解析

    操作符优化: IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询. 由此可见用IN的SQL至少多了一个转换的过程.一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了. 推荐方案:

  • Linux下修改Oracle监听地址的方法

    lisenter.ora 目录在 /opt/oracle/11g/network/admin LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.111.123)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /opt/oracle tnsnames.o

  • oracle数据匹配merge into的实例详解

    oracle数据匹配merge into的实例详解 前言: 很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表的数据进行匹配,这两个表的数据结构一致,一个是正式表,一个是临时表,这两表数据量还算是比较大几百M.业务需求是用临时表中的数据和正式表的匹配,所有字段都需要一一匹配,而且两表还没有主键,这是一个比较麻烦和糟糕的事情. 场景: 1.如果两表所有字段值都一致则不处理: 2.如果有部分字段不一致则更新: 3.如果正式表中数据在临时表中不存在,则需要删除: 满足上面场

  • 常用的Oracle doc命令(收藏)

    1.连接数据库 普通用户连接数据库: conn scott/tiger –(默认的用户名/密码).conn 即"connection"连接数据库的意思 超级管理员连接: Conn sys/sys as sysdba–oracle数据库不区分大小写 2.sql文件 保存sql文件 save c:\test.txt 编辑sql语句,用记事本编辑 ed c:\1.txt –编辑 SQL 语句 ed –直接打开上一次缓存sql语句 描述数据表的结构 desc employee; –打开empl

  • Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法.分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL. 首先,在数据库端创建简单的存储过程. create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is begin o_msg := i_user ||', Good Morning!'; end; 然后,开始在Pytho

  • oracle数据库导入导出命令解析

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢失). Oracle有个好处,虽然你的电脑不是服务器,但是你装了oracle客户端,并建立了连接(通过Net Configuration Assistant添加正确的服务命名,其实你可以想成是客户端与服务器端 修了条路,然后数据就可以被拉过来了) 这样你可以把数据导出到本地,虽然可能服务器离你很远.

  • 浅谈oracle rac和分布式数据库的区别

    1.分布式数据库是多个数据库,而rac只是一个库多个实例: 2.rac事务上没有协调的问题,而分布式数据库由于是多个库需要事务上的协调: 3.分布式数据库数据是分散存储在各个节点,但是设备一般都是廉价的设备,经常出现节点故障,不过对用户来说是透明的:.RAC是ORACLE集群,数据是共享存储,只有一份,每个节点都不存放数据.节点可以宕,但是数据不会丢失: 4.分布式数据库支持的节点多,增加节点基本为线性增加:rac支持的节点数少,增加节点性能不是线性增加: 5.Oracle最大的问题在于shar

  • ORACLE批量导入图片到BLOB字段代码示例

    要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间. 所以就选择先用一张临时表来暂时保存从文件系统读取的照片,用DBMS_LOB的方法来处理. 第一步:创建一个数据库可以访问的目录(注意:这个目录是数据库服务器上的目录,不是客户机上的) -- Create directory create or replace directory 图片目录 as 'E:\照片'; 第二步:将图片文件放入刚建好的目录下面,

  • Python批量修改图片分辨率的实例代码

    前言:处理图片需要,需把图片都转换成1920*1280的大小, python实现很方便,需要导入图片处理的Image包和匹配的glob包,很简单,代码如下: img_path = glob.glob("D:/chosed/*.jpg") path_save = "D:/closedd" for file in img_path: name = os.path.join(path_save, file) im = Image.open(file) im.thumbna

  • oracle分区索引的失效和重建代码示例

    上一篇文章中我们了解了oracle普通表转化为分区表的方法的相关内容,接下来的这篇文章,我们将探讨oracle分区索引的失效和重建问题,提供了相关代码示例供大家参考,具体如下. --创建测试表 SQL> create table t as select object_id,object_name from dba_objects; 表已创建. SQL> select min(object_id),max(object_id) from t; MIN(OBJECT_ID) MAX(OBJECT_

  • Oracle批量导入文本文件快速的方法(sqlldr实现)

    前言 最近做项目的时候需要导入一批3000多万条的POI数据到Oracle数据库,简单的插入导入速度太慢,使用sqlldr 批量导入3000多万条数据花了20分钟左右,速度还可以,现在分享给大家,具体方法如下: 1.新建导入控制文件 input.ctl,文件内容如下: Load data Characterset UTF8 Infile 'H:\POI\baidu.txt' Append into table tbl_poi_baidu fields terminated by ","

  • JavaScript实现图片滑动切换的代码示例分享

    假设我们这里有1到5五张bmp图片,那么控制图片切换显示的核心代码可以为: <script> var i=1; var img = new Array(); img[0] = "1.bmp"; img[1] = "2.bmp"; img[2] = "3.bmp"; img[3] = "4.bmp"; img[4] = "5.bmp"; function playImg(){ i=i+1; var

  • JavaScript实现图片轮播组件代码示例

    本文介绍了JavaScript实现图片轮播组件,废话不多说了直接看下面: 效果: 自动循环播放图片,下方有按钮可以切换到对应图片. 添加一个动画来实现图片切换. 鼠标停在图片上时,轮播停止,出现左右两个箭头,点击可以切换图片. 鼠标移开图片区域时,从当前位置继续轮播. 提供一个接口,可以设置轮播方向,是否循环,间隔时间. 对HTML.CSS的要求: <div class="carousel-box"> <div class="carousel"&g

  • 如何利用Vue3+Vite批量导入模块/资源

    目录 前言 1,前置基础知识-JavaScript模块化编程 (1)export语句-暴露函数和变量使外部调用 (2)import语句-导入变量/函数并使用 (3)import*asxxx语句-全部导入 (4)exportdefault-默认导出 2,在Vite工程中批量导入js模块 3,在Vite工程中批量导入图片/音频等静态资源 总结 前言 在Vue项目开发中,我们常常会导入一些外部的模块,或者是自己写模块导入. 但是模块多了,一个个地导入很显然不是一个好办法,因此我们可以批量导入. 1,前

  • Unity3D实现批量下载图片功能

    本文实例为大家分享了Unity3D实现批量下载图片功能的具体代码,供大家参考,具体内容如下 下一篇文章试试用线程下载 代码如下 using System.IO; using UnityEngine; using System.Net; using System.Collections; public class Test : MonoBehaviour { private string[] _urls=new string[10]; private string [] _localPath =

  • python批量修改图片大小的方法

    本文实例为大家分享了python批量修改图片大小的具体代码,供大家参考,具体内容如下 引用的模块 from PIL import Image Image的使用 def resize_image(img_path): try: mPath, ext = os.path.splitext(img_path) if astrcmp(ext, ".png") or astrcmp(ext, ".jpg"): img = Image.open(img_path) (width

  • Java 批量删除Word中的空白段落示例代码

    1. 测试文档.期望达到的目标文档效果 用于测试的Word文档如下所示,包含的空白段落影响文章整体布局及美观性: 目标文档效果: 2. 辅助工具 2.1 使用类库:Free Spire.Doc for Java(免费版) 2.2 类库jar导入(2种导入方法供参考): ①. 通过官网下载jar包,解压,手动将lib文件夹下的Spire.Doc.jar导入java程序: ②. Maven程序中导入jar需先配置pom.xml文件,然后导入程序,如下配置: <repositories> <r

随机推荐