一次Oracle Job编写

来源:互联网 发布:pp助手和淘宝手机助手 编辑:程序博客网 时间:2024/05/21 07:00
Oracle中Job的编写


在Oracle中可以编写Job来定时执行一个存储过程。具体做法是,使用Submit()过程


Submit过程的几个参数:job、what、next_date、interval与no_parse。


Submit的方法签名是:
PROCEDURE Submit ( 
job OUT binary_ineger, 
What      IN  varchar2, 
next_date IN  date, 
interval  IN  varchar2, 
no_parse  IN  booean:=FALSE)


签名参数解析:
job参数
Submit()过程返回的binary_integer。用来唯一标识一个job


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


next_date
指示何时将运行这个工作


interval
何时这个工作将被重新执行

no_parse
指示此Job在提交时或执行时是否应进行语法分析--TRUE










--每天1440分钟,即一分钟运行test过程一次
begin
  sys.dbms_job.submit(job => :job,
          what => 'prc_g_test',
          next_date=>to_date('2011-11-30 15:00:00', 'yyyy-mm-dd hh24:mi:ss'),
          interval => 'sysdate + 1/1440');
);
commit;
end;
/


-- 1.create TABLE
CREATE TABLE g_test(
  ID NUMBER(12),
  c_date DATE
);


-- 2. create sequence
CREATE SEQUENCE g_seq
MINVALUE 1
MAXVALUE 9999999999
START WITH 1
INCREMENT BY 1
CACHE 20;


--3. create procedure
CREATE OR REPLACE PROCEDURE prc_g_test IS
  BEGIN
   INSERT INTO g_test VALUES(g_seq.NEXTVAL, SYSDATE);
  END prc_g_test;


--4. create job
--这个过程有五个参数:job、what、next_date、interval与no_parse。 


PROCEDURE submit(job OUT BINARY_INTEGER,
 what IN VARCHAR2,
 next_date IN DATE,
 INTERVAL IN VARCHAR2,
 no_parse IN BOOLEAN:=FALSE
)  




DECLARE 
job NUMBER;
BEGIN
 sys.dbms_job.submit(job, 'prc_g_test;',SYSDATE, 'sysdate + 1/1440');
END;


-- 查看Job信息
SELECT * FROM DBA_JOBS ;
SELECT * FROM DBA_JOBS_RUNNING;
SELECT * FROM g_test ORDER BY ID ASC;


-- 运行Job
-- job = 22


BEGIN
 DBMS_JOB.run(22);
END;
/
6、运行JOB 
说明:Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数: 
SQL> begin 
2  dbms_job.run(:job); 
3  end; 
4  / 


----------------------------------------------------------------------------------
在plSQL中我的做法是:
begin
dbms_job.run(3017);
end; 
----------------------------------------------------------------------------------
7、删除JOB 
SQL> begin 
2  dbms_job.remove(:job);--:job可以用dba_jobs.job的值代替如:1198 
3  end; 
4  / 
 
 
 

每天1点执行的oracle JOB样例

DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X,
what => 'ETL_RUN_D_Date;',
next_date => to_date('2009-08-26 01:00:00','yyyy-mm-dd hh24:mi:ss'),
interval => 'trunc(sysdate)+1+1/24',
no_parse => FALSE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/
以上是明确指定每天的1点执行此job,如果指定是每天中午12点执行interval需要指定为'trunc(sysdate)+1+12/24',如果仅仅指定interval为一天,这样当你手工用dbms_job.run(job)去运行一次时,job每天的执行时间是会改变的,如果你想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)'

 
 
 参考来源:http://guyuanli.itpub.net/post/37743/484763
 
 
 
 
 
 
 
 
 
 
 
 
 

Oracle表空间不足ORA-01654  

2011-01-14 17:06:34|  分类: Oracle|字号 订阅

在往数据表里插入数据时,出现了ORA-01654: 索引 SSERVICE.IX_MSI_WDR_INPUT_1 无法通过 1024 (在表空间 USERD 中) 扩展的错误信息,原来是数据量太大,表空间没有自动增长,空间不足了。

解决办法,扩展表空间:

       --(1)重置数据文件大小

            ALTER DATABASE DATAFILE 'datafile路径名字' RESIZE 2000M; 

        --(2)设置数据文件能自动增长

           ALTER DATABASE DATAFILE '... ' AUTOEXTEND ON | OFF NEXT 20M MAXSIZE 300M;

            --查看哪些表空间为自动增长

           SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;          

 

       /* (3)添加数据文件

      

           增加到表空间中的数据文件不能直接从表空间中删除,除非删掉整个表空间

           增加数据文件将有助于均衡I/O

           一个表空间文件最多为个,文件越多,执行一次检查点的代价越高  */

          

           ALTER TABLESPACE tablespace_name  ADD DATAFILE '...' SIZE XX;

     

           ALTER TABLESPACE tbs2 ADD DATAFILE '/u01/app/oracle/oradata/orcl/tbs2.dbf' size200m autoextend on ;

 

另:查看表空间利用率:

脚本如下:网上找的,把链接忘了,见谅。

   select ff.s tablespace_name,
       ff.b total,
       (ff.b - fr.b) usage,
       fr.b free,
       round((ff.b - fr.b) / ff.b * 100) || '% ' usagep
  from (select tablespace_name s, sum(bytes) / 1024 / 1024 b
          from dba_data_files
         group by tablespace_name) ff,
       (select tablespace_name s, sum(bytes) / 1024 / 1024 b
          from dba_free_


 
 
 
 
 
 
 
 
 
































































原创粉丝点击