如何解决ORA-27475:" JOB"必须是一个程序或链

时间:2017-09-21 13:19:06

标签: oracle oracle11g jobs dbms-scheduler

我有几个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;
/

但是检查日志表我发现作业失败了ERROR代码: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 个答案:

答案 0 :(得分:5)

您需要确定几件事:

  1. 最好在OWNER.JOBNAME中指定完整的作业名称。查看谁是工作的所有者

    select * from dba_scheduler_jobs where lower(job_name)='start_archive';
    
  2. 如果start_date和repeat_interval保留为null,则作业计划在作业启用后立即运行。

  3. 作业以计划作业的人身份运行,如果要使用当前用户权限,则不应将作业调度为SYS!

  4. 参考文献: -

    <强> Oracle Community

    <强> Ask Tom

答案 1 :(得分:2)

问题可能在于链条和链条步骤的名称。尝试对所有作业,链和链步骤使用大写,或用双引号括起名称:“”

在oracle中将标识符处理为不区分大小写并转换为大写。因此,oracle无法找到您的连锁名称。同样适用于连锁步骤,规则等

此外,过程“发送”和“接收”期望参数(p_to_date),并且在链式步骤调用期间不传递这些参数。这会导致问题。传递链参数没有直接的方法。看看这篇文章:community.oracle.com/message/1459336#1459336

答案 2 :(得分:1)

我认为您必须使用DBMS_SCHEDULER.CREATE_PROGRAM来创建程序对象,然后将该对象的名称传递给DBMS_SCHEDULER.DEFINE_CHAIN_STEP。看起来DEFINE_CHAIN_STEP的第三个参数是程序名,您可以通过调用CREATE_PROGRAM来定义该程序名。

手动网址:

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