Oracle中JOB的建立後不執行解決方法
在Oracle中可以使用JOB來實現一些任務的自動化執行,類似於UNIX作業系統crontab命令的功能。
簡單演示一下,供參考。
1.建立表T,包含一個X欄位,定義為日期型別,方便後面的定時任務測試。
sec@ora10g> create table t (x date);
Table created.
2.建立儲存過程p_insert_into_t,每次執行該儲存過程都會向T表中插入一條系統當前時間。
sec@ora10g> create or replace procedure p_insert_into_t
2 as
3 begin
4 insert into t
5 values (SYSDATE);
6 end;
7 /
Procedure created.
3.OK,準備就緒,我們來建立一個JOB,這個JOB會每分鐘執行一次?需要注意一個細節!
sec@ora10g> variable job_number number;
sec@ora10g> begin
2 DBMS_JOB.submit (:job_number,
3 'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6 end;
7 /
PL/SQL procedure successfully completed.
4.我們透過USER_JOBS檢視檢視一下建立的JOB資訊。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
27 SEC 2010-01-29 00:34:20 sysdate+1/(24*60) P_INSERT_INTO_T;
細節之處在此,此處的LAST_DATE內容是空,表示此JOB沒有被執行過,因此這個JOB將永遠不會被自動的執行。
這一點可以從T表沒有資料來得到驗證:
sec@ora10g> select * from t;
no rows selected
那麼,如何才能使它自動執行起來呢?
很簡單,只要我們手動將這個JOB執行一下即可。
5.手工執行JOB一次,使之按照既定的時間間隔執行。
sec@ora10g> execute dbms_job.run(27);
PL/SQL procedure successfully completed.
此時T表中將會被插入一條具有當前時間的資料。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 00:37:42
再次檢視JOB的資訊
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
27 SEC 2010-01-29 00:37:42 2010-01-29 00:38:42 sysdate+1/(24*60) P_INSERT_INTO_T;
此時LAST_DATE顯示了我們執行JOB的時間,同時NEXT_DATE顯示了下次JOB將被執行的時間。此後這個JOB將會每隔一分鐘被執行一次。
自動執行一段時間後的T表內容如下:
sec@ora10g> select * from t order by x;
X
-------------------
2010-01-29 00:37:42
2010-01-29 00:38:46
2010-01-29 00:39:46
2010-01-29 00:40:46
2010-01-29 00:41:46
2010-01-29 00:42:46
2010-01-29 00:43:46
2010-01-29 00:44:46
2010-01-29 00:45:46
2010-01-29 00:46:46
2010-01-29 00:47:46
2010-01-29 00:48:46
2010-01-29 00:49:46
2010-01-29 00:50:46
2010-01-29 00:51:46
2010-01-29 00:52:46
16 rows selected.
6.為什麼剛剛建立後的JOB不能自動的執行呢?
這是一個疏忽導致的!
在建立JOB的時候,需要在結尾處指定“COMMIT;”!表示建立完成之後便執行一次。
刪除之前的JOB,重新建立一個帶有“COMMIT”語句的新JOB。
sec@ora10g> variable job_number number;
sec@ora10g> begin
2 DBMS_JOB.submit (:job_number,
3 'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6 commit;
7 end;
8 /
sec@ora10g> print job_number;
JOB_NUMBER
----------
29
此次建立的JOB資訊如下,可見LAST_DATE在建立完之後便有內容,表示已經被執行了一次。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
29 SEC 2010-01-29 01:02:11 2010-01-29 01:03:11 sysdate+1/(24*60) P_INSERT_INTO_T;
一分鐘過後便可看到T表中已有兩條記錄。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 01:02:11
2010-01-29 01:03:11
7.刪除JOB方法
很簡單,使用“dbms_job.remove”即可。
sec@ora10g> execute dbms_job.remove(29);
PL/SQL procedure successfully completed.
8.最後,談一下建立JOB時用到的引數。
1)使用desc命令檢視DBMS_JOB,可以得到SUBMIT這個儲存過程的引數列表。
sec@ora10g> desc DBMS_JOB
...
PROCEDURE SUBMIT
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
JOB BINARY_INTEGER OUT
WHAT VARCHAR2 IN
NEXT_DATE DATE IN DEFAULT
INTERVAL VARCHAR2 IN DEFAULT
NO_PARSE BOOLEAN IN DEFAULT
INSTANCE BINARY_INTEGER IN DEFAULT
FORCE BOOLEAN IN DEFAULT
...
2)如果希望對這些引數有更好的理解,可以參考Oracle的官方文件描述,細緻而周到。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_job.htm#sthref2936
3)重點關注一下官方文件中關於INTERVAL引數的示例
'sysdate + 7'表示一週執行一次;
'next_day(sysdate,''TUESDAY'')' 表示每週二執行一次;
'null'表示只執行一次。
本文中我使用的是'sysdate+1/(24*60)'表示每分鐘執行一次。很形象,一天的二十四分之一是一小時,一小時的六十分之一就是一分鐘的意思。
9.小結
透過這個文章和大家分享了一點關於JOB的建立方法和使用,希望對大家有幫助。
細節不容錯過!
Good luck.
secooler
10.01.28
-- The End --
簡單演示一下,供參考。
1.建立表T,包含一個X欄位,定義為日期型別,方便後面的定時任務測試。
sec@ora10g> create table t (x date);
Table created.
2.建立儲存過程p_insert_into_t,每次執行該儲存過程都會向T表中插入一條系統當前時間。
sec@ora10g> create or replace procedure p_insert_into_t
2 as
3 begin
4 insert into t
5 values (SYSDATE);
6 end;
7 /
Procedure created.
3.OK,準備就緒,我們來建立一個JOB,這個JOB會每分鐘執行一次?需要注意一個細節!
sec@ora10g> variable job_number number;
sec@ora10g> begin
2 DBMS_JOB.submit (:job_number,
3 'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6 end;
7 /
PL/SQL procedure successfully completed.
4.我們透過USER_JOBS檢視檢視一下建立的JOB資訊。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
27 SEC 2010-01-29 00:34:20 sysdate+1/(24*60) P_INSERT_INTO_T;
細節之處在此,此處的LAST_DATE內容是空,表示此JOB沒有被執行過,因此這個JOB將永遠不會被自動的執行。
這一點可以從T表沒有資料來得到驗證:
sec@ora10g> select * from t;
no rows selected
那麼,如何才能使它自動執行起來呢?
很簡單,只要我們手動將這個JOB執行一下即可。
5.手工執行JOB一次,使之按照既定的時間間隔執行。
sec@ora10g> execute dbms_job.run(27);
PL/SQL procedure successfully completed.
此時T表中將會被插入一條具有當前時間的資料。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 00:37:42
再次檢視JOB的資訊
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
27 SEC 2010-01-29 00:37:42 2010-01-29 00:38:42 sysdate+1/(24*60) P_INSERT_INTO_T;
此時LAST_DATE顯示了我們執行JOB的時間,同時NEXT_DATE顯示了下次JOB將被執行的時間。此後這個JOB將會每隔一分鐘被執行一次。
自動執行一段時間後的T表內容如下:
sec@ora10g> select * from t order by x;
X
-------------------
2010-01-29 00:37:42
2010-01-29 00:38:46
2010-01-29 00:39:46
2010-01-29 00:40:46
2010-01-29 00:41:46
2010-01-29 00:42:46
2010-01-29 00:43:46
2010-01-29 00:44:46
2010-01-29 00:45:46
2010-01-29 00:46:46
2010-01-29 00:47:46
2010-01-29 00:48:46
2010-01-29 00:49:46
2010-01-29 00:50:46
2010-01-29 00:51:46
2010-01-29 00:52:46
16 rows selected.
6.為什麼剛剛建立後的JOB不能自動的執行呢?
這是一個疏忽導致的!
在建立JOB的時候,需要在結尾處指定“COMMIT;”!表示建立完成之後便執行一次。
刪除之前的JOB,重新建立一個帶有“COMMIT”語句的新JOB。
sec@ora10g> variable job_number number;
sec@ora10g> begin
2 DBMS_JOB.submit (:job_number,
3 'P_INSERT_INTO_T;',
4 SYSDATE,
5 'sysdate+1/(24*60)');
6 commit;
7 end;
8 /
sec@ora10g> print job_number;
JOB_NUMBER
----------
29
此次建立的JOB資訊如下,可見LAST_DATE在建立完之後便有內容,表示已經被執行了一次。
sec@ora10g> select job,
2 log_user,
3 to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
4 to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
5 interval,
6 what
7 from user_jobs
8 /
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
29 SEC 2010-01-29 01:02:11 2010-01-29 01:03:11 sysdate+1/(24*60) P_INSERT_INTO_T;
一分鐘過後便可看到T表中已有兩條記錄。
sec@ora10g> select * from t;
X
-------------------
2010-01-29 01:02:11
2010-01-29 01:03:11
7.刪除JOB方法
很簡單,使用“dbms_job.remove”即可。
sec@ora10g> execute dbms_job.remove(29);
PL/SQL procedure successfully completed.
8.最後,談一下建立JOB時用到的引數。
1)使用desc命令檢視DBMS_JOB,可以得到SUBMIT這個儲存過程的引數列表。
sec@ora10g> desc DBMS_JOB
...
PROCEDURE SUBMIT
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
JOB BINARY_INTEGER OUT
WHAT VARCHAR2 IN
NEXT_DATE DATE IN DEFAULT
INTERVAL VARCHAR2 IN DEFAULT
NO_PARSE BOOLEAN IN DEFAULT
INSTANCE BINARY_INTEGER IN DEFAULT
FORCE BOOLEAN IN DEFAULT
...
2)如果希望對這些引數有更好的理解,可以參考Oracle的官方文件描述,細緻而周到。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_job.htm#sthref2936
3)重點關注一下官方文件中關於INTERVAL引數的示例
'sysdate + 7'表示一週執行一次;
'next_day(sysdate,''TUESDAY'')' 表示每週二執行一次;
'null'表示只執行一次。
本文中我使用的是'sysdate+1/(24*60)'表示每分鐘執行一次。很形象,一天的二十四分之一是一小時,一小時的六十分之一就是一分鐘的意思。
9.小結
透過這個文章和大家分享了一點關於JOB的建立方法和使用,希望對大家有幫助。
細節不容錯過!
Good luck.
secooler
10.01.28
-- The End --
http://space.itpub.net/519536/viewspace-626310/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-2121562/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中job的使用詳解Oracle
- Oracle診斷案例-Job任務停止執行Oracle
- job任務均不執行,手工執行報job now running
- vscode在Linux環境下執行“許可權不夠”的解決方法VSCodeLinux
- 多執行緒併發執行及解決方法執行緒
- ORACLE dbms_scheduler.create_job建立job作業遭遇PLS-00306Oracle
- 執行Tensorboard出現kernel is dead的解決方法ORB
- JAVA中執行緒的建立Java執行緒
- 在 Kubernetes 中執行 Oracle 資料庫的新方法Oracle資料庫
- Docker執行基於ubuntu映象的容器後沒有ifconfig和ping的解決方法DockerUbuntu
- Elasticjob執行job冪等AST
- oracle 程式滿了,登陸不上資料庫的解決方法Oracle資料庫
- 【 Thread】建立執行緒的2種方法thread執行緒
- 建立執行緒的4種方法 and 執行緒的生命週期執行緒
- DMAIC如何作為解決問題的方法執行?AI
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- ORACLE ORA-1652的解決方法Oracle
- 後臺執行SQL語句(oracle)SQLOracle
- xxl-job執行器的註冊
- Java建立多執行緒的一種方法Java執行緒
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 金沙不給提款的解決方法
- reCAPTCHA打不開的解決方法APT
- 解決GitHub打不開的方法Github
- Java 執行緒建立與常用方法Java執行緒
- win10系統不能執行qq的解決方法Win10
- 呼叫System.gc沒有立即執行的解決方法GC
- vscode無法執行input輸入解決方法VSCode
- Python執行緒安全問題及解決方法Python執行緒
- /etc/rc.d/rc.local不執行的解決辦法
- 【Oracle】ORA-23421: job number XXXX is not a job in the job queueOracle
- 【ASK_ORACLE】Oracle表決磁碟丟失後的恢復方法Oracle
- word中怎麼解決英文對不齊 word英文對不齊的方法
- oracle中執行os命令(轉)Oracle
- Python | 多執行緒死鎖問題的巧妙解決方法Python執行緒
- Win10系統下重置Store後消失不見的解決方法Win10
- [20191104]禁止job以及SCHEDULER執行.txt