1、如何对CLOB字段进行全文检索?
习惯了使用%来进行模糊查询,可发现在CLOB上行不通了,原来CLOB的查询是有专门的LOB操作工具的。
说明: CLOB字段可以select,但select时不可以使用where
SQL> create table a(a clob);
SQL> insert into a values('1234');
SQL> insert into a values('5648');
SQL> select *from a;
1234
5648
SQL> select * from a where a like '%';
select * from a where a like '%'
*
ERROR 位于第 1 行:
ORA-00932: 数据类型不一致
SQL> SELECT * FROM A WHERE
dbms_lob.instr(a.a,'12',1,1)>0;
1234
SQL> SELECT * FROM A WHERE
dbms_lob.instr(a.a,'5',1,1)>0;
5648
Robbin观点
Oracle9iR2 和Oracle
10G以上版本已经可以直接进行clob的插入,条件查询,模糊查询了。这一点,你可以试一试,我这周周一刚刚在Oracle10.1.0.3
Linux x86上面试过,不管是where还是like,就像varchar2一样处理。
另外将Oracle JDBC
Driver升级到最新的版本,即Oracle10.1.0版本同时发布的odjbc14.jar,那么你将直接可以对clob进行操作。即
java代码:
pstmt.setString(x, 'xxxxx'); // 不需要setClob
pstmt.getString(x,'xxx'); // 不需要getClob
也就是说,如果你使用最新的Oracle JDBC
Driver,使用比较新的Oracle版本,你就可以直接像操作varchar2那样操作clob,没有任何限制了。
一.
用普通的方法行不通
PreparedStatement pst =
conn.prepareStatement("insert into table(name,book)
values(?,?)");
pst.setString(1, "spring");
pst.setString(2,s);
pst.execute();
这么写报错:
java.sql.SQLException: 数据大小超出此类型的最大值: 5606
5606是oracle判断的字符数
在网上查了以下,有高手说可能是oracle
jdbc实现setString方法的原因
用字符流插入就行了
PreparedStatement pst =
conn.prepareStatement("insert into table(name,book)
values(?,?)");
pst.setString(1, "spring");
pst.setCharacterStream(2, new
InputStreamReader(new ByteArrayInputStream(s.getBytes())),
s.length());
pst.execute();
这样可以正常插入
可是好景不长,修改也用如此方法改之,记过又报错: java.sql.SQLException:
ORA-01483: DATE 或 NUMBER 赋值变量的长度无效
我晕,在我本地机子上tomcat环境下运行是没有这种错误的,而部署到服务器上,服务器上是weblogic,就报这样的错误,修改失败,而
insert就没有错误,而且如果修改字符数较小的就能修改成功,如果修改较大的就会报错,之后不管修改什么样的,都会报错,闹鬼了,纳闷了,这是什么错
误啊,接着在网上查,高手建议把一个字符拆成两个代入
改成下面这样子
int
length=book.length();
String s1="";
String
s2="";
if(length>1000){
s1=book.substring(0,1000);
s2=book.substring(1000,length);
}else{
s1=book;
}
pstmt =
conn.prepareStatement("update table set book=?||?
"+
"where
name=?");
pstmt.setString(1, s1);
pstmt.setString(2, s2);
pstmt.setInt(3, “spring”);
结果就成功了,嘿嘿,原来还有这种方法,这是oracle特有的么?呵呵对oracle不熟悉
而让人纳闷的是为什么在我的tomact下就没有这种错误呢,而insert的时候也没有错误啊。纳闷
二.
oracle中大文字量的处理
这几天被oracle中的clob字段搞得心烦意乱,在数据库中有字段content,在hibernate中配置文件如下:
Java代码
使用了ojdbc14.jar这个oracle10G的数据库驱动以后,可以把clob当成string直接操作,但是在hibernate里使用text类型来映射,在pojo类中还是直接使用string.
查了网上很多资料,许多都是要使用流操作来操作clob,这个对于hibernate不好用。
按以上配置好后,在插入数据还是保存,错误如下:
Java代码
java.sql.SQLException: ORA-01483: DATE 或 NUMBER 赋值变量的长度无效
java.sql.SQLException: ORA-01483: DATE 或 NUMBER 赋值变量的长度无效
郁闷了很久,结果最后发现,当插入String字段在1001至2000长度时会报这个错误,当长度不在这个区间就不会出这种问题,现在的办法是把插入字段在1001至2000时,添加空格增加长度,这样就不会报错。
当取出来显示时就用trim就OK了。
ojdbc14.jar可以兼容至oracle8 ,但8需要打补丁。
三.
今天在将系统从DM5数据库移植到ORACLE8i上时,发现有个功能总是出现ORA-01483: DATE 或 NUMBER
赋值变量的长度无效,而在其它地方使用同样的方法操作BLOB字段,却不报错,感觉很郁闷。
通过多次测试,发现是由于传入的内容大小不同引起的,并且ORACLE8i的JDBC驱动写BLOB时,其内容大小不能超过4K,如果超过就会出错。通
过在网上查找,发现有个兄弟和我有同样问题,他说把驱动换成10g的就可以了,我换了个驱动,真的解决了这个问题。
上面的问题在请教同事时,同事也说有这个问题,他们是通过别的方法绕过去的:先将不包含大字段的内容insert到数据库中,然后单独用updata将blob更新进去。
-- Create table
create table BLOG_DOCUMENT
(
ID NUMBER(10) not null,
TITLE VARCHAR2(200),
TYPE NUMBER(10),
CONTENT CLOB,
CREATE_DATE DATE,
MOD_DATE DATE,
STATUS NUMBER(1),
EMP_ID NUMBER(10),
IS_PUBLIC NUMBER(1)
)
SELECT content, title FROM
blog_document WHERE dbms_lob.instr(blog_document.content,'周勇强',1,1) >
0;