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_