Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
24.01.2020
Размер:
401.64 Кб
Скачать

Задача. Подсчет числа вхождений подстроки в строку.

Написать 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;

Задача. Копирование таблицы фиксированной структуры.

Написать процедуру копирования всех строк из таблицы kk_smpl в таблицу kk_smpl_copy (такой же структуры).

Параметр процедуры – do_commit. Если do_commit = 0, то не коммитить, если do_commit = 1, то коммитить.

Поясню, что такое commit. Пока в сессии не сделан commit, произведенные изменения данных видны только в рамках этой сессии. Когда сделан commit, изменения посылаются на сервер и становятся видны во всех сессиях.

Командой, обратной команде commit, т.е. командой отката данных, является rollback.

Любая DDL-команда (команда изменения структуры данных) делает commit автоматически.

Создаем таблицы:

CREATE TABLE KK_SMPL

(

ID INTEGER,

DT DATE,

AMOUNT NUMBER(16, 2),

FULLNAME VARCHAR2(50),

PASSPORT CHAR(11)

);

insert into kk_smpl

(id, dt, amount, fullname, passport)

values

(1, sysdate, 34.7, 'Иванов', '2704 871905');

commit;

CREATE TABLE KK_SMPL_COPY

(

ID INTEGER,

DT DATE,

AMOUNT NUMBER(16, 2),

FULLNAME VARCHAR2(50),

PASSPORT CHAR(11)

);

Создаем процедуру копирования:

create or replace procedure kk_copy(do_commit in integer := 0) is

begin

insert into kk_smpl_copy

(id, dt, amount, fullname, passport)

select id, dt, amount, fullname, passport from kk_smpl;

if do_commit = 1 then

commit;

end if;

end kk_copy;

Вызываем процедуру копирования:

begin

kk_copy(1);

end;

Проверим результат:

select * from kk_smpl_copy;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]