Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 вытащить все подстроки clob  [new]
Dima Ry
Member

Откуда: Тольятти, Самара
Сообщений: 118
можно ли просто решить такую задачку одним запросом:

Есть таблица, в которой есть поле clob, в котором хранятся vbscript'ы. Размер примерно 10 000 строк в каждом clob'е. Строки разделены c помощью chr(10).

Нужно произвести поиск подстроки и вывести все строки, содержащие подстроку. Что то типа grep.

Входная таблица
create table Scripts(Id number, Body clob);

Вывод типа
"id" "строка, содержащая подстроку"
1 бла1 бла1 подстрока бла1 бла1
1 бла2 бла2 подстрока бла2 бла2
2 бла3 бла3 подстрока бла3 бла3
3 бла4 бла4 подстрока бла4 бла4


Заранее спасибо за подсказки
27 ноя 15, 10:57    [18480263]     Ответить | Цитировать Сообщить модератору
 Re: вытащить все подстроки clob  [new]
Alexander_Ttl
Member

Откуда: Новосибирск
Сообщений: 158
Dima Ry, примерно так:
-- drop table t ;
create table t (id Number, c clob) ;

insert into t values(1,'bla-bla1'||chr(10)||'bla-bla-bla10'||chr(10)||'bla-bla15') ;
insert into t values(2,'blo-bla2'||chr(10)||'bla-bla20'||chr(10)||'bla-bla210'||chr(10)) ;
commit ;
--select * from t ;

with pttrn as (select '2' x from dual)
, t1 as (select t.id, dbms_lob.instr(c,chr(10),1,level) pos from t
connect by id=prior id and dbms_lob.instr(c,chr(10),1,level)!=0
and prior dbms_random.value is not null
union all select t.id, dbms_lob.getlength(c) pos from t)
, t2 as (select id, nvl(lag(pos) over (partition by id order by pos),0) lpos, pos from t1 a)
select a.id, dbms_lob.substr(b.c,pos-lpos-1, lpos+1) wanted_string, p.x pattern
 from t2 a, t b, pttrn p
where a.id=b.id and a.lpos!=pos
and dbms_lob.substr(b.c,pos-lpos-1, lpos+1) like '%'||p.x||'%' ;
28 ноя 15, 16:55    [18485393]     Ответить | Цитировать Сообщить модератору
 Re: вытащить все подстроки clob  [new]
Alexander_Ttl
Member

Откуда: Новосибирск
Сообщений: 158
Небольшую ошибочку допустил. Так будет правильно:
with pttrn as (select '5' x from dual)
, t1 as (select t.id, dbms_lob.instr(c,chr(10),1,level) pos from t
connect by id=prior id and dbms_lob.instr(c,chr(10),1,level)!=0
and prior dbms_random.value is not null
union all select t.id, dbms_lob.getlength(c)+1 pos from t)
, t2 as (select id, nvl(lag(pos) over (partition by id order by pos),0) lpos, pos from t1 a)
--select * from t2
select a.id, dbms_lob.substr(b.c,pos-lpos-1, lpos+1) wanted_string, p.x pattern
 from t2 a, t b, pttrn p
where a.id=b.id and a.lpos!=pos
and dbms_lob.substr(b.c,pos-lpos-1, lpos+1) like '%'||p.x||'%' ;
28 ноя 15, 17:22    [18485482]     Ответить | Цитировать Сообщить модератору
 Re: вытащить все подстроки clob  [new]
Alexander_Ttl
Member

Откуда: Новосибирск
Сообщений: 158
Ну и условие нужно тогда тоже поправить
where a.id=b.id and a.lpos!=pos-1
28 ноя 15, 17:37    [18485536]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить