前几天做项目,用到了Oracle数据库,是关于更新Blob,代码是这样写的:
/**
* 描述: 添加某张表某条记录的content字段,此字段为 blob 型
* param: 表名;主键;数据;数据库连接
* return: 添加成功返回 true ;否则返回 false
* */
public static boolean setBlob(String tableName,int ID, String data,Connection conn) {
Statement statement = null;
ResultSet ret = null;
String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";
boolean flg = false;
try {
statement = conn.createStatement();
ret = statement.executeQuery(insertBlob);
oracle.sql.BLOB blob = null;
if (ret.next()) {
blob = ((OracleResultSet) ret).getBLOB(1);
}
OutputStream outstream = blob.getBinaryOutputStream();
byte[] data1 = data.getBytes();
outstream.write(data1, 0, data1.length);//就是这个地方出了问题,如果是修改,之前就有了长度为100字节的数据,而这次修改只有50字节数据,那么后面50个字节就不会被修改,仍然存在数据库中
outstream.flush();
outstream.close();
flg = true;
} catch (SQLException e1) {
e1.printStackTrace();
flg = false;
} catch (IOException e1) {
e1.printStackTrace();
flg = false;
} finally {
try {
if(statement != null) {
statement.close();
}
if(ret != null) {
ret.close();
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
return flg;
}
如果你更新blob字段时,该字段为空(比如之前刚刚插入新记录),则这样操作正确。
但要更新有数据的blob字段,则只能更新部分字节,原字段数据超出长度部分的字节内容不变。
如果确实需要更新有数据的blob字段(也叫覆盖式更新),则可在下面两种方法中选择其一:
1、在更新前(setBlob方法中select执行前)先将blob字段清空:
\"UPDATE \" + tableName + \" SET content=EMPTY_BLOB() WHERE id= \'\" +ID + \"\'\"
再执行你的更新代码。
2、确保每次写入的字段长度固定。即使data的字节数少,也要保证data1的长度固定,
也即data1定义长度要与data无关。
采用第一种方案的代码如下:
/**
* 描述: 添加某张表某条记录的content字段,此字段为 blob 型
* param: 表名;主键;数据;数据库连接
* return: 添加成功返回 true ;否则返回 false
* */
public static boolean setBlob(String tableName,int ID, String data,Connection conn) {
Statement statement = null;
ResultSet ret = null;
String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";
String flushBlob="update "+tableName+" set content=EMPTY_BLOB() where id="+ID;
boolean flg = false;
try {
statement = conn.createStatement();
statement.execute(flushBlob);//首先清空content字段
ret = statement.executeQuery(insertBlob);
oracle.sql.BLOB blob = null;
if (ret.next()) {
blob = ((OracleResultSet) ret).getBLOB(1);
}
OutputStream outstream = blob.getBinaryOutputStream();
byte[] data1 = data.getBytes();
outstream.write(data1, 0, data1.length);//就是这个地方出了问题,如果是修改,之前就有了长度为100字节的数据,而这次修改只有50字节数据,那么后面50个字节就不会被修改,仍然存在数据库中
outstream.flush();
outstream.close();
flg = true;
} catch (SQLException e1) {
e1.printStackTrace();
flg = false;
} catch (IOException e1) {
e1.printStackTrace();
flg = false;
} finally {
try {
if(statement != null) {
statement.close();
}
if(ret != null) {
ret.close();
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
return flg;
}
分享到:
相关推荐
首先,创建一个包含BLOB字段的新表或者更新已有表结构。例如: ```sql CREATE TABLE mysql_photos ( id INT PRIMARY KEY, photo BLOB ); ``` 然后,通过类似的方法,读取本地文件并将其内容插入到MySQL的BLOB...
oracle中对blob字段的处理方法,包括增加,删除,修改,更新等操作。
本篇文章将详细探讨如何将ORACLE数据库中的BLOB(Binary Large Object)字段导入到SQL SERVER中的IMAGE字段,这通常涉及到数据转换、数据迁移以及可能的数据类型兼容性问题。 首先,让我们了解BLOB和IMAGE字段的...
通常,文件名会存储在一个VARCHAR2类型的列中,而图片数据则存储在BLOB列中。 5. **编写SQL或PL/SQL脚本**:创建一个查询,选择需要导出的图片对应的BLOB数据,并可能包含文件名。可以使用DBMS_LOB子程序处理BLOB...
在tnsnames.ora文件中,添加或编辑一个条目,指明你的Oracle服务器连接信息,包括服务名、主机地址、端口号和实例名称。 接下来,你需要知道数据库连接的详细信息,包括连接名、用户名和密码。连接名对应于tnsnames...
例如,在Oracle数据库中创建一张名为`t_wlsgry`的表,并包含一个`BLOB`类型的字段`zp`用于存储图片数据。 3. **图片数据准备**: - 准备一些图片文件,并将其插入到数据库表中。这可以通过SQL语句或者使用Java程序...
根据题目描述,'01B90166441358'这个十六进制字符串代表了一个358x441像素的JPEG图片。 解析步骤如下: 1. **提取高度**:从字符串中提取前两个字符'01B9',并将其转换为十进制表示图片的高度。这里的'01B9'等于十...
`UTL_RAW.CAST_TO_VARCHAR2`是Oracle提供的一个包中的函数,用于将RAW或BLOB类型的二进制数据转换为VARCHAR2字符串类型。这一步骤对于将BLOB转换为CLOB至关重要,因为CLOB本质上是一种字符数据类型,而不能直接与二...
首先通过`GetblobByFilePath`方法读取文件内容到字节数组中,然后创建一个`OracleParameter`对象并将该字节数组作为参数值传递给SQL语句。最后,执行SQL语句完成插入操作。 #### 3. 读取Blob数据 `ReaderBlob`方法...
读取Blob字段时,可以创建一个`OracleBinary`对象,然后使用`GetValue`方法获取Blob数据。写入Blob字段时,先创建`OracleParameter`对象,将其Direction设置为` ParameterDirection.Input `,OracleDbType设置为`...
为了演示如何在Oracle中操作BLOB字段,首先需要创建一个包含BLOB字段的表。以下是一条创建表`BLOBTEST`的SQL语句: ```sql CREATE TABLE BLOBTEST ( ID NUMBER PRIMARY KEY, NAME VARCHAR2(20), PICTURE BLOB );...
Python如何操作Oracle的Blob字段,
首先,你需要在项目中引入Oracle JDBC驱动ojdbc6.jar,这是一个连接Oracle数据库的必备库。你可以在项目的类路径中添加这个jar包,通常将其放在/META-INF/MANIFEST.MF文件中指定的类路径下。 接着,创建一个包含...
为了解决这个问题,可以采用一种间接的方法:首先在本地数据库创建一个临时表,并将BLOB数据插入到该临时表中;然后,通过DBLink从远程数据库选择并操作这些数据。这种方法避免了直接通过DBLink处理大对象数据的问题...
批量导出oracle bolb图片到本地文件
- 在插入或更新操作中,首先将二进制数据保存到一个TMemoryStream或TBytes数组中。 - 对于DBExpress,将TOracleBlobField绑定到内存流,然后执行SQL命令。 - 对于ADO,使用TADOBlobField的LoadFromStream或...
首先,我们需要准备环境:一个配置了Oracle数据库的服务器,JDBC驱动程序(Oracle JDBC driver,如ojdbc)以连接数据库,以及一个运行JSP的Web服务器(如Tomcat)。确保JDBC驱动在Web应用的`WEB-INF/lib`目录下。 1...
1. **创建Blob字段:** 首先需要在数据库表中定义一个Blob类型的字段。 2. **插入记录:** 将Blob字段与其它字段一起插入到表中。 3. **写入文件内容:** 将文件内容写入到Blob字段中。 ##### 示例代码(上传部分)...
在数据库迁移或数据同步的过程中,有时需要将含有大对象(LOB,包括BLOB和CLOB)的数据从一个数据库系统复制到另一个不完全支持LOB的数据库系统。本例中,我们讨论如何将DB2数据库中的BLOB数据类型复制到Oracle...