Oracle创建存储过程及job定时实施范例

1) 查询出前一天的数据,并插入到另一表中的存储过程:

Sql代码    收藏代码
  1. ----------创建一存储过程:  
  2. create or replace procedure P_TEST is  
  3. begin  
  4.   insert into test_table  
  5.     (id, content, account,states)  
  6.       select 'ty' || to_char(current_timestamp,'yyyymmddhh24missff'),  
  7.            'test content....',  
  8.            a.account,  
  9.            1  
  10.       from intf.serv@databaselink       a,  
  11.            intf.merge_staff@databaselink b,  
  12.            intf.merge_site@databaselink  c  
  13.      where a.begin_staff_id = b.staff_id(+)  
  14.        and a.begin_site_id = c.site_id(+)  
  15.        and a.begin_date >= TRUNC(SYSDATE-1, 'DD')  
  16.        and a.begin_date < TRUNC(SYSDATE, 'DD')  
  17.        and a.class_id2 = '111111111';  
  18.   COMMIT;  
  19. EXCEPTION  
  20.   WHEN OTHERS THEN  
  21.     ROLLBACK;  
  22. end P_TEST ;  

 

 2)定制一job,实时执行创建的存储过程,如下job为每间隔10分钟执行一次:

Sql代码    收藏代码
  1. declare   job1   number(10);   
  2. begin   
  3.   job1:=11;   
  4.   dbms_output.put_line(   job1   );   
  5.   
  6.   sys.dbms_job.submit(job => job1,  
  7.                       what => 'P_TEST;',  
  8.                       next_date => sysdate,  
  9.                       interval => 'SYSDATE + 10/(60*24)');  
  10.   commit;  
  11. end;  

 

注意:这句what => 'P_TEST;',这里的存储过程名后面一定要记得加上英文分号。当然如果存储过程要执行的操作比较简单,这里也可以直接写SQL语句,即如:

Sql代码    收藏代码
  1. what => 'UPDATE table_name SET cnt= 0;  
  2. COMMIT;',  

 

 

3)创建完JOB后发现job不执行,查找原因。一般可能是CJQ0进程失效导致的,此时要重起CJQ0进程。具体操作如下:

       首先设置JOB_QUEUE_PROCESSES为0,Oracle会杀掉CJQ0及相应job进程:

 

Sql代码    收藏代码
  1. ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;   

      其次再等2~3分钟后,重新设置:

 

Sql代码    收藏代码
  1. ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10;   

 

    此时PMON会重起CJQ0进程了。

 

4)Oracle获取时间精确到毫秒:

 

Sql代码    收藏代码
  1. select to_char(current_timestamp,'yyyymmddhh24missff'from test_table;  

 

    这里获取的时间就是精确到毫秒以后三位的,如20090409123030230000

猜你喜欢

转载自ruotongsong.iteye.com/blog/1768228
今日推荐