在Oracle中,lob类型主要是指:CLOB和BLOB,这两个类型都是用来存储大量数据而设计的。
Blob:是指二进制大对象也就是英文Binary Large Object的所写,是用来存储大量二进制数据。
Clob:是指大字符对象也就是英文Character Large Object的所写,用来存储大量文本数据。
一:操作CLOB
(1)数据库表结构如下:
create table CLOB_TEST
(
ID VARCHAR2(5) not null,
CONTENT CLOB
)
(2)插入CLOB
方法一:第一步插入一个空值,第二步锁住此行,更新clob字段
public static void insertClob(Connection conn,String data) throws Exception{
//这句话如没有,9i的驱动下会报 java.sql.SQLException: ORA-01002: 读取违反顺序 的异常。
conn.setAutoCommit(false);
//插入一个空CLOB
String insertSql = "insert into clob_test(id,content) values('1',empty_clob())";
//查询插入的空CLOB
String selectSql = "select content from clob_test where id = '1' for update";
PreparedStatement stmt = conn.prepareStatement(insertSql);
stmt.executeUpdate();
stmt.close();
// lock this line
PreparedStatement pstmt = conn.prepareStatement(selectSql);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1);
//为CLOB写信息
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(data));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
conn.commit();
pstmt.close();
}
注:此方法在jdk1.4、jdk50、jdk6.0和Oracle9i、Oracle10g、Oracle11g驱动下测试通过!
方法二:通过setString方法
public static void insertClob(Connection conn,String data) throws Exception{
String insertSql = "insert into clob_test(id,content) values('1',?)";
PreparedStatement stmt = conn.prepareStatement(insertSql);
stmt.setString(1, data);
stmt.executeUpdate();
stmt.close();
conn.close();
}
注:由于在Oracle9i的驱动下,setString 有2000字符长度的限制,故这个方法只适合Oracle10g以上的驱动(Oracle11g驱动+JDK6.0也测试通过)。
方法三:通过setClob方法
public static void insertClob(Connection conn,String filePath) throws Exception{
String insertSql = "insert into clob_test(id,content) values('1',?)";
PreparedStatement stmt = conn.prepareStatement(insertSql);
stmt.setClob(1, new FileReader(filePath));
stmt.executeUpdate();
stmt.close();
conn.commit();
}
注:由于setClob(int parameterIndex, Reader reader)这个方法是JDBC4.0规范刚加的内容,是以流的方式为CLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
(3)读取CLOB
方法一:
public static String readClob(Connection conn) throws Exception{
PreparedStatement stmt = conn.prepareStatement("select * from clob_test where id = '1'");
ResultSet rs = stmt.executeQuery();
String str="";
StringBuffer sb = new StringBuffer("");
while(rs.next()){
Clob clob = rs.getClob("content");
Reader is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
str = br.readLine();
while (str != null)
{
sb.append(str);
str = br.readLine();
}
}
return sb.toString();
}
方法二:
public static String readClob(Connection conn) throws Exception{
PreparedStatement stmt = conn.prepareStatement("select * from clob_test where id = '1'");
ResultSet rs = stmt.executeQuery();
String str="";
while(rs.next()){
str = rs.getString("content");
}
return str;
}
注:由于在Oracle9i的驱动下,rs.getString 返回为null,所以此方法只适合Oracle10g及其以上驱动。
二:操作BLOB
(1)数据库表结构如下:
create table BLOB_TEST
(
ID VARCHAR2(5) not null,
CONTENT BLOB
)
(2)插入BLOB
方法一:第一步插入一个空值,第二步锁住此行,更新blob字段
public static void writeBlob(Connection con,String filePath) throws Exception{
FileInputStream fis = null;
PreparedStatement psm = null;
File file = new File(filePath);
psm = con.prepareStatement("insert into blob_test(id,content) values('2',empty_blob())");
psm.executeUpdate();
psm = con.prepareStatement("select content from blob_test where id ='2' for update");
ResultSet rs = psm.executeQuery();
if(rs.next()){
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(1);
FileInputStream fin = new FileInputStream(file);
OutputStream out = blob.getBinaryOutputStream();
int count = -1, total = 0;
byte[] data = new byte[blob.getBufferSize()];
while ((count = fin.read(data)) != -1)
{
out.write(data, 0, count);
}
out.flush();
out.close();
}
}
方法二:通过setBinaryStream方法
public static void writeBlob(Connection con,String filePath) throws Exception{
FileInputStream fis = null;
PreparedStatement psm = null;
File file = new File(filePath);
try {
fis = new FileInputStream(file);
psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");
psm.setBinaryStream(1, fis, fis.available());
psm.executeUpdate();
}finally{
if(fis != null) fis.close();
psm.close();
con.close();
}
}
方法三:通过setBlob(int parameterIndex, InputStream inputStream)方法
public static void writeBlob(Connection con,String filePath) throws Exception{
FileInputStream fis = null;
PreparedStatement psm = null;
File file = new File(filePath);
try {
fis = new FileInputStream(file);
psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");
psm.setBlob(1, fis);
psm.executeUpdate();
}finally{
if(fis != null) fis.close();
psm.close();
con.close();
}
}
注:由于setBlob(int parameterIndex, InputStream inputStream)这个方法是JDBC4.0规范刚加的内容,是以流的方式为BLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
(3)读取BLOB
public static void readBlob(Connection con,String outFilePath){
Statement sm = null;
ResultSet rs = null;
try {
sm = con.createStatement();
rs = sm.executeQuery("select * from blob_test where id = 2");
if(rs.next()){
Blob blob = rs.getBlob("content");
File file = new File(outFilePath);
FileOutputStream sout = new FileOutputStream(file);
InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流
//经BLOB输入数据流读取数据,并将其写入文件
byte[] b = new byte[256];
int off = 0;
int len = b.length;
for (int i = in.read(b); i != -1;) {
sout.write(b);
i = in.read(b);
}
sout.close();
rs.close();
sm.close();
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
相关推荐
在数据库操作中,LOB字段的处理往往比常规的行数据更为复杂,因为它涉及到大块的数据读取、写入和管理。"Oracle LOB字段处理工具"就是为了简化这些操作而设计的软件。 这款工具主要针对Oracle数据库中的BLOB...
本篇文章将深入探讨如何在Spring中有效地操作LOB字段,以实现对大数据的管理。 首先,我们需要一个数据访问层,例如`PostJdbcDao2.java`,在这个类中,我们将定义用于处理LOB字段的方法。Spring JDBC Template是...
设置合理的CHUNK值,不仅可以避免存储空间的浪费,而且由于Oracle对LOB字段的I/O操作也是以CHUNK为单位,因此可以改善I/O性能。CHUNK的值应该根据实际应用中LOB字段经常使用的平均长度来调节。 2. In-Line与Out-Of-...
总之,处理Oracle数据库中的LOB字段需要对Spring、Hibernate以及Oracle JDBC驱动有深入理解。通过合理配置和使用相应的API,我们可以有效地管理大体积数据,实现与数据库的高效交互。在实际项目中,根据具体需求和...
Oracle 中 LOB 字段的存储管理和优化 Oracle 中 LOB(Large OBjects)字段是一种特殊的数据类型,用于存储非结构化数据,如图像、音频、视频等。LOB 字段的存储管理和优化是数据库管理中一个重要的方面。本文将...
### 如何对LOB字段进行处理 #### 摘要与背景 随着信息技术的进步及应用需求的不断扩展,数据库管理系统(DBMS)面临着存储多样化数据类型的挑战。例如,在开发旅游信息系统时,除了基本的文字信息外,还需要处理大量...
DB2 LOB详解涉及的知识点非常丰富,下面将从DB2中LOB字段的存储及处理过程、如何创建LOB数据对象、维护LOB数据的注意事项、使用工具进行维护等方面进行详细说明。 首先,DB2中LOB字段的存储和处理过程是一门深奥的...
测试oracle数据库中,lob字段在不同参数条件下,删除数据后占用空间的情况。 测试1 测试disable storage in row下的lob字段 测试2 测试非disable storage in row模式下 该模式为默认模式,既小于4k的数据不会存在lob...
LOB 的维护包括创建、修改、删除等操作。 Oracle 提供了多种维护 LOB 的方式,包括: * 使用 SQL 语句维护 LOB。 * 使用 PL/SQL 维护 LOB。 * 使用 OCI 维护 LOB。 四、LOB 的优点和缺点 LOB 有很多优点,例如: ...
Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt
oracle expdp导出blob字段遇到ora-01555报错的解决方案
这篇文档将详细阐述如何在JDBC中有效地读取和操作Oracle数据库的CLOB字段,并将其转换为String类型。 首先,理解CLOB对象的特性是关键。CLOB是一种BLOB(Binary Large Object)的变种,专用于存储字符数据。在JDBC...
总之,"Laravel开发-eloquent-serialized-lob"是一个非常实用的扩展,它极大地简化了处理大型数据对象的工作,使得在Laravel中管理和操作LOB字段变得轻松且高效。通过合理利用这个扩展,开发者可以更专注于应用的...
在Oracle数据库中,CLOB(Character Large Object)类型字段用于存储大量的文本数据,如XML文档、长篇文章等。由于其特殊性,处理CLOB类型的字段时可能会遇到性能问题,特别是当涉及索引时。本话题将围绕如何针对...
本篇将详细介绍如何使用JDBC(Java Database Connectivity)与Hibernate框架来操作Oracle数据库中的BLOB字段。 首先,Oracle数据库的BLOB字段提供了对大对象的高效存储,它的性能优于LONG字段,尤其适合存储大容量...
在实际应用中,`DBMS_LOB`包通常与SQL DML语句结合使用,以处理LOB字段。例如,可以使用`DBMS_LOB.WRITE`在INSERT或UPDATE语句中修改LOB值,或者使用`DBMS_LOB.APPEND`在已有的LOB后面添加新内容。 学习`DBMS_LOB`...
6. **合理设置 LOB 缓冲区大小**:通过调整初始化参数 `LOB_BUFFER_SIZE` 来控制 LOB 缓冲区的大小,可以优化 LOB 操作的性能。 7. **避免不必要的数据复制**:当需要对 LOB 数据进行操作时,尽量避免不必要的数据...
本文将深入探讨如何使用Java Database Connectivity (JDBC) API来操作Oracle数据库中的BLOB字段,包括创建表、插入和读取BLOB数据的方法。 #### 创建包含BLOB字段的表 在Oracle数据库中创建一个包含BLOB字段的表...
这些函数分别对应添加、更新、读取和查询LOB字段的流程,通过调用这些函数,可以在C++Builder程序中方便地对Oracle数据库中的LOB字段进行操作。 具体实现时,首先需要在Oracle数据库中创建包含LOB字段的表,例如...