我对这两种数据类型非常着迷.根据Oracle Docs,它们呈现如下:
BLOB:可变长度二进制大对象字符串,最长可达2GB(2,147,483,647).主要用于保存非传统数据,如语音或混合媒体.与FOR BIT DATA字符串一样,BLOB字符串与字符集无关.
CLOB:可变长度字符大对象字符串,最长可达2GB(2,147,483,647).CLOB可以存储单字节字符串或多字节,基于字符的数据.CLOB被视为字符串.
我不知道的是,从DB2和Oracle的角度来看,两者之间是否有任何区别?我的意思是,DB2 CLOB和Oracle CLOB之间,DB2 BLOB和Oracle BLOB之间有什么区别?DB2和Oracle中的最大大小是多少?它只是2 GB?
我正在使用Hibernate 3.5.6和Oracle 10g.我在初始化期间看到了以下异常,但应用程序本身工作正常.这个例外的原因是什么?以及如何纠正?
异常
在createClob()方法抛出错误时禁用上下文LOB创建:java.lang.reflect.InvocationTargetException
信息
Oracle版本:Oracle数据库10g企业版10.2.0.4.0版JDBC驱动程序:Oracle JDBC驱动程序,版本:11.1.0.7.0
考虑到这TEST_SCRIPT就是CLOB 为什么当我从Oracle上的SQL*PLUS运行这个简单的查询时,我得到错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关同一错误的很多问题,但没有一个是从SQLPLUS运行直接查询
UPDATE IMS_TEST
SET TEST_Category = 'just testing'
WHERE TEST_SCRIPT = 'something'
AND ID = '10000239'
Run Code Online (Sandbox Code Playgroud)
完整示例:
SQL> create table ims_test(
2 test_category varchar2(30),
3 test_script clob,
4 id varchar2(30)
5 );
Table created.
SQL> insert into ims_test values ('test1','something','10000239');
1 row created.
SQL> UPDATE IMS_TEST
2 SET TEST_Category = 'just testing'
3 WHERE TEST_SCRIPT = 'something'
4 AND ID = '10000239';
WHERE TEST_SCRIPT = 'something'
*
ERROR …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一个具有几列CLOB数据类型的查询.如果我像正常一样运行查询,那么所有这些字段都只有(CLOB)值.
我尝试使用DBMS_LOB.substr(column),我得到错误
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Run Code Online (Sandbox Code Playgroud)
我如何查询CLOB列?
我有一个很大的CLOB(超过32kB)我想用StringBuilder读取一个String.我如何以最有效的方式做到这一点?我不能使用StringBuilder的"int length"构造函数,因为我的CLOB的长度比"int"长,并且需要"long"值.
我对Java I/O类并不那么舒服,并希望获得一些指导.
编辑 - 我已经尝试使用clobToString()的代码:
private String clobToString(Clob data) {
StringBuilder sb = new StringBuilder();
try {
Reader reader = data.getCharacterStream();
BufferedReader br = new BufferedReader(reader);
String line;
while(null != (line = br.readLine())) {
sb.append(line);
}
br.close();
} catch (SQLException e) {
// handle this exception
} catch (IOException e) {
// handle this exception
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud) 如何获取CLOBOracle中列的大小(以字节为单位)?
LENGTH()并且DBMS_LOB.getLength()两者都返回使用的字符数,CLOB但我需要知道使用了多少字节(我正在处理多字节字符集).
当我使用jdbc瘦驱动程序搜索Web以将BLOB插入Oracle数据库时,大多数网页都建议采用三步法:
empty_blob()值.for update.这对我来说很好,这是一个例子:
Connection oracleConnection = ...
byte[] testArray = ...
PreparedStatement ps = oracleConnection.prepareStatement(
"insert into test (id, blobfield) values(?, empty_blob())");
ps.setInt(1, 100);
ps.executeUpdate();
ps.close();
ps = oracleConnection.prepareStatement(
"select blobfield from test where id = ? for update");
ps.setInt(1, 100);
OracleResultSet rs = (OracleResultSet) ps.executeQuery();
if (rs.next()) {
BLOB blob = (BLOB) rs.getBLOB(1);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while …Run Code Online (Sandbox Code Playgroud) 虽然我尝试在具有数据类型的字段上设置超过4000个字符的值CLOB,但它给了我这个错误:
ORA-01704:字符串文字太长.
任何建议,如果我必须设置无限字符的值,哪种数据类型适用于我,虽然对于我的情况,它恰好是关于15000字符的.
注意:我尝试存储的长字符串是用ANSI编码的.
如何从clob列中获取特定字符串?
我有如下数据存储在名为clob列中 product_details
CALCULATION=[N]NEW.PRODUCT_NO=[T9856]
OLD.PRODUCT_NO=[T9852].... -- with other text
Run Code Online (Sandbox Code Playgroud)
我想NEW.PRODUCT_NO从列中搜索字符串product_details
我试过了
select * from my_table
where dbms_lob.instr(product_details,'NEW.PRODUCT_NO')>=1
Run Code Online (Sandbox Code Playgroud)
以上从我的表中提取全文.
任何帮助都非常值得赞赏.
问候
我有一个PL/SQL过程,它SUBSTR在VARCHAR2参数上做了很多.我想删除长度限制,所以我尝试将其更改为CLOB.
工作正常,但性能受损,所以我做了一些测试(基于2005 年的这些测试).
更新:我可以在具有不同Oracle版本和不同硬件的几个不同实例上重现这一点,dbms_lob.substr总是明显慢于substr(CLOB),并且慢很多SUBSTR(VARCHAR2).
鲍勃的结果和上面链接中的测试讲述了一个不同的故事.
任何人都可以解释这个,或者至少复制鲍勃或我的结果?谢谢!
检测结果:
+000000000 00:00:00 004000000(VARCHAR2)
+000000000 00:00:00.298000000(CLOB SUBSTR)
+000000000 00:00:00.356000000(DBMS_LOB.SUBSTR)
测试代码:
DECLARE
l_text VARCHAR2(30) := 'This is a test record';
l_clob CLOB := l_text;
l_substr VARCHAR2(30);
t TIMESTAMP;
BEGIN
t := SYSTIMESTAMP;
FOR i IN 1..100000 LOOP
l_substr := SUBSTR(l_text,1,14);
END LOOP;
dbms_output.put_line( SYSTIMESTAMP - t || ' (VARCHAR2)');
t := SYSTIMESTAMP;
FOR i IN …Run Code Online (Sandbox Code Playgroud)