我有几个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
答案 0 :(得分:5)
您需要确定几件事:
最好在OWNER.JOBNAME中指定完整的作业名称。查看谁是工作的所有者
select * from dba_scheduler_jobs where lower(job_name)='start_archive';
如果start_date和repeat_interval保留为null,则作业计划在作业启用后立即运行。
作业以计划作业的人身份运行,如果要使用当前用户权限,则不应将作业调度为SYS!
参考文献: -
<强> 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