jdbc中如何处理Oracle BLOB字段(经典)

Oracle JDBC存入图片Blob 创建测试表create table test_img( id integer primary key, name varchar2(32), image blob ); 存储图片import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; imp 阅读详情

转载的一篇文章,不足之处请大家指出

为什么我要写这篇文章?

在前段时间我所在的项目中,就碰到了这个问题,我花了2天的时间才将BLOB的问题搞定。我也尝试过网上所介绍的各种方法,那些方法所

使用的原理都一致,但都写得不完整,我也按照网上介绍的方法做了,但都因为其中一些没有提到的小的细节而失败。希望看到这篇文章的人

都不再走弯路。

一般人会走哪些弯路?
1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob

(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法

都是错误的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,

发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。

根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:
1.新建记录,插入BLOB数据
 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:
  insert xxxtable(A,B,C) values(empty_blob(),'xxx','yyyy')
 1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:
  conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.
 1.3 查询刚才插入的记录,后面要加“ for update ”,如下:
  select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked

的异常
 1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下:
  BLOB blob = (BLOB) rs.getBlob("A");
  OutputStream os = blob.getBinaryOutputStream();
  BufferedOutputStream output = new BufferedOutputStream(os);

  后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:
  BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());
  byte[] buff = new byte[2048];  //用做文件写入的缓冲
  int bytesRead;
  while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
   output.write(buff, 0, bytesRead);
   System.out.println(bytesRead);
  }
  上面的代码就是从input里2k地读取,然后写入到output中。
 1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet
 1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性
2.修改记录,方法与上面的方法类似,
 2.1首先更新BLOB以外的其他字段
 2.2 使用1.3中类似的方法获取记录
 2.3 修改的过程中,注意以下:a 需要更新的记录中,BLOB有可能为NULL,这样在执行blob.getBinaryOutputStream()获取的值可能为

null,那么就关闭刚才select的记录,再执行一次update xxxtable set A = empty_blob() where xxx, 这样就先写入了一个空的BLOB(不是null),然后再

使用1.3,1.4中的方法执行更新记录.b 注意别忘了先执行setAutoCommit(false),以及"for update",以及后面的conn.commit();等。
3.读取BLOB字段中的数据.
 3.1 读取记录不需要setAutoCommit(),以及 select ....for update.
 3.2 使用普通的select 方法查询出记录
 3.3 从ResultSet中获取BLOB并读取,如下:
  BLOB b_to = (BLOB) rs.getBlob("A");
  InputStream is = b_from.getBinaryStream();
  BufferedInputStream input = new BufferedInputStream(is);
  byte[] buff = new byte[2048];
  while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
   //在这里执行写入,如写入到文件的BufferedOutputStream里
   System.out.println(bytesRead);
  }
  通过循环取出blob中的数据,写到buff里,再将buff的内容写入到需要的地方
4.两个数据库间blob字段的传输
类似上面1和3的方法,一边获取BufferedOutputStream,另外一边获取BufferedInputStream,然后读出写入,需要注意的是写入所用的

Connection要执行conn.setAutoCommit(false);以及获取记录时添加“ for update ”以及最后的commit();

总结以上方法,其根本就是先创建空的BLOB,再获取其BufferedOutputStream进行写入,或获取BufferedInputStream进行读取

Oracle Blob字段中JPG图像的提取与保存方法 在现代数据库管理系统中,存储大型二进制数据对象的需求日益增长,Oracle数据库提供了Blob数据类型来满足这种需求。Blob(Binary Large Object)是一种特殊的数据类型,专为存储大量二进制数据而设计,如视频、图像、大型文本文件等。在本章节,我们将深入探讨Blob数据类型的定义、应用场景以及它与其他数据类型的对比,并分析Oracle数据库内部Blob字段的存储机制。Blob数据类型是一种用于存储大量二进制数据的数据类型,它能够存储最大为4GB的文件数据。 阅读详情

相关推荐

RAG在医药行业为什么80%都翻车了?

这篇文章不是要劝你别做RAG,而是把坑说清楚。医药行业有它的特殊性——监管压力、专业术语密度、多语言混排、文档结构复杂——这些因素叠加在一起,让标准RAG教程里的那套方法论几乎直接失效

qq_31808385的博客 635

关于Oracle的 ora-01002:提取违反顺序错误的方案

