云南工程建设总承包公司官网/优化疫情政策

云南工程建设总承包公司官网,优化疫情政策,网站建设周期计划,广东省城乡建设和管理委员会网站达梦数据库中插入导出图片的方法与应用 在数据库的实际应用场景中,图片存储是一项常见且重要的需求。以电商平台为例,商品展示图片是吸引消费者的关键元素;而在社交软件里,用户头像更是个人形象的直观体现。针对达梦数据库&#…

达梦数据库中插入导出图片的方法与应用

在数据库的实际应用场景中,图片存储是一项常见且重要的需求。以电商平台为例,商品展示图片是吸引消费者的关键元素;而在社交软件里,用户头像更是个人形象的直观体现。针对达梦数据库,业界常用的图片存储策略主要分为两大类。
第一种策略是将图片存储于磁盘,数据库字段仅记录图片路径。这种方式的显著优势在于减轻了数据库的存储压力,因为数据库无需直接处理图片的二进制数据。然而,它存在明显的局限性,一旦图片存储路径发生变更,或者存储磁盘出现故障,数据库应用在调用图片时就可能遭遇加载失败的问题。例如,若存储图片的磁盘分区因硬件故障损坏,依赖该路径的应用程序将无法正常显示相关图片。
第二种策略是将图片以二进制形式直接存储于数据库。达梦数据库采用这种方式,并支持使用 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;
  1. 参数说明
    • IN_TABLE_NAME:要从中导出图片的表名,数据类型为VARCHAR2(1000)
    • IN_ID:对应表中图片记录的ID,数据类型为INT
  2. 变量定义
    • 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)
  3. 主要逻辑
    • 构建动态SQL语句,根据传入的表名和ID查询对应的图片数据(BLOB类型)。
    • 使用DBMS_LOB.GETLENGTH获取BLOB数据的长度。
    • 使用UTL_FILE.FOPEN打开一个文件,文件名为传入的ID加上.JPG后缀,路径为之前定义的IMAGES虚拟目录对应的本地路径,以二进制写模式打开。
    • 通过循环读取BLOB数据,并将读取的数据写入文件中。在循环过程中,根据剩余数据长度调整每次读取的字节数,确保完整读取BLOB数据。
    • 操作完成后,使用UTL_FILE.FCLOSE关闭文件。
  4. 异常处理
    • 如果在执行过程中发生其他异常,首先检查文件是否打开,如果打开则关闭文件,然后重新抛出异常,以便上层调用能够捕获并处理异常。

五、调用存储过程导出全表图片

通过游标遍历表中所有记录的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;
  1. 定义游标:使用CURSOR定义一个游标cur,用于查询IMAGE_LOB表中的所有T_ID
  2. 循环调用存储过程:通过FOR循环遍历游标cur中的每一条记录,将表名IMAGE_LOB和当前记录的T_ID作为参数传递给DUMP_IMAGE_TO_DIR存储过程,实现逐张图片导出到指定目录。

通过以上步骤,就可以在达梦数据库中实现从表中导出图片的功能。在实际操作过程中,请确保相关路径正确无误,并且数据库用户具有相应的权限,以保证导出操作的顺利进行。

综上所述,在 达梦数据库中,开发者可依据实际需求和应用场景,灵活选择使用 disql 或通过 manager 调用系统包的方式插入图片。以及使用存储过程的方式导出图片。不同方式各有优劣,在实际项目中,需综合考量数据量、性能要求以及管理维护的便捷性等多方面因素,从而确定最适宜的图片存储和插入方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

【C++项目实战】校园公告搜索引擎:完整实现与优化指南

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、项目概述 &#x1f4d6;1.项目背景 &#x1f4d6;2.主要功能 &#x1f4d6;3.界面展…

MySQL数据库复制

文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库&#xff0c;支撑它如此出彩的因素主要有两个&am…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统&#xff0c;结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势&#xff0c;为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能&#xff0c;还拥有一个漂亮且…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

最完美的WPF无边框设计!

