关于在sql上查询blob类型数据的操作要点

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('肖舞') raw2from 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 fromdual;

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_testvalues(1,UTL_RAW.CAST_TO_RAW('xiaowurq'));

1 row created.

SQL> insert into  blob_testvalues(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 fromblob_test;

       ID VAR1

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

        1 xiaowurq

        2 肖舞

        3 xiaowurq

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


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

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

1 row updated.

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_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 fromblob_test where content like '%xiaowu%';

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

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB


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

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

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER gotBLOB

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

SQL> select id,UTL_RAW.CAST_TO_VARCHAR2(content) var1 fromblob_test wheredbms_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 fromblob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0;

Enter value for 1: xiaowu

old   1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('&1'),1,1) >0

new   1: selectid,UTL_RAW.CAST_TO_VARCHAR2(content) var1 from blob_test wheredbms_lob.instr(content,utl_raw.cast_to_raw('xiaowu'),1,1) >0

       ID VAR1

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

        1 xiaowurq

        3xiaowurq肖舞

你可能感兴趣的:(oracle,sql,oracle)