如题: 在执行insert插入的时候,后台显示ora-01002:提取违反顺序错误。 原因: 根据大部分博客和官网的解释,出现这种错误是因为,在数据库遍历游标的时候 有insert的操作,并且执行了commit ,那么,oracle会提示“ORA-01002: 提取违反顺序”。 问题的很简单,但是我查了半年完全没发现我插入的时候,哪里执行了游标操作了。 解决: 首先,查找数据库的jo...

文鸯的博客 3万+

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 275

oracle ora01002提取违反顺序

在确保没有其他人操作该客户的情况下重新开单依然如此,之后对数据处理脚本单步跟踪,原来是客户数据已经死锁数据库没有自动释放,试图修改数据时候报错,死锁错误又没有去抓取并回报,只是在nextstep再次查询时候爆出01002的错误。并行查询:如果在同一时间内有其他并行查询正在执行,且它们也使用了相同的排序条件,那么它们可能会相互干扰并导致ORA-01002错误。这可能会导致提取的结果集与预期不符。数据段或索引损坏:如果"employees"表的数据段或索引在执行查询之前被损坏,那么查询的结果也可能不正确。

weixin_42095178的博客 4761

STM407ZET6+OV5640调试心得

最近一个项目用了STMF407ZET6 +OV5640,调试了好几天做些总结; STMF407ZET6 开发板用的是正点原子的开发板,OV5640摄像头用的是秉火摄像头; 这其中有一个大坑,开发板的DCMI接口跟摄像头的接口不一样,要重新用杜邦线进行连接; 本人是在正点原子的“”15,ATK-OV5640摄像头模块“”源码上进行修改的。

kingseacjh的专栏 8326

T100批处理作业开发

g_bgjob = ‘Y’ 后台执行g_bgjob = ‘N’ 前台执行。

weixin_43400895的博客 585

oracle 使用杂记

10. 事务 1. 事务特性:ACID + 原子性(atomicity):个事务中的所有操作,相当于一个原子操作,要么全部成功,要么全部失败 + 一致性(consistency):由程序员保证,最经典案例:转账 + 隔离性(isolation):指事务和事务之间的数据可见性,是最容易出问题的地方 + 持久性(durability):事务完成以后,所有的数据都将持久到数据库中,不会因为其他原因而丢失 2. 事务隔离性

Debug日记的博客 3412

48、住宅抵押贷款支持证券的定价、风险评估与结构化设计

本文深入探讨了住宅抵押贷款支持证券(RMBS)的定价、风险评估与结构化设计。内容涵盖提高定价准确性的方差缩减方法,如准蒙特卡罗序列的应用;分析RMBS面临的利率风险、信用风险和模型风险,并提出相应的度量与应对策略;介绍利用动态规划优化CMO分层结构以最大化发行利润的方法。同时总结了RMBS的基本类型、定价流程及市场发展趋势,为投资者和发行人提供全面的决策支持。

quiet的专栏 156

ORACLE存大文件出现 错误:读取违反顺序

 package common;import java.io.File;import java.io.FileInputStream;import java.io.OutputStream;import java.sql.Blob;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Res

webclw的专栏 4301

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2568

分享一个完整的KANO问卷(包含正反问题和选项设置)

本文介绍了KANO模型问卷的设计与应用,用于评估功能需求优先级。问卷包含基本信息、功能评估(正反问题设计)、界面评估及开放问题,选项定义明确(如"非常喜欢"到"很不喜欢")。数据清洗规则包括剔除矛盾回答和注意力检验。通过量化编码和矩阵分析,将需求分为魅力型、期望型、必备型等类别。示例数据显示健康监测为必备型(72%),电子围栏为期望型(45%),适老化改造为无差异型(38%)。该模型为产品决策提供客观量化依据。

从技术实践立足,从项目管理方法论延伸思考 1796

oracle 顺序读,求oracle存储过程报错“读取违反顺序”解决办法

SQL code:create or replace procedure P_Search_CRM_Barcode_Stateasvar_barcode varchar2(50);--条码使用cur_refcursor sys_refcursor;--结果集使用var_DEV_SUBTYPE VARCHAR2(20);var_RESOURCE_INSTANCE_CODE VA...

weixin_39787606的博客 432

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

jks212454的博客 1091

[转载]jdbc中如何处理Oracle BLOB字段

jdbc中如何处理Oracle BLOB字段jdbc中如何处理Oracle BLOB字段 为什么我要写这篇文章? 在前段时间我所在的项目中,就碰到了这个问题,我花了2天的时间才将BLOB的问题搞定。我也尝试过网上所介绍的各种...

