我要在oracle 10g创建一个job,每天凌晨9点执行一个过程,过程名假定为 pro_1001 谢谢指点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我要在oracle 10g创建一个job,每天凌晨9点执行一个过程,过程名假定为 pro_1001 谢谢指点相关的知识,希望对你有一定的参考价值。

在sql developer的jobs下右键菜单新建比较简单。

介绍几个数据字典视图:
dba_jobs 本数据库定义到任务队列的任务
dba_jobs_running 目前正在运行的任务
user_jobs 当前用户拥有的任务

时间间隔 参数interval 设置
每天运行一次 'sysdate+1'
每小时运行一次 'sysdate+1/24'
每10分钟运行一次 'sysdate+10/(24*60)'
每30秒运行一次 'sysdate+30/(24*60*60)'
每星期一次 'sysdate+7'
不再运行该任务并删除它 null
以上时间间隔不能保证任务的下一次运行在一个特定的时间,仅仅能够指定一个任务两次运行之间的时间间隔

特定日期或时间的例子
每天午夜12点 'trunc(sysdate+1)'
每天早上8点30分 'trunc(sysdate+1)+(8*60+30)/(24*60)'
每星期二中午12点 'next_day(trunc(sysdate),"tuesday"+12/24)'
每个月第一天的午夜12点 'trunc(last_day(sysdate)+1)'

在总结之前,先把Job的参数一一说明一下:

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;

what参数是将被执行的PL/SQL代码块;

next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值,默认值是:“4000-1-1”;

interval参数何时这个工作将被重执行。

其中Interval这个值是决定Job何时,被重新执行的关键。

附上自己写的两个例子:

