oracle job 及存储过程案例

来源:互联网 发布:网络推广工作基本做法 编辑:程序博客网 时间:2024/06/05 22:52
  
使用Submit()过程,工作被正常地计划好。 
这个过程有五个参数:job、what、next_date、interval与no_parse。 

PROCEDURE Submit ( job       OUT binary_ineger, 
What      IN  varchar2, 
next_date IN  date, 
interval  IN  varchar2, 
no_parse  IN  booean:=FALSE) 

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。 
what参数是将被执行的PL/SQL代码块。 
next_date参数指识何时将运行这个工作。 
interval参数何时这个工作将被重执行。 
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE 
指示此PL/SQL代码在它第一次执行时应进行语法分析, 
而FALSE指示本PL/SQL代码应立即进行语法分析。 

在command window窗口中执行下面脚本 
Oracle代码  收藏代码
  1. declare job1 number;  
  2. begin  
  3.   dbms_job.submit(job => :job1,  
  4.                   what => 'CLEAN_DATA_P;',  
  5.                   next_date => sysdate,  
  6.                   interval => 'sysdate+1/1440'); --每天1440分钟,即一分钟运行CLEAN_DATA_P存储过程一次  
  7.                   commit;  
  8.      dbms_job.run(:job1);  
  9. end;  
  10. /  


查看创建的job 
查看相关job信息 
1、相关视图 
dba_jobs 
all_jobs 
user_jobs 
dba_jobs_running 包含正在运行job相关信息。 
如: 
Oracle代码  收藏代码
  1. select * from dba_jobs   


2、运行JOB 
说明:Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数: 
Oracle代码  收藏代码
  1. begin   
  2.     dbms_job.run(:job); --:job为dba_jobs里面自己需要运行的jobid  
  3.     end;   
  4. /   


3、删除JOB 
Oracle代码  收藏代码
  1. begin   
  2.   dbms_job.remove(:job);--:job为dba_jobs里面自己需要运行的jobid  
  3. end;   
  4. /   



Oracle代码  收藏代码
  1. --绑定jobid  
  2. variable job1 number;  
  3. /  
  4.   
  5. --创建JOB 每分钟执行一次  
  6. begin  
  7.   dbms_job.submit(job => :job1,  
  8.                   what => 'CLEAN_DATA_P;',  
  9.                   next_date => sysdate,  
  10.                   interval => 'sysdate+1/1440');  
  11.                   commit;  
  12. end;  
  13. /  
  14.   
  15. --执行JOB  
  16. begin      
  17.     dbms_job.run(:job1);  
  18.     end;      
  19. /     
  20.   
  21. --删除JOB  
  22. begin      
  23.   dbms_job.remove(:job1);--:job为dba_jobs里面自己需要运行的jobid     
  24. end;      
  25. /     
  26.   
  27. --创建JOB 每天凌晨1点执行一次  
  28. begin  
  29.   dbms_job.submit(job => :job1,  
  30.                   what => 'CLEAN_DATA_P;',  
  31.                   next_date => sysdate,  
  32.                   interval => 'TRUNC(sysdate)+1+1/(24)');  
  33.                   commit;  
  34. end;  
  35. /  


附:CLEAN_DATA_P存储过程 
Oracle代码  收藏代码
  1. CREATE OR REPLACE PROCEDURE CLEAN_DATA_P IS  
  2.   cursor_name    INTEGER;  
  3.   rows_processed INTEGER;  
  4.   R_CONFIG       EIP_CLEAN_DATA_CONFIG%ROWTYPE; --记录当前行  
  5.   
  6.   R_TABLE_SPACE EIP_CLEAN_DATA_CONFIG%ROWTYPE; --记录tablespace数据配置当前行  
  7.   
  8.   R_CLEAN_DATA varchar2(255);  
  9.   CURSOR C_CONFIG IS  
  10.     SELECT C.ID,  
  11.            C.TABLE_NAME,  
  12.            C.CLEAN_INTERVAL,  
  13.            C.LAST_UPDATE_DATE,  
  14.            C.ENABLED_FLAG  
  15.       FROM EIP_CLEAN_DATA_CONFIG C  
  16.      WHERE C.ENABLED_FLAG = 'Y'  
  17.        AND C.TABLE_NAME != 'EIP_SWITCH_TABLE_SPACE'  
  18.      ORDER BY C.ID; --定义读取配置表不包含表空间切换的游标  
  19.   
  20.   CURSOR C_TABLE_SPACE IS  
  21.     SELECT C.ID,  
  22.            C.TABLE_NAME,  
  23.            C.CLEAN_INTERVAL,  
  24.            C.LAST_UPDATE_DATE,  
  25.            C.ENABLED_FLAG  
  26.       FROM EIP_CLEAN_DATA_CONFIG C  
  27.      WHERE C.ENABLED_FLAG = 'Y'  
  28.        AND C.TABLE_NAME = 'EIP_SWITCH_TABLE_SPACE'  
  29.      ORDER BY C.ID; --定义读取配置表表空间切换的游标  
  30. BEGIN  
  31.   BEGIN  
  32.     OPEN C_CONFIG;  
  33.     LOOP  
  34.       FETCH C_CONFIG  
  35.         INTO R_CONFIG;  
  36.       EXIT WHEN C_CONFIG%NOTFOUND;  
  37.       select to_char(sysdate - R_CONFIG.CLEAN_INTERVAL / 24 / 60,  
  38.                      'yyyy-mm-dd HH24:MI:SS')  
  39.         into R_CLEAN_DATA  
  40.         from dual; --获得当前时间减去时间间隔的时间  
  41.       cursor_name := dbms_sql.open_cursor; --动态执行删除SQL  
  42.       dbms_sql.parse(cursor_name,  
  43.                      'DELETE FROM ' || R_CONFIG.TABLE_NAME ||  
  44.                      ' WHERE LAST_UPDATE_DATE <= :x',  
  45.                      dbms_sql.native);  
  46.       dbms_sql.bind_variable(cursor_name,  
  47.                              ':x',  
  48.                              to_date(R_CLEAN_DATA, 'yyyy-mm-dd HH24:MI:SS'));  
  49.       rows_processed := dbms_sql.execute(cursor_name);  
  50.       dbms_sql.close_cursor(cursor_name);  
  51.     END LOOP;  
  52.     CLOSE C_CONFIG;  
  53.     
  54.     OPEN C_TABLE_SPACE;  
  55.     LOOP  
  56.       FETCH C_TABLE_SPACE  
  57.         INTO R_TABLE_SPACE;  
  58.       EXIT WHEN C_TABLE_SPACE%NOTFOUND;  
  59.         
  60.       IF 0 = R_TABLE_SPACE.CLEAN_INTERVAL  
  61.          THEN  
  62.            
  63.            --对表空间作转移  
  64.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_CPU MOVE TABLESPACE HQGK_DATA_MV1');  
  65.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_MEMORY MOVE TABLESPACE HQGK_DATA_MV1');  
  66.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_PROCESS MOVE TABLESPACE HQGK_DATA_MV1');  
  67.              
  68.            --更新当前操作标识,用于表空间转移  
  69.            UPDATE EIP_CLEAN_DATA_CONFIG C SET C.CLEAN_INTERVAL = 1 WHERE C.TABLE_NAME = 'EIP_SWITCH_TABLE_SPACE';  
  70.       ELSE   
  71.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_CPU MOVE TABLESPACE HQGK_DATA_MV');  
  72.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_MEMORY MOVE TABLESPACE HQGK_DATA_MV');  
  73.            dbms_utility.exec_ddl_statement('ALTER TABLE EIP_PERFORMANCE_PROCESS MOVE TABLESPACE HQGK_DATA_MV');  
  74.              
  75.            UPDATE EIP_CLEAN_DATA_CONFIG C SET C.CLEAN_INTERVAL = 0 WHERE C.TABLE_NAME = 'EIP_SWITCH_TABLE_SPACE';  
  76.       END IF;  
  77.         
  78.       --重建索引  
  79.       dbms_utility.exec_ddl_statement('ALTER INDEX PK_EIP_PERFORMANCE_CPU REBUILD');  
  80.       dbms_utility.exec_ddl_statement('ALTER INDEX PK_EIP_PERFORMANCE_MEMORY REBUILD');  
  81.       dbms_utility.exec_ddl_statement('ALTER INDEX PK_EIP_PERFORMANCE_PROCESS REBUILD');  
  82.       COMMIT;  
  83.     END LOOP;  
  84.     CLOSE C_TABLE_SPACE;  
  85.   EXCEPTION  
  86.     WHEN OTHERS THEN  
  87.       dbms_sql.close_cursor(cursor_name);  
  88.       ROLLBACK;  
  89.   END;  
  90.   COMMIT;  
  91. END CLEAN_DATA_P;  
  92. /  

0 0
原创粉丝点击