scheduler / SQL开发人员中的Oracle DBMS作业

时间:2014-02-20 09:42:16

标签: sql oracle

我有以下程序

create or replace
procedure test_vinod_cur
is
cursor emp_cur is  select * from test_vino ;
emp_rec test_vino%rowtype;
BEGIN
open emp_cur;
loop
fetch emp_cur into emp_rec;
EXIT WHEN EMP_CUR%NOTFOUND;

insert into test_vino_id values (emp_rec.emp_id,emp_rec.emp_name);
end loop;
CLOSE EMP_CUR;
commit work;
END;

如何通过sql developer窗口中的DBMS作业安排此过程,以便它每天上午9点运行。此外,如果作业失败,我怎么能找到。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:1)

exec  dbms_scheduler.create_job(
        job_name        => 'INSERT_VINO',
        job_type        => 'STORED_PROCEDURE',
        job_action      => 'test_vinod_cur',
        repeat_interval => 'freq=daily;byhour=9;byminute=00',
        end_date        => NULL,
        enabled         => TRUE);

注意: SQL * Plus会运行上面的内容,因为您无法在多行上进行存储过程调用(但我认为在此答案中更容易阅读我的SQL客户端没有这个限制)。
不了解SQL Developer,但如果失败,请尝试将整个exec调用放在一行。

有关dbms_scheduler包的更多详细信息,请参阅手册:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sched.htm#CIHHBGGI


关于程序的一句话。游标方法高度效率低,速度慢且不可扩展。您可以在没有循环或光标的情况下重写您的过程:

create or replace procedure test_vinod_cur
is
BEGIN
  insert into test_vino_id (emp_id, emp_name)
  select emp_id, emp_name 
  from test_vino;
  commit work;
END;
/

这将更多更快。在insert into ...部分中指定目标表的所有列也是一种很好的编码实践。