【问题标题】:Create a Job in ORACLE在 ORACLE 中创建作业
【发布时间】:2020-02-23 05:11:13
【问题描述】:

我必须定期创建工作。

但首先我创建了一个简单的作业来学习如何在 oracle 中创建作业,因为这是我第一次使用作业。

它以 systimestamp 运行,但作业没有执行。

create or replace procedure job_test
is
begin
update table_a set value_user = 'JOB_EXECUTED' where id = 1; 
commit;
end;
/

然后是调度器作业

begin 
dbms_scheduler.create_job(
job_name => 'test_job_A',
job_type => 'stored_procedure',
job_action => 'job_test',
start_date = SYSTIMESTAMP,
enabled => true
);
end;
/

然后我查阅了 value_user 列,它还没有更新。

 select * from table_A where id = 1;

谁能解释一下我错过了什么。

【问题讨论】:

  • 我创建了一个只有“value_user”和“id”列的测试表“table_a”。然后我插入了一行值(id = 1,value_user = 'test')。然后我创建了你的程序和你的工作。我已经在 SQL 开发人员中完成了这项工作,一切正常。当我运行查询“select * from table_A where id = 1;”时我得到(id = 1,value_user = JOB_EXECUTED)。你的表中有一行 id = 1 吗?我不得不问:)

标签: oracle stored-procedures dbms-scheduler


【解决方案1】:
create table user_count (
number_of_users NUMBER(4),
time_of_day   TIMESTAMP
);

CREATE OR REPLACE PROCEDURE insert_user_count AS
 v_user_count NUMBER(4);
BEGIN
 SELECT count(*)
  INTO v_user_count
 FROM v$session
 WHERE username IS NOT NULL;
 INSERT INTO user_count
 VALUES (v_user_count, systimestamp);
 commit;
 END insert_user_count;

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
 program_name      => 'PROG_INSERT_USER_COUNT',
 program_action     => 'INSERT_USER_COUNT',
 program_type      => 'STORED_PROCEDURE');
END; 

BEGIN
 DBMS_SCHEDULER.CREATE_SCHEDULE (
 schedule_name   => 'my_weekend_5min_schedule',
 start_date    => SYSTIMESTAMP,
 repeat_interval  => 'FREQ=MINUTELY; INTERVAL=5; BYDAY=SAT,SUN',
 end_date     => SYSTIMESTAMP + INTERVAL '30' day,
 comments     => 'Every 5 minutes');
END;

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
  job_name     => 'my_user_count_job',
  program_name   => 'prog_insert_user_count',
  schedule_name   => 'my_weekend_5min_schedule');
END;

exec dbms_scheduler.enable('my_user_count_job’)

select * from user_count;

select job_name, status, run_duration, cpu_used
from USER_SCHEDULER_JOB_RUN_DETAILS
where job_name = ‘MY_USER_COUNT_JOB’;

【讨论】:

  • 还要解释您对您所做的事情以及它如何满足 OP 的回答
【解决方案2】:

确实,您的情况应该可以工作,但只有一次(如果已经存在 id 值等于 1 的行)。假设您有一个插入语句而不是更新,但没有重复使用新的递增 ID 值填充表。

为此,重要的一点是添加repeat_interval 参数,如下所示:

begin 
  dbms_scheduler.create_job(
                            job_name => 'test_job_A',
                            job_type => 'stored_procedure',
                            job_action => 'job_test',
                            start_date => SYSTIMESTAMP,
                            enabled => true,
                            repeat_interval => 'FREQ=MINUTELY;INTERVAL=5',
                            auto_drop => false,
                            comments => 'Inserts new records' 
                           );
end;
/

每五分钟插入一次新记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2022-01-15
    • 2010-11-05
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多