最近在做表数据的插入和抽取时,遇到一个
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());
}
分享到:
相关推荐
oracle对大对象类型操作:blob,clob,nclob,bfile
ORACLE中CLOB字段转String类型
只需要安装oracle client在本地,然后配置好tns,输入连接名,用户名,密码,数据表的名称,文件名数据列名以及blob数据列名,就可以批量导出ORACLE数据库BLOB字段生成图片
JDBC读写Oracle的CLOB字段
常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 ...数据类型 参数 描述 char(n) n=1 to 2000字节 定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 导出的数据格式包括纯文本和DMP文件两种。以纯...
在通过拼组sql语句来实现... 下面就此问题的解决办法,做一下小结: 我们可以通过创建单独的OracleCommand来进行指定的插入,即可获得成功,这里仅介绍插入clob类型的数据,blob与此类似,这里就不介绍了,下面介绍两
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB...
5.支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i ) , BINARY FLOAT, BINARY DOUBLE (10g ) 6.全面支持LOB字段:支持CLOB、NCLOB和BLOBCLOB...
》》支持LOB字段(CLOB, NCLOB和BLOB)恢复,并支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况 》》支持多种Big Endian/Little Endian操作平台(AIX/HPUX/SOLARIS/Linux/Windows)数据库数据恢复 》》支持...
LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob 1~4GB 以二进制信息保存数据 三、 DDL语言 1. Create table命令 用于创建表。在创建表时,经常会创建该表的主键、外键、唯一...
MyOraDump 是一个程序,它将存储在大多数基本 oracle 类型中的 oracle 数据导出为文本文件,例如可以用于导入其他数据库,例如 MariaDB 和 MySQL。 程序使用OCI用C语言编写,支持数组获取,性能好。 此外还支持 BLOB...
Support of BLOB, CLOB, and NCLOB data types in TUniLoader is improved PostgreSQL data provider Application Name connection option is supported Payload parameter for PostgreSQL notification is ...
- Bug 4918586: National character set datatypes (NCHAR, NVARCHAR2, NCLOB) are converted to the database character set datatypes (CHAR, VARCHAR2, CLOB) in the Run PL/SQL dialog box. Workaround: ...