Как вы уже знаете, в функциях, процедурах, пакетах и триггерах можно найти интересующий текст с помощью вьюшки словаря данных user_source:
select * from user_source where upper(text) like '%TEMPLATE%';
Однако тексты вьюшек хранятся отдельно от user_source во вьюшке user_views.
Найти в user_views все вьюшки, содержащие в коде выражение'TEMPLATE'.
Попытка поискать данные в поле text с типом данных long запросом
select * from user_views where text like '%TEMPLATE%';
приводит к ошибке, т.к. тип данных long устроен хитро.
Переменную типа long при длине текста до 32000 символов можно сравнивать like-ом внутри PL/SQL блока:
begin
for z in (select view_name, text from user_views where text_length < 32000) loop
if upper(z.text) like '%TEMPLATE%' then
dbms_output.put_line(z.view_name);
end if;
end loop;
end;
После этого можно вручную посмотреть вьюшки с text_length >= 32000 и поискать в их тексте желанное выражение:
select view_name, text from user_views where text_length >= 32000;
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:
(При работе с джобами удобно использовать именованную нотацию.)
Заметим, что на сервере может быть установлено ограничение на количество разрешенных джобов, т.е. вышеприведенный запуск не гарантирует того, что джоб реально стартует.
Поищем, присутствует ли джоб с выдавшимся в 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 разумно выполнять, когда джоб не занимается выполнением поставленной на расписание процедуры, а отдыхает, ожидая следующего запуска.