--每天凌晨一点执行
DECLARE
X NUMBER;
BEGIN
sys.dbms_job.submit(job => X,
what => 'begin pro_job_test.pro_job_day; end;',
next_date =>to_date('13-07-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => ' TRUNC(SYSDATE+1)+1/24 ');
SYS.DBMS_OUTPUT.PUT_LINE( 'Job Number is: ' || to_char(x));
commit;
END;

--每月1日执行
DECLARE
X NUMBER;
BEGIN
sys.dbms_job.submit(job => X,
what => 'begin pro_job_test.pro_job_month; end;',
next_date =>to_date('01-08-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'trunc(last_day(sysdate)+1)');
SYS.DBMS_OUTPUT.PUT_LINE( 'Job Number is: ' || to_char(x));
commit;
END;
参考技术A begin
sys.dbms_job.submit(job => :job,
what => 'pro_1001 ;',
next_date => to_date('08-10-2011 09:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE +1);
commit;
end;
/
参考技术B DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
(
job => X
,what => 'pro_1001;'
,next_date => to_date('10/07/2011 08:24:18','mm/dd/yyyy hh24:mi:ss')
,interval => 'TRUNC(SYSDATE+1)+6/24'
,no_parse => FALSE
);
:JobNumber := to_char(X);
END;本回答被提问者采纳

oracle spa

oracle spa属于real application test的内容,用来对比sql前后性能变化,比如我要比较一条sql前后的的性能变化:
--单条sql流程

alter session set optimizer_features_enable=‘10.2.0.4‘;
variable g_task varchar2(100);
exec :g_task:= dbms_sqlpa.create_analysis_task(task_name=>‘TASK2‘,sql_text=>‘select count(*) from employees where employee_id>10‘) 
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>‘test execute‘,execution_name=>‘before_change‘);
alter table employees drop primary key drop index;
alter session set optimizer_features_enable=‘11.2.0.4‘;
--EXEC DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER( :g_task,‘comparison_metric‘, ‘buffer_gets‘);
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>‘test execute‘,execution_name=>‘after change‘); 
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>‘compare performance‘,execution_name=>‘compar‘); 
spool d:spa_report_elapsed_time.html
SELECT dbms_sqlpa.report_analysis_task(:g_task, ‘HTML‘, ‘ALL‘,‘ALL‘) FROM dual;
spool off;
exec  DBMS_SQLPA.DROP_ANALYSIS_TASK(‘TASK2‘);
begin
DBMS_SQLPA.DROP_ANALYSIS_TASK(‘TASK2‘);
end;

技术分享图片
当然一条SQ闹这么大动静是不值得的,用dba_hist视图就可以对比出来了,不用这么烦神;一个schema下的所有sql这个就比较劳神了,用spa可以很好的解决这个问题,流程如下:
**1.在生产上捕获工作负载

2.将SQL工作负载传输到一个测试系统

3.构建“更改前”性能数据

4.进行SQL重放,生成性能数据

5.对比,生成报告

具体实施步骤:
源端:oracle 10.2.0.1 ,hr用户,权限:grant advisor,administer sql tuning set to hr;
1 找到awr对应的snapshot;

begin 
  dbms_workload_repository.create_snapshot(); 
end;
select * from dba_hist_snapshot where begin_interval_time>sysdate-1/24

2 建立sqlset ,采集sql性能数据
--创建sqlset

begin
    dbms_sqltune.create_sqlset(‘sql_1‘) ;
    end;
declare cur sys_refcursor;
            begin
            open cur for
            SELECT VALUE(P) FROM
            TABLE(DBMS_SQLTUNE.select_workload_repository(49,50,q‘[ parsing_schema_name in (‘HR‘) ]‘)) p;
            dbms_sqltune.load_sqlset(sqlset_name => ‘sql_1‘,populate_cursor => cur);
            close cur;
            end;
            /

--查看sqlset集

select * from table(dbms_sqltune.select_sqlset(‘sql_1‘)) where buffer_gets>0;
--创建sqlset表

begin
   dbms_sqltune.create_stgtab_sqlset(table_name => ‘SPA_2‘,schema_name => ‘HR‘);
   end;

--执行pack,将数据打包到表

begin
    DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => ‘upg_sql‘,
    SQLSET_OWNER=>‘HR‘,
    staging_table_name => ‘SPA_2‘,
   staging_schema_owner => ‘HR‘);
end;

--删除sqlset

exec  dbms_sqltune.drop_sqlset(‘sql_1‘) ;

select  sql_id,sql_text,buffer_gets from spa_2;

expdp hr/hr directory=exp dumpfile=spa.dmp logfile=spa.log tables=SPA_2

技术分享图片

传输到11g的服务器,目标端:oracle 11.2.0.4
impdp之后解压:

begin
 DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(sqlset_name         => ‘sql_1‘,
                                       sqlset_owner        => ‘HR‘, 
                                       replace             => TRUE, 
                                       staging_table_name  => ‘SPA_2‘);
   end;

建立分析任务

VAR aname varchar2(30);
EXEC :aname := DBMS_SQLPA.CREATE_ANALYSIS_TASK(task_name => ‘compares‘,sqlset_name =>‘sql_1‘);

--执行源端10g分析
begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => ‘compares‘,
          execution_type => ‘convert sqlset‘,
          execution_name => ‘first trial‘);
          end;
--执行目标端11分析         
begin

  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => ‘compares‘,
          execution_type => ‘test execute‘,
          execution_name => ‘second trial‘
          );

end;

--生成比较任务     
begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => ‘compares‘,
          execution_type => ‘compare‘,
          execution_name => ‘compare_1‘
          );   
 end;
 --生成报告  
 spool reports.html
 SELECT DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘compares‘, ‘html‘, ‘TYPICAL‘, ‘ALL‘) from dual;

删除任务

begin
  DBMS_SQLPA.DROP_ANALYSIS_TASK(‘compares‘);
  end;

相关包说明参考:Oracle? Database PL/SQL Packages and Types Reference 11g Release 2 (11.2)--》dbms_spa/dbms_sqltune

以上是关于我要在oracle 10g创建一个job,每天凌晨9点执行一个过程,过程名假定为 pro_1001 谢谢指点的主要内容,如果未能解决你的问题,请参考以下文章

oracle中如何创建一个job

ORACLE的Job是不是有日志文件,如果有如何查看ORACLE 的Job的日志?

你好 请问oracle(10g) 执行定时任务job 锁表吗 锁的话怎么能够执行任务的同时还不影响正常的插入等操作

Oracle 10g中如何创建表

Oracle 10g实现存储过程异步调用

Oracle 10g sheduler Job如何备份和恢复