常规的无边框方法设计 常规的WPF无边框设计方法都是通过AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome样式来实现,但是这样会有问题就是,窗体最大化的时候将底部任务栏给挡住了,另外最大化的时候不能拖动窗体。参考这个大佬的设计@ 若…

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…

32单片机——LED

LED原理图如图所示&#xff1a; 代码 DS0和DS1每过500ms一次交替闪烁&#xff0c;实现类似跑马灯的效果 GPIO输出配置步骤 &#xff08;1&#xff09;使能对应GPIO时钟 STM32在使用任何外设之前&#xff0c;我们都要先使能其时钟&#xff08;下同&#xff09;。本实验用到…

贪心算法和遗传算法优劣对比——c#

项目背景&#xff1a;某钢管厂的钢筋原材料为 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 种规格 &#xff0c;现用贪心算法和遗传算法两种算法进行计算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…

【Java篇】一法不变,万象归一:方法封装与递归的思想之道

文章目录 Java 方法的使用&#xff1a;从基础到递归的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定义1.3 方法调用的执行过程1.4 实参和形参的关系1.5 没有返回值的方法 二、方法重载2.1 为什么需要方法重载2.2 方法重载的概念2.2.4 C 和 Java 的比较&…

实验5 逻辑回归

实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本&#xff0c;使用逻辑回归算法进行参数估计&#xff0c;并画出分类边界 【实验要求】写明实验步骤&#xff0c;必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…

思维训练让你更高、更强 |【逻辑思维能力】「刷题训练笔记」假设法模式逻辑训练题(1-5)

每日一刷 思维训练让你更高、更强&#xff01; 题目1 谁在说谎&#xff0c;谁拿走了零钱&#xff1f; 姐姐上街买菜回来后&#xff0c;就随手把手里的一些零钱放在了抽屉里&#xff0c;可是&#xff0c;等姐姐下午再去拿钱买菜的时候发现抽屉里的零钱没有了&#xff0c;于是&…

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

【Python】dash-fastapi前后端搭建

概述 项目中需要快速搭建一个前后端系统&#xff0c;涉及到dash-fastapi架构的时候&#xff0c;对该架构的时候进行总结。本文主要总结的是对该架构的基本使用&#xff0c;后续再对该架构的项目源码进行总结分析 此处实现一个小的demo&#xff0c;迷你任务管理器&#xff0c;…

IDEA中链接使用mysql数据库

一、连接mysql 1. 打开idea&#xff0c;在右上角侧边栏有数据库database插件&#xff0c;打开侧边栏点击加号->数据源&#xff0c;可以看到支持很多数据库&#xff0c;选择mysql。 2. 首次使用需要下载驱动程序&#xff0c;不然连接数据库会报错。找到mysql&#xff0c;点击…

程序编译生成的文件

目录 .i 文件 .s 文件 .o文件 总结 在 C 编程中&#xff0c;.i、.s和 .o 文件是编译过程中生成的不同阶段的文件&#xff0c;它们代表不同的含义&#xff1a; .i 文件 全称 &#xff1a;预处理后的文件&#xff08;Intermediate File&#xff09;。 含义&#xff1a;.i文件…

[S32K]SPI

SpiShiftClockidleLevel: CLK空闲时电平(CPOL)&#xff1b; SpiDataShifrEdge:数据移位边沿(CPHA)&#xff1b; SpiDataWidth: SpiTransferStart: MSB(高位起始)&#xff0c;LSB(低位起始)&#xff1b;&#xff1b; SpiHwUnit: 这是一个具体的硬件&#xff1f; SpiDataShiftE…

系统思考:客户价值

“真正的市场竞争&#xff0c;不是比谁更能制造产品&#xff0c;而是比谁更能创造价值。” ——杰夫贝索斯 在组织辅导中&#xff0c;我经常问团队一个问题&#xff1a;“我们的客户是谁&#xff1f;”大多数人的第一反应是——“支付费用的就是客户。” 这在过去的市场扩张阶…

ArcGIS Pro 车牌分区数据处理与地图制作全攻略

在大数据时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术在各个领域都有着广泛的应用&#xff0c;而 ArcGIS Pro 作为一款功能强大的 GIS 软件&#xff0c;为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据&#xf…