congji3817的博客 295

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JDBC ORACLE BLOB处理

LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。 LOB 分为两种类型:内部LOB和外部LOB。     内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务, 也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB: BLOB(二进

worm 3597

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdbc中如何处理Oracle BLOB字段

在前段时间我所在的项目中,就碰到了这个问题,我花了2天的时间才将BLOB的问题搞定。我也尝试过网上所介绍的各种方法,那些方法所使用的原理都一致,但都写得不完整,我也按照网上介绍的方法做了,但都因为其中一些没有提到的小的细节而失败。希望看到这篇文章的人都不再走弯路。一般人会走哪些弯路? 1.使用jdk中的方法进行传输。在ResultSet中有getBlob()方法,在PreparedStatemen

Dead_Knight的专栏 1181

java读取oracle数据库中blob字段

测试表create table TEST_IMG ( ID INTEGER not null, NAME VARCHAR2(32), IMAGE BLOB );说明:1、使用JDBC演示2、IMAGE字段存储一个图片程序代码如下:import java.io.FileNotFoundException; import java.io.FileOutputStream; impo

itmyhome的专栏 1万+

JDBC+Hibernate将Blob数据写入Oracle

    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。   写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?  这需要你先插入一个empty的blob,这将创建一

键者天行 5717

java读取oracle blob字段_JAVA读取Oracle数据库BLOB字段

给人帮忙,写了一个JAVA读取Oracle数据库BLOB字段的示例代码。仅作备忘。示例说明:1. 使用Oracle的JDBC驱动。2. BLOB字段中存储的是一个文件,把BLOB字段中存储的内容保存到磁盘中形成文件。程序代码片断如下:---------------------package DBtest;import java.sql.Connection;import java.sql.Driv...

weixin_33838310的博客 1510

JDBC读写oracle大字段BLOB

<br /> <br />一 JDBC将大字段BLoB内容写入到Oracle数据库(写大字段BLOB)<br />例子的详细信息参照为技改大修批量生成数据写的小工具<br />1.1 构建界面MyNotePad.java<br />package test;<br /> <br />import java.awt.BorderLayout;<br />import java.awt.Container;<br />import java.awt.GridLayout;<br />import java.aw

抗体的博客 1132

Oracle blob字段类型 文件读写实例

Oracle blob字段类型 文件读写实例 准备环境:pl/sql java JDK Oracle JDBC driver 创建blob_test表 create table blob_test( id number, name varchar(50), word blob ) 先插入空白数据然后执行更新 Code: p...

dingquanba6392的博客 3104

oracle创建clob字段出错,Oracle中BLOB/CLOB字段可能遇到的问题

Blob 采用单字节存储,适合保存二进制数据,如图片、视频等。Clob 采用多字节存储,适合保存大型文本数据。1. 在Oracle JDBC中采用流机制对 BLOB/CLOB 进行读写操作,所以要注意不能在批处理中读写 BLOB/CLOB字段,否则将出现Stream type cannot be used in batching 异常。2. Oracle BLOB/CLOB 字段本身拥有一个游标(...

weixin_32672675的博客 3640

MySQL和Oracle在对Clob和Blob字段的处理

MySQL和Oracle在对Clob和Blob字段的处理 文章目录MySQL和Oracle在对Clob和Blob字段的处理前言一、MySQL与Oracle数据库如何处理Clob,Blob数据类型二、jdbc操作clob(以oracle为例)1.插入操作2. 读取操作三、jdbc操作blob四、hibernate处理clob五、使用hibernate处理blob总结 前言 一、MySQL与Oracle数据库如何处理Clob,Blob数据类型 (1) 不通数据库中对应clob,blob的类型

一页尘埃 601

(转)通过JDBC 操作 ORACLE BLOB,CLOB字段类型

通过JDBC 操作 ORACLE BLOB,CLOB字段类型 一、BLOB操作 1、入库(1)JDBC方式  //通过JDBC获得数据库连接 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:

panggecui_2006的专栏 712

blob java_blob字段java如何处理

展开全部1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多62616964757a686964616fe4b893e5b19e31333335313834数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍...

weixin_29486805的博客 2897
上一篇: 银行接口开发记录(招商银行,工商银行,建设银行)
下一篇: log4j配置祥解
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值