关于oracle存储过程和触发器

下面实现的功能是:如果test表中的两列sum值相除结果小于0.99,则将分子的所有值增大0.5%

1. 创建存储过程

create or replace procedure proc_update_test  as
countvalue number;
sqlstr varchar2(2000);
begin
    sqlstr := 'select sum(braod_suc_num)/sum(try_broad_num)  from test where trunc(start_time,''dd'')=trunc(sysdate-1,''dd'')';
    EXECUTE IMMEDIATE sqlstr into countvalue ;
    if countvalue<0.99
       then
       update test set braod_suc_num = braod_suc_num*1.005 where trunc(start_time,'dd')=trunc(sysdate-1,'dd');
       commit;
    else
      null;
    end if;
end;


2. 创建定时任务job   -- 在CommondSql 窗口中执行,设置每天下午16:20执行
declare
   job number ;
 begin
   dbms_job.submit(job, 'proc_update_test ;', sysdate, 'TRUNC(SYSDATE + 1) + (16*60+20)/(24*60)');
   commit;
  end;
  /

 
2.1 查看该任务的job 号

select * from dba_jobs where what = 'proc_update_test;';   ---查job字段

2.1 通过命令启动任务
    在CommondSql窗口执行
    begin
     dbms_job.run(jobno);
    end;
    /
    
2.2 在PL/SQL中启动任务

    找jobs文件夹下的相应job对应的job编号,右键->run

----------------------------下面借鉴他人成果------------------------------------------------------------------------

 删除job:dbms_job.remove(jobno);   
     修改要执行的操作:job:dbms_job.what(jobno,what);   
  修改下次执行时间:dbms_job.next_date(job,next_date);   
  修改间隔时间:dbms_job.interval(job,interval);   

停止job:dbms.broken(job,broken,nextdate);   
启动job:dbms_job.run(jobno);   

修改job_queue_processes的值:(保证其不为0否则JOB不自动运行)  


补充: 
描述                    INTERVAL参数值 
每天午夜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)'' 
每个季度最后一天的晚上11点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24'' 
每星期六和日早上6点10分    ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''
--删除定时任务,括号里为user_jobs表中job字段的编号
exec dbms_job.remove(61);

 
  


你可能感兴趣的:(关于oracle存储过程和触发器)