如何解决 ORA-27475: "JOB" 必须是程序或链
How to resolve ORA-27475: "JOB" must be a program or chain
我有几个 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;
/
但是检查日志 table 我发现作业失败,错误代码: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
您需要确认几件事:
最好在OWNER.JOBNAME中指定完整的作业名称。查看谁是作业的所有者
select * from dba_scheduler_jobs where lower(job_name)='start_archive';
如果 start_date 和 repeat_interval 保留为空,则一旦启用作业,作业就会安排到 运行。
作业运行作为安排作业的人,如果您想使用当前用户权限,则不应以 SYS 身份安排作业!
参考资料:-
问题可能出在链和链步名称中。尝试对所有作业、链和链步骤使用大写字母或用双引号将名称括起来:" "
在 oracle 中,标识符不区分大小写并转换为大写。因此,oracle 无法找到您的连锁店名称。这同样适用于链步骤、规则等
此外,过程 "send" 和 "receive" 需要参数 (p_to_date),并且这些参数不会在链步骤调用期间传递。这会导致问题。没有直接的方式来传递链参数。看看这个 post: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
我有几个 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;
/
但是检查日志 table 我发现作业失败,错误代码: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
您需要确认几件事:
最好在OWNER.JOBNAME中指定完整的作业名称。查看谁是作业的所有者
select * from dba_scheduler_jobs where lower(job_name)='start_archive';
如果 start_date 和 repeat_interval 保留为空,则一旦启用作业,作业就会安排到 运行。
作业运行作为安排作业的人,如果您想使用当前用户权限,则不应以 SYS 身份安排作业!
参考资料:-
问题可能出在链和链步名称中。尝试对所有作业、链和链步骤使用大写字母或用双引号将名称括起来:" "
在 oracle 中,标识符不区分大小写并转换为大写。因此,oracle 无法找到您的连锁店名称。这同样适用于链步骤、规则等
此外,过程 "send" 和 "receive" 需要参数 (p_to_date),并且这些参数不会在链步骤调用期间传递。这会导致问题。没有直接的方式来传递链参数。看看这个 post: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