Написать pl/sql функцию, которая считает число вхождений в заданную строку заданной подстроки. Вариант 1 – с перекрытиями, т.е. kk_instr_count_cover('перерезать', 'ере') = 2. Вариант 2 – без перекрытий, т.е.kk_instr_count_nocover('перерезать', 'ере') = 1.
Создадим функцию по поиску подстроки с перекрытиями:
create or replace function kk_instr_count_cover(in_string in varchar2,
in_substring in varchar2)
return integer is
v_result integer := 0;
i integer;
begin
if in_string is null then
return 0;
end if;
for i in 1 .. length(in_string) loop
if instr(in_string, in_substring, i) = i then
v_result := v_result + 1;
end if;
end loop;
return v_result;
end kk_instr_count_cover;
Создадим функцию по поиску подстроки без перекрытий:
create or replace function kk_instr_count_nocover(in_string in varchar2,
in_substring in varchar2)
return integer is
v_result integer := 0;
v_str varchar2(4000);
begin
v_str := in_string;
while instr(v_str, in_substring) > 0 loop
v_result := v_result + 1;
v_str := substr(v_str,
instr(v_str, in_substring) + length(in_substring));
end loop;
return v_result;
end kk_instr_count_nocover;
Протестируем:
select kk_instr_count_cover('перерезать', 'ере'),
kk_instr_count_cover('тест', ''),
kk_instr_count_cover('тест', 'нет'),
kk_instr_count_cover('', ''),
kk_instr_count_cover('', 'лол'),
kk_instr_count_cover('ололололенька', 'оло'),
kk_instr_count_nocover('перерезать', 'ере'),
kk_instr_count_nocover('тест', ''),
kk_instr_count_nocover('тест', 'нет'),
kk_instr_count_nocover('', ''),
kk_instr_count_nocover('', 'лол'),
kk_instr_count_nocover('ололололенька', 'оло')
from dual;