上饶市做网站,住房建设和城乡管理局官网,河北商城网站建设价格低,搜狗提交网站收录入口达梦数据库中插入导出图片的方法与应用
在数据库的实际应用场景中#xff0c;图片存储是一项常见且重要的需求。以电商平台为例#xff0c;商品展示图片是吸引消费者的关键元素#xff1b;而在社交软件里#xff0c;用户头像更是个人形象的直观体现。针对达梦数据库#…达梦数据库中插入导出图片的方法与应用
在数据库的实际应用场景中图片存储是一项常见且重要的需求。以电商平台为例商品展示图片是吸引消费者的关键元素而在社交软件里用户头像更是个人形象的直观体现。针对达梦数据库业界常用的图片存储策略主要分为两大类。 第一种策略是将图片存储于磁盘数据库字段仅记录图片路径。这种方式的显著优势在于减轻了数据库的存储压力因为数据库无需直接处理图片的二进制数据。然而它存在明显的局限性一旦图片存储路径发生变更或者存储磁盘出现故障数据库应用在调用图片时就可能遭遇加载失败的问题。例如若存储图片的磁盘分区因硬件故障损坏依赖该路径的应用程序将无法正常显示相关图片。 第二种策略是将图片以二进制形式直接存储于数据库。达梦数据库采用这种方式并支持使用 blob 或 bfile 类型的字段进行存储。这种策略的优势在于保障了数据的完整性和一致性图片数据与其他相关数据集中存储于数据库便于统一管理和维护。但高分辨率图片的二进制数据量往往较大会显著增加数据库的存储负担。 接下来详细介绍在 达梦数据库中利用这两种策略插入图片的具体操作方法。
一、使用 disql 插入图片
创建表 在插入图片前需创建相应的表结构特别要注意将用于存储图片的列定义为 BLOB 类型。具体操作如下
DROP TABLE IMAGE_LOB;
CREATE TABLE IMAGE_LOB (T_ID INT NOT NULL,T_IMAGE BLOB NOT NULL,PRIMARY KEY(T_ID)
);在此表结构中T_ID 作为主键用于唯一标识每一条记录T_IMAGE 列则专门用于存储图片的二进制数据。 执行插入语句 打开 disql 工具后可通过执行以下语句完成图片插入操作
INSERT INTO IMAGE_LOB VALUES(1,F:\PIC\test.png);
COMMIT;上述语句将位于F:\PIC\路径下的test.png图片插入到 IMAGE_LOB 表中对应的记录 ID 为 1。
二、通过 manager 调用系统包插入图片
创建表 同样首先要创建表并且将插入图片的列定义为 BLOB 类型操作语句与使用 disql 创建表时一致
DROP TABLE IMAGE_LOB;
CREATE TABLE IMAGE_LOB (T_ID INT NOT NULL,T_IMAGE BLOB NOT NULL,PRIMARY KEY(T_ID)
);创建图片存放目录 需要创建一个虚拟路径目录用于存放待插入到表中的图片。例如
CREATE OR REPLACE DIRECTORY IMAGES AS F:\PIC;此语句创建了一个名为 “IMAGES” 的虚拟目录其实际指向的物理路径为F:\PIC。 创建存储过程 接下来创建一个存储过程用于实现图片插入操作。其中FILENAME参数为图片文件名例如’test.png’。
CREATE OR REPLACE PROCEDURE IMG_INSERT(TID INT,FILENAME VARCHAR(200)
) ASF_LOB BFILE;B_LOB BLOB;
BEGININSERT INTO IMAGE_LOB (T_ID, T_IMAGE) VALUES (TID,EMPTY_BLOB()) RETURN T_IMAGE INTO B_LOB;F_LOB: BFILENAME (IMAGES, FILENAME);DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB, DBMS_LOB.GETLENGTH (F_LOB));DBMS_LOB.FILECLOSE (F_LOB);COMMIT;
END;在这个存储过程中首先向 IMAGE_LOB 表中插入一条记录其中图片字段先使用EMPTY_BLOB()占位。然后通过BFILENAME函数获取图片文件路径接着以只读方式打开文件并将文件内容加载到 BLOB 字段中最后关闭文件并提交事务。 执行存储过程 执行上述创建的存储过程即可实现图片插入操作。例如
CALL IMG_INSERT(1,test.png);这条语句会将test.png图片插入到 IMAGE_LOB 表中对应的记录 ID 为 1。 查看表 插入完成后可通过以下语句查看表中的数据
SELECT * FROM IMAGE_LOB;执行该查询语句后可看到表中已成功插入图片相关记录其中图片字段显示为二进制数据。 在达梦数据库实际应用场景里不仅会有往数据库表中插入图片的需求有时也需要从数据库表中导出图片。下面将详细介绍在达梦数据库中导出图片的具体方法。
三、创建图片导出目录
在数据库中定义一个虚拟目录用于指定图片导出的本地路径。执行以下SQL语句
--定义本地图片导出目录
CREATE OR REPLACE DIRECTORY IMAGES AS D:\vm\FIC;上述语句中CREATE OR REPLACE DIRECTORY用于创建或替换一个目录对象将名为IMAGES的虚拟目录映射到本地路径D:\vm\FIC。这个路径是本地实际存在的目录用于存放导出的图片。
四、创建导出图片的存储过程
通过创建存储过程来实现从指定表中根据记录ID导出图片到之前定义的目录中。
--导出图片到本地dir
CREATE OR REPLACE PROCEDURE DUMP_IMAGE_TO_DIR(IN_TABLE_NAME VARCHAR2(1000), IN_ID INT)
ISL_FILE UTL_FILE.FILE_TYPE;L_BUFFER RAW (32767);L_AMOUNT BINARY_INTEGER : 32767;L_POS INTEGER : 1;L_BLOB BLOB;L_BLOB_LEN INTEGER;L_SQL VARCHAR2(1000);
BEGINL_SQL : SELECT T_IMAGE FROM || IN_TABLE_NAME || WHERE T_ID :1;EXECUTE IMMEDIATE L_SQL INTO L_BLOB USING IN_ID;L_BLOB_LEN : DBMS_LOB.GETLENGTH (L_BLOB);L_FILE : UTL_FILE.FOPEN (IMAGES,IN_ID||.JPG, WB, 32767);WHILE L_POS L_BLOB_LENLOOPIF L_POS L_AMOUNT -1 L_BLOB_LEN THENL_AMOUNT : L_BLOB_LEN - L_POS 1;END IF;DBMS_LOB.READ ( L_BLOB, L_AMOUNT, L_POS, L_BUFFER );UTL_FILE.PUT_RAW ( L_FILE, L_BUFFER, TRUE );L_POS : L_POS L_AMOUNT;END LOOP;UTL_FILE.FCLOSE (L_FILE);
EXCEPTION
WHEN OTHERS THENIF UTL_FILE.IS_OPEN (L_FILE) THENUTL_FILE.FCLOSE (L_FILE);END IF;RAISE;
END DUMP_IMAGE_TO_DIR;参数说明 IN_TABLE_NAME要从中导出图片的表名数据类型为VARCHAR2(1000)。IN_ID对应表中图片记录的ID数据类型为INT。 变量定义 L_FILE用于表示文件句柄数据类型为UTL_FILE.FILE_TYPE。L_BUFFER定义一个RAW类型的缓冲区大小为32767字节用于临时存储从BLOB字段中读取的数据。L_AMOUNT每次从BLOB字段读取数据的长度初始值为32767字节数据类型为BINARY_INTEGER。L_POS记录当前读取数据在BLOB字段中的位置初始值为1数据类型为INTEGER。L_BLOB用于存储从表中查询出来的图片数据BLOB类型。L_BLOB_LEN存储BLOB字段的长度数据类型为INTEGER。L_SQL用于构建动态SQL语句数据类型为VARCHAR2(1000)。 主要逻辑 构建动态SQL语句根据传入的表名和ID查询对应的图片数据BLOB类型。使用DBMS_LOB.GETLENGTH获取BLOB数据的长度。使用UTL_FILE.FOPEN打开一个文件文件名为传入的ID加上.JPG后缀路径为之前定义的IMAGES虚拟目录对应的本地路径以二进制写模式打开。通过循环读取BLOB数据并将读取的数据写入文件中。在循环过程中根据剩余数据长度调整每次读取的字节数确保完整读取BLOB数据。操作完成后使用UTL_FILE.FCLOSE关闭文件。 异常处理 如果在执行过程中发生其他异常首先检查文件是否打开如果打开则关闭文件然后重新抛出异常以便上层调用能够捕获并处理异常。
五、调用存储过程导出全表图片
通过游标遍历表中所有记录的ID调用上述存储过程实现全表图片的导出。
--调用导出过程把全表图片导出
DECLARE CURSOR cur IS SELECT T_ID FROM IMAGE_LOB;
BEGINFOR rec IN cur LOOPDUMP_IMAGE_TO_DIR(IMAGE_LOB,rec.T_ID);END LOOP;
END;定义游标使用CURSOR定义一个游标cur用于查询IMAGE_LOB表中的所有T_ID。循环调用存储过程通过FOR循环遍历游标cur中的每一条记录将表名IMAGE_LOB和当前记录的T_ID作为参数传递给DUMP_IMAGE_TO_DIR存储过程实现逐张图片导出到指定目录。
通过以上步骤就可以在达梦数据库中实现从表中导出图片的功能。在实际操作过程中请确保相关路径正确无误并且数据库用户具有相应的权限以保证导出操作的顺利进行。
综上所述在 达梦数据库中开发者可依据实际需求和应用场景灵活选择使用 disql 或通过 manager 调用系统包的方式插入图片。以及使用存储过程的方式导出图片。不同方式各有优劣在实际项目中需综合考量数据量、性能要求以及管理维护的便捷性等多方面因素从而确定最适宜的图片存储和插入方案。