oracle的clob赋值_(转)如何对CLOB字段进行全文检索和oracle中大文字量的处理

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值