我有以下程序
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点运行。此外,如果作业失败,我怎么能找到。
有什么建议吗?
由于
答案 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 ...
部分中指定目标表的所有列也是一种很好的编码实践。