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_