最近在做表数据的插入和抽取时,遇到一个 NCLOB 类型的字段,其检索结果在几番尝试时,总是出现该字段值抽出为 NULL ,或者是只有该值的前面一部分 [dbms_lob.substr(TX)] ,或者是缓存不够 [TO_CHAR(TX)] 等等问题,于是开始百度。由于一年前好像也遇到过这种类型的字段,但是当时没能让自己有足够意识来引起注意。以下分享是自己在网上找来的一些相关资料以及自己处理这个问题的解决方法 [TO_NCLOB(TX)] ,希望对大家也有所帮助。
一、 blob 、 clob 、 nclob 是什么意思?
1 .它们都是 oracle 数据库中的大对象数据类型, oracle 提供专门的包对其操作。
2 . blob 、 clob 、 nclob 是三种大型对象 (LOB) ,用来保存较大的图形文件或带格式的文本文件,如 Miceosoft Word 文档,以及音频、视频等非文本文件,最大长度是 4GB 。
3 . LOB 有几种类型,取决于你使用的字节的类型, Oracle 8i 实实在在地将这些数据存储在数据库内部保存。可以执行读取、存储、写入等特殊操作。
4 . CLOB(Character Large Object) 用于存储对应于数据库定义的字符集的字符数据。(类似于 long 类型)
5 . BLOB(Binary Large Object) 可用来存储无结构的二进制数据。(类似于 row 和 long row )
二、 LOB 的 BLOB 、 CLOB 、 BFILE 有什么区别,都用在什么情况?怎样操作?
BLOB ---- 内部二进制大对象。
CLOB ---- 内部字符大对象。
NCLOB ---- 内部定长多字节字符大对象。
BFILE ---- 外部二进制文件。
LOB 由两部分组成:数据(值)和指向数据的指针(定位器)。尽管值与表自身一起存储,但是一个 LOB 列并不包含值,仅有它的定位指针。更进一步,为了使用大对象,程序必须声明定位器类型的本地变量。当 LOB (除了 BFILE )被创建时,定位器被存放在列中,值被存放在 LOB 段中, LOB 段是在数据库内部表的一部分。当 BFILE 被创建时,定位器如同平常一样存储在列中。
三、 blob 和 clob 最大是多少?还是没有最大限制?
它们的最大上限就是 4G , Clob 可以存储单字节字符数据, Blob 可以存储无结构的二进制数据。
下面是我解决该字段的插入和抽取时的代码案例,通过 assertEquals() 的判定,插入值和抽取值一致, Junit 测试通过 :
public void test_01_TxtEjlog() throws Exception {
TxtEjlog txtEjlog = new TxtEjlog();
String insert_ejlog_sql =
" INSERT INTO TXT_ELOG "
+ " (GUID, "
+ " STOREID, "
+ " TXID, "
+ " TX) "
+ " VALUES(?, ?, ?, ?)";
String select_ejlog_sql =
" SELECT "
+ " GUID,"
+ " STOREID, "
+ " TXID, "
+ " TO_NCLOB(TX) TX "
+ " FROM "
+ " TXT_ELOG "
+ " WHERE "
+ " GUID = '6161' "
+ " AND STOREID = '6' ";
req.put("guid", "6161");
req.put("storeID", "6");
req.put("txID", "61");
StringBuilder strTest = new StringBuilder("大对象数据类型的正常系测试xx");
for (int i = 0; i < 900; i++) {
strTest.append("大对象数据类型的正常系测试xx大对象数据类型的正常系测试xx");
}
req.put("tx", strTest.toString());
txtEjlog.setReq(req);
txtEjlog.setConf(conf);
Class.forName("oracle.jdbc.driver.OracleDriver");
txtEjlog.setConnection(DriverManager.getConnection("jdbc:oracle:thin:@192.168.33.333:1521:orcl", "test", "test_03"));
try {
// 业务处理
txtEjlog.executeLocal();
} finally {
txtEjlog.close();
}
TxtEjlogBean ejlogBean = txtEjlogBean.getConnection().selectFirst(select_ejlog_sql, TxtEjlogBean.class);
assertEquals("6161", ejlogBean.getGuid());
assertEquals(6, ejlogBean.getStoreID());
assertEquals(61, ejlogBean.getTxID());
assertEquals(strTest.toString(), ejlogBean.getTx());
}