加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于oracle中blob字段查询的问题

(2014-11-25 16:38:01)
标签:

it

分类: sql语句

        blob字段直接用 select   * from  table_name  where  column  like ‘%%’查找的时候是不能实现的 ,主要是字段类型不符。
不过我们可以用数据库自带的 utl_raw 函数进行 blob 字段的插入,查询和模糊匹配。

        先介绍一下Oracle中RAW和 varchar2常用的两个转换函数

1. UTL_RAW.CAST_TO_RAW   

该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW。

SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') from dual;

SQL> select UTL_RAW.CAST_TO_RAW('xiaowurq') raw1, UTL_RAW.CAST_TO_RAW('肖舞') raw2 from dual;

RAW1                           RAW2

------------------------------ ------------------------------

7869616F77757271               D0A4CEE8

    

也可以用 rawtohex 函数实现:

SQL> select rawtohex('xiaowurq') raw1,rawtohex('肖舞') raw2 from dual;

RAW1                           RAW2
------------------------------ ------------------------------
7869616F77757271               D0A4CEE8


2. UTL_RAW.CAST_TO_VARCHAR2

该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。

SQL> select UTL_RAW.CAST_TO_VARCHAR2('7869616F77757271') var1, UTL_RAW.CAST_TO_VARCHAR2('D0A4CEE8') var2 from dual;

VAR1                           VAR2

------------------------------ ------------------------------

xiaowurq                       肖舞

其实RAW和VARCHAR是类似的,只是存储在RAW里的是二进制值,在任何时候不会做自动的字符集转换,这是RAW和VARCHAR的不同,RAW只是一种外部类型,其内部存储是VARRAW。

下面整体做个实验:

(1) 创建表

SQL> create table blob_test( id number, content blob);

Table created.


(2) 插入数据

SQL> insert into blob_test values(1,'xiaowurq');

insert into blob_test values(1,'xiaowurq')

                              *

ERROR at line 1:

ORA-01465: invalid hex number

由报错可以看出,无法直接往 blob字段中插入数据,下面用 UTL_RAW.CAST_TO_RAW 和 ,RAWTOHEX 函数转换一下再插入。

SQL> insert into blob_test values(1,UTL_RAW.CAST_TO_RAW('xiaowurq'));

1 row created.

SQL> insert into  blob_test values(2,RAWTOHEX('肖舞'));

1 row created.

SQL> select * from blob_test;

        ID CONTENT
---------- --------------------------------------------------
         1 7869616F77757271
         2 D0A4CEE8

可以看到用两个函数转换,都可以插入成功,并且可以直接查询出来,但插入到数据库里面的结果为 16进制数据,(注:11g 的数据库可以直接查出来, 10g 的无法直接查询 blob字段数据)。那么我们能直接往表中以 16进制的方式插入数据吗?

SQL> insert into blob_test values(3,'7869616F77757271');

1 row created.

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test;

        ID VAR1

---------- ------------------------------

         1 xiaowurq

         2 肖舞

         3 xiaowurq

可以看出是可以直接往数据库里插入16进制数据的,并且我们可以看到用两种方式插入的结果是一致的。


(3) 下面是对 blob 字段的修改操作,不再做过多解释。

SQL> update blob_test set content = RAWTOHEX('肖舞') where id=3;

1 row updated.

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test;

        ID VAR1

---------- ------------------------------

         1 xiaowurq

         2 肖舞

         3 肖舞

SQL> update blob_test set content = '7869616F77757271D0A4CEE8' where id=3;

1 row updated.

SQL> select * from blob_test;

        ID CONTENT

---------- --------------------------------------------------

         1 7869616F77757271

         2 D0A4CEE8

         3 7869616F77757271D0A4CEE8


(4) 对 blob 字段的模糊查询。

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where content like '%xiaowu%';

select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where content like '%xiaowu%'
                                                                      *

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER got BLOB


SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where content like '�A4CEE8%';

select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where content like '�A4CEE8%'
                                                                      *

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER got BLOB

有上面的两个命令和报错可以看出,无法对 blob 字段进行模糊查询,及时用 16进制数据去匹配也不行,不过我们可以通过下面的方法实现对 blob 字段进行模糊匹配。

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where dbms_lob.instr(content,utl_raw.cast_to_raw('肖舞'),1,1) > 0;

        ID VAR1

---------- ------------------------------

         2 肖舞

         3 xiaowurq肖舞

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where dbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) > 0;

Enter value for 1: xiaowu

old   1: select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where dbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) > 0

new   1: select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test where dbms_lob.instr(content,utl_raw.cast_to_raw('xiaowu'),1,1) > 0

        ID VAR1

---------- ------------------------------

         1 xiaowurq

         3 xiaowurq肖舞


参考网站:

 http://blog.csdn.net/springk/article/details/6866248

 http://www.cnblogs.com/hellofei/archive/2010/03/25/1695297.html

 http://www.cnblogs.com/hellofei/archive/2010/03/25/1696091.html


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有