oracle数据库中,在blob类型数据中存储了文本文件,需要查询出哪些记录的content字段(blob类型)包含“菠萝”这个词。
一开始使用SQL语句: select id,content from text where CONTENT LIKE '%菠萝%'
出现错误:ORA-00932:数据类型不一致:应为NUMBER,但却获得BLOB
后得知可以使用dbms_lob包对文本内容进行操作。
dbms_lob.instr()语法为:
INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)
源字符串:字符串或者列
目标字符串:要定位的字符串
起始位置:开始的位置
匹配序号:目标字符串第几次出现
注意:开始位置是从1开始的
因此将SQL查询语句修改为:select id,content from text WHERE dbms_lob.instr(CONTENT,'菠萝',1,1)>0
出现错误:ORA-01465:无效的十六进制数字(指‘菠萝’无效)
需要将菠萝转成有效的十六进制,因为Oracle中用于保存位串的数据类型是RAW,LONG RAW(推荐使用BLOB),所以使用utl_raw.cast_to_raw([varchar2]);--将varchar2转换为raw类型。
将SQL语句修改为:
select id,content
from text
where dbms_lob.instr(content,utl_raw.CAST_TO_RAW('菠萝'),1,1)>0;
成功获取含有'菠萝'字符串的记录
部分内容摘自:
http://blog.csdn.net/john2522/article/details/8124087
http://blog.csdn.net/pc_gad/article/details/47100863