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

Задача. Проставление роста животных.

Даны таблицы млекопитающих, птиц и значений среднего роста животных в сантиметрах:

create table mammals(mammal_name varchar2(50), height number, weight number);

insert into mammals(mammal_name) values('жираф');

insert into mammals(mammal_name) values('кит');

create table birds(bird_name varchar2(50), height number, weight number);

insert into birds(bird_name) values('страус');

insert into birds(bird_name) values('курица');

create table animal_heights(animal_name varchar2(50), height number);

insert into animal_heights(animal_name, height) values('жираф', '550');

insert into animal_heights(animal_name, height) values('кошка', '30');

insert into animal_heights(animal_name, height) values('страус', '250');

insert into animal_heights(animal_name, height) values('курица', '35');

Следует проставить в поля mammals.height и birds.height соответствующие значения из animal_heights.

Напишем блок кода, решающий задачу. Для реализации left join в oracle существует возможность упрощенной записи с помощью знака '(+)', которую мы продемонстрируем. Update будем делать по rowid ради повышения скорости работы:

begin

for z in (select a.animal_name, a.height, m.rowid m_rowid, b.rowid b_rowid

from animal_heights a, mammals m, birds b

where a.animal_name = m.mammal_name(+)

and a.animal_name = b.bird_name(+)) loop

if z.m_rowid is not null then

update mammals set height = z.height where rowid = z.m_rowid;

end if;

if z.b_rowid is not null then

update birds set height = z.height where rowid = z.b_rowid;

end if;

end loop;

end;

Посмотрим результаты update-ов:

select * from mammals;

select * from birds;

Jobs.

В оракле есть возможность поставить процедуру на регулярное выполнение по расписанию. Это делается с помощью механизма джобов.

С помощью вызова dbms_job.submit создадим джоб, запускающий процедуру load_kk_st_deposit из задачи "Загрузка данных с помощью full join".

Параметр next_date имеет тип данных date, это показатель, в какой момент времени джоб запустится в первый раз.

В данном вызове "next_date => sysdate + 1 / 24 / 60 / 2" означает, что джоб запустится через полминуты после выполнения нижеприведенного вызова.

Параметр interval имеет строковый тип данных, это показатель, с какой частотой будет выполняться джоб.

В данном вызове "interval => 'trunc(sysdate, ''MI'') + 1 / 24 / 60'" означает, что всякий раз по завершении выполнения джоба он будет ставиться на запуск по расписанию в следующий ближайший момент с целым количеством минут и нулем секунд.

Если вызываемая процедура load_kk_st_deposit будет выполняться быстрее минуты, то джоб будет отрабатывать раз в минуту.

Итак, вызываем создание джоба. Посмотрим получившийся номер джоба в dbms_output:

declare

v_job_number integer;

begin

dbms_job.submit(job => v_job_number,

what => 'declare

i integer;

d integer;

u integer;

begin

load_kk_st_deposit(i, d, u);

end;',

next_date => sysdate + 1 / 24 / 60 / 2,

interval => 'trunc(sysdate, ''MI'') + 1 / 24 / 60');

dbms_output.put_line(to_char(v_job_number));

commit;

end;

(При работе с джобами удобно использовать именованную нотацию.)

Заметим, что на сервере может быть установлено ограничение на количество разрешенных джобов, т.е. вышеприведенный запуск не гарантирует того, что джоб реально стартует.

Поищем, присутствует ли джоб с выдавшимся в dbms_output номером в системной вьюшке user_jobs:

select * from user_jobs where job = 466423;

В этом месте читателю предлагается самостоятельно проверить, что джоб действительно регулярно выполняет процедуру load_kk_st_deposit и занимается загрузкой данных из kk_deposit в kk_st_deposit.

Теперь поменяем джоб с помощью команды dbms_job.change. Сделаем так, чтобы гонялся пустой PL/SQL-блок один раз в час:

begin

dbms_job.change(job => 466423,

what => 'begin null; end;',

next_date => sysdate,

interval => 'trunc(sysdate, ''HH24'') + 1 / 24');

commit;

end;

В этом месте читателю предлагается самостоятельно проверить, что джоб более не занимается загрузкой данных, а ничего полезного уже не делает.

Теперь поставим джобу параметр broken, равный true. Это отключит выполнение джоба, оставив его в памяти.

begin

dbms_job.broken(job => 466423, broken => true);

commit;

end;

Снова включим джоб, установив параметр broken, равный false. Если другие параметры не указаны, то джоб сразу запустится.

begin

dbms_job.broken(job => 466423, broken => false);

commit;

end;

Командой dbms_job.remove можно удалить джоб навсегда.

begin

dbms_job.remove(job => 466423);

commit;

end;

Отметим, что команды dbms_job.change, dbms_job.broken, dbms_job.remove разумно выполнять, когда джоб не занимается выполнением поставленной на расписание процедуры, а отдыхает, ожидая следующего запуска.

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