这些天写了写Oracle8i,对一些数据类型的处理,在网上对这方面东西太少,在这里总结一下,希望对大家有用,当然写的不够深入(对这些了解不多,没多大信心)
BLOB:用于存储二进制数据 最大可存储4G
使用JDBC向BLOB类型字插入数据,大体思路:
1.向BLOB插入一个EMPTY_BLOB()目的在于生成一个cursor(具体是什么 没有深究)
2.查询到对应数据 获取到BLOB
3.修改BLOB值
2.CLOB 用于存储大量的文本信息.采用默认字符集存储
使用JDBC对CLOB类型数据进行操作,思想和BLOB一致,只是在写和读取的时候有些不同
//方式一
clob.putString(1,"填写数据"); //小数据可以考虑
//方式二
对于读取
Reader reader= clob.getCharacterStream();
3.JDBC对 NVARCHR NCHAR 操作
插入方式一
insert 表名 values(N'值',N'值');
方式二
insert 表名 values(translate('值' using NCHAR_CS),translate('值' using NCHAR_CS));
查询时 需要转回来
select translate(列 using CHAR_CS) from 表名称
4.对于NCLOB插入
insert 表名 values(N'值');
5.对于RAW插入
insert into 表名 values (1, hextoraw('值'));
insert into 表名 values (utl_raw.cast_to_raw('值'));
使用hextoraw 会将字符串中数据当作16进制数存储
使用utl_raw.cast_to_raw会将字符串转换成ASCII码存储
对于NCLOB 和RAW的值获取 待续....
BLOB:用于存储二进制数据 最大可存储4G
使用JDBC向BLOB类型字插入数据,大体思路:
1.向BLOB插入一个EMPTY_BLOB()目的在于生成一个cursor(具体是什么 没有深究)
2.查询到对应数据 获取到BLOB
3.修改BLOB值
package com.jdbcinsert;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.sql.BLOB;
/**
*
* @version 2.0
*
* @author tanglei
* @since JDK1.6
*/
public class Oracle8iBlobTest {
public static void main(String[] args) {
/*
* sql
* create table test(
* MYNAME varchar(10) not null primary key,
* NYBOLOB blob null
* )
*
*/
//主键 索引条件
String id="001";
//创建连接
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con=null;
try {
con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:TOPWALK","tanglei","topwalk");
con.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
PreparedStatement pre=null;
try {
//插入数据 NYBOLOB 用empty_blob()填充 生成cursor
pre=con.prepareStatement("insert into test(MYNAME,NYBOLOB) values(?,empty_blob())");
pre.setString(1,id);
} catch (SQLException e) {
e.printStackTrace();
}
try {
pre.executeUpdate();
pre.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
//获取blob cursor for update 添加一个锁 对大字段操作是费时的 添加锁是必要的. 好像不添加锁会报错
pre=con.prepareStatement("select NYBOLOB from test where MYNAME=? for update");
pre.setString(1,id);
ResultSet set= pre.executeQuery();
BLOB blob=null;
if(set.next()){
blob=(BLOB) set.getBlob(1);
}
InputStream input=new FileInputStream("E://spring.jar");
byte[] mydata=new byte[input.available()];
//得到流了 对流中写数据方式很多 这里随便写了一个 没考虑太多 不同情况可以考虑不同的方式写数据
OutputStream out= blob.getBinaryOutputStream();
//对于读取BLOB中的数据
//blob.getBinaryStream() --InputStream 有流就好操作了 根据情况 选择读取的方式
input.read(mydata);
out.write(mydata);
//修改 Blob
pre=con.prepareStatement("update test set NYBOLOB=? where MYNAME=?");
pre.setBlob(1,blob);
pre.setString(2,id);
pre.executeUpdate();
con.commit();
pre.close();
con.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.CLOB 用于存储大量的文本信息.采用默认字符集存储
使用JDBC对CLOB类型数据进行操作,思想和BLOB一致,只是在写和读取的时候有些不同
//方式一
clob.putString(1,"填写数据"); //小数据可以考虑
//方式二
InputStream cinput=new FileInputStream("E://clob.txt");
InputStreamReader creader=new InputStreamReader(cinput);
BufferedReader creader2=new BufferedReader(creader);
StringBuffer mybuffer=new StringBuffer();
String s=null;
while((s=creader2.readLine())!=null){
mybuffer.append(s);
}
Writer writer= clob.getCharacterOutputStream();
writer.write(s);
writer.flush();
writer.close();
对于读取
Reader reader= clob.getCharacterStream();
3.JDBC对 NVARCHR NCHAR 操作
插入方式一
insert 表名 values(N'值',N'值');
方式二
insert 表名 values(translate('值' using NCHAR_CS),translate('值' using NCHAR_CS));
查询时 需要转回来
select translate(列 using CHAR_CS) from 表名称
4.对于NCLOB插入
insert 表名 values(N'值');
5.对于RAW插入
insert into 表名 values (1, hextoraw('值'));
insert into 表名 values (utl_raw.cast_to_raw('值'));
使用hextoraw 会将字符串中数据当作16进制数存储
使用utl_raw.cast_to_raw会将字符串转换成ASCII码存储
对于NCLOB 和RAW的值获取 待续....