我的问题是在包中使用DBMS_SCHEDULER。我已经为用户提供了SCHEDULER_ADMIN权限。现在,我可以在程序之外通过脚本创建作业后,在我的程序中设置这些命令。
-- set Job-Parameters
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => jobidentifier,
attribute => 'job_action',
value => jobparam);
-- Job run.
DBMS_SCHEDULER.ENABLE(jobidentifier);
到目前为止一切进展顺利。
现在我的问题:为什么这些命令在我的程序代码中不起作用?
-- Stop Job
DBMS_SCHEDULER.STOP_JOB (
job_name => jobidentifier,
force => true);
-- disable Job
DBMS_SCHEDULER.DISABLE(jobidentifier);
只要我通过脚本在自己的会话中输入命令而不是嵌入在包代码中,命令就可以工作。问题是我想在我的PL-SQL包中输入这些命令,因为在我的包中我知道何时发生错误,所以我想输入这些命令。
你能帮帮我吗?非常感谢你。我收到以下错误:
ORA-27486:Nicht ausreichende Berechtigungen ORA-06512:in" SYS.DBMS_ISCHED",Zeile 210 ORA-06512:in" SYS.DBMS_SCHEDULER",Zeile 557 ORA-06512: in" SCHEMANAME.JOB_KILLEN_PCK",Zeile 31 ORA-06512:在Zeile 6中
我所做的格兰特是由sys_user提供的:
GRANT SCHEDULER_ADMIN TO SCHEMANAME
第31行中的有以下代码
DBMS_SCHEDULER.STOP_JOB ( job_name => jobname, force => true);
这是出于安全原因,Oracle不希望我通过启动过程来阻止stop_jobs。因为这样我可以停止每个工作,我知道这个名字?如果这是正确的,我将无法在我的程序中的作业期间发生故障时停止作业
如果您愿意,我可以将测试包发送给您
答案 0 :(得分:0)
我认为使用force选项的stop_job需要授予拥有该作业的用户的MANAGE SCHEDULER系统特权。
希望这有帮助。
@balakshman
答案 1 :(得分:0)
请不要使用Force选项,您会很好,请在下面的示例中找到它与程序包集成很好的工作。
DECLARE
V_COUNT NUMBER(3);
BEGIN
DBMS_SCHEDULER.STOP_JOB(job_name=>'ORDER_REPORT_JOB_1');
SELECT COUNT(*) INTO V_COUNT FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'ORDER_REPORT_JOB_1';
--THIS ORDER_REPORT_JOB_1 EXIST THEN ONLY DROP THE JOB
IF (V_COUNT=1) THEN
DBMS_SCHEDULER.DROP_JOB ('ORDER_REPORT_JOB_1');
END IF;
END;
/