Как разрешить ORA-27475: "работа" должна быть программой или цепочкой

у меня есть несколько процедур oracle:

create or replace procedure receive_sms (p_to_date in date) 
is
..
end;

и

create or replace procedure send_sms (p_date in date) 
is
..
end;

и я хочу создать цепочку на основе этих процедур и добавить шаги в цепочку и некоторые правила:

BEGIN
  DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name            =>  'mobile_archive_chain',
   rule_set_name         =>  NULL,
   evaluation_interval   =>  NULL,
   comments              =>  NULL);
END;
/

--- define three steps for this chain. Referenced programs must be enabled.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('mobile_archive_chain', 'send',  'inforpilla.send_sms');
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('mobile_archive_chain', 'receive', 'inforpilla.receive_sms');
END;
/

--- define corresponding rules for the chain.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'TRUE', 'START send');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'send COMPLETED', 'Start receive');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'receive COMPLETED', 'END');
END;
/

--- enable the chain
BEGIN
 DBMS_SCHEDULER.ENABLE('mobile_archive_chain');
END;
/

--- create a chain job to start the chain daily at 1:00 p.m.
BEGIN
 DBMS_SCHEDULER.CREATE_JOB (
   job_name        => 'start_archive',
   job_type        => 'CHAIN',
   job_action      => 'mobile_archive_chain',
   repeat_interval => 'freq=daily;byhour=15;byminute=3;bysecond=0',
   enabled         => TRUE);
END;
/

но проверка таблицы журнала я вижу, что задание не удалось с кодом ошибки: 27475

SELECT * from USER_SCHEDULER_JOB_RUN_DETAILS ORDER BY LOG_DATE DESC

как было предложено, я удаляю параметры из процедуры, но затем я получил эти ошибки:

CHAIN_LOG_ID="201095"
CHAIN_LOG_ID="201095",STEP_NAME="RECEIVE", ORA-27475: "TEST.RECEIVE_SMS" must be a PROGRAM OR CHAIN
CHAIN_LOG_ID="201095",STEP_NAME="SEND", ORA-27475: "TEST.SEND_SMS" must be a PROGRAM OR CHAIN

3 ответов


есть пара вещей, которые вам нужно убедиться:

  1. лучше указать полное имя задания в OWNER.ИМЯ ЗАДАНИЯ. Посмотрите, кто является владельцем job

    select * from dba_scheduler_jobs where lower(job_name)='start_archive';
    
  2. Если start_date и repeat_interval оставлены null, то задание планируется запустить, как только задание включено.

  3. задание выполняется как человек, который планирует задание, вы не должны планировать задания как SYS, если вы хотите использовать текущие права пользователя!

ссылки :-

Сообщество Oracle

Спросить Тома


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

в oracle обрабатывает идентификаторы без учета регистра и преобразует в верхний регистр. Следовательно, oracle не удалось найти имя вашей цепочки. То же самое относится к шагам цепочки, правилам и т. д.

кроме того, процедуры "отправить " и" получить " ожидают параметры (p_to_date) , и эти параметры не передаются во время цепочки шаг зовет. Это вызовет проблему. Нет прямого способа передать параметры цепочки. Посмотрите на этот пост: community.oracle.com/message/1459336#1459336


Я думаю, вы должны использовать DBMS_SCHEDULER.CREATE_PROGRAM для создания объекта программы, а затем передать имя этого объекта в DBMS_SCHEDULER.DEFINE_CHAIN_STEP. Похоже, третий аргумент DEFINE_CHAIN_STEP-это имя программы, и вы определяете это имя программы с помощью вызова CREATE_PROGRAM.

url руководства:

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72235