2016-12-06 24 views
1

我放鬆了我的想法。我有一個名爲foo()的過程,它不帶任何參數。我想每3分鐘執行一次,比如說。我寫的代碼如下所示:DBMS調度程序oracle - 如何執行程序

BEGIN 
    dbms_scheduler.create_job(job_name => FooJob, 
            job_type => 'PLSQL_BLOCK', 
            job_action => ' 
               BEGIN 
                foo(); 
                END;', 
            start_date => SYSTIMESTAMP, 
            repeat_interval => 'FREQ=MINUTELY;INTERVAL=3;BYHOUR=17;BYMINUTE=35;', 
            enabled => TRUE 
            comments => 'A comment.'); 
END; 
/

這給了我一個錯誤:應該定義標識符'applyjobpenalities'。

我在此基礎上例如:How to execute a procedure with DBMS_SCHEDULER.CREATE_JOB procedure

另外:

1)如何FOO的執行之後執行dbms_output.put_line()();?是否可以直接放這條線?

2)如何檢查程序foo()是否(正在)代表調度程序執行?

UPDATE: 好了,所以我所做的就是:

1)我在SQL類型Plus的設置SERVEROUTPUT上「

2)我做了一個程序:

create or replace procedure proc1 
IS 
BEGIN 
dbms_output.put_line('sth'); 
end; 
/

3)我將調度程序代碼更改爲:

BEGIN 
dbms_scheduler.create_job( job_name => 'JustATest', 
           job_type => 'PLSQL_BLOCK', 
           job_action => 
                'BEGIN 
                proc1(); 
                END;', 
           start_date => systimestamp + interval '10' second, 
           repeat_interval => 'FREQ=SECONDLY', 
           enabled  => TRUE); 
END; 
/

但我在SQL Plus中看不到任何結果。我錯過了什麼?這兩個過程都成功地編譯和當我輸入我可以看到這個工作:

SELECT * FROM DBA_SCHEDULER_JOBS; 
+0

閱讀文檔 - https://docs.oracle.com/cd/B28359_01/server.111/b28310/schedadmin002.htm#ADMIN12039請顯示完整的錯誤堆棧跟蹤。您無法從後臺作業中「查看」dbms_output。 – OldProgrammer

+0

proc1正在後臺運行。您看不到dbms_output的輸出。不知道如何讓這個更清楚。如果需要,寫入日誌表。 – OldProgrammer

+0

我現在明白了,謝謝。但是,如果我使用其他更新數據的過程,我沒有看到它實際運行。那怎麼了? – monterinio

回答

2

1)沒有辦法從計劃作業提取DBMS_OUTPUT。

2)要檢查FOO是否正在執行,我使用以下SQL(從TOAD的「Spool SQL to Screen」選項中提取出來,如果您將花費任何時間在Oracle中進行開發,請爲Oracle提供TOAD) 。

SELECT l.job_name 
    , l.JOB_SUBNAME 
     , l.log_id "Log ID" 
     , l.log_date "Log Date" 
     , l.operation "Operation" 
     , l.status "Status" 
     , l.user_name "User Name" 
     , l.client_id "Client ID" 
     , l.global_uid "Global UID" 
     , r.req_start_date "Required Start Date" 
     , r.actual_start_date "Actual Start Date" 
     , r.run_duration "Run Duration" 
     , r.instance_id "Instance ID" 
     , r.session_id "Session ID" 
     , r.slave_pid "Slave PID" 
     , TO_CHAR (r.cpu_used) "CPU Used" 
     , r.additional_info "Additional Info (Run)" 
    FROM dba_scheduler_job_log l, dba_scheduler_job_run_details r 
    WHERE l.log_id = r.log_id(+) 
    and l.job_name like 'FooJob' 
ORDER BY 1 DESC NULLS LAST; 

2B)要查看作業當前正在運行:

SELECT * 
    FROM dba_scheduler_running_jobs; 

3)如果你想看到你的工作成果,你需要有你的工作做一些事情,比如插入一條記錄放入桌子。

+0

因此,我無法看到執行過程中的通知,因爲我上面在編輯部分發布了通知。 – monterinio

+0

是的,這是不可能的。如果需要,寫入表格。 – OldProgrammer

+0

好。我改變了這個程序,做了一堆選擇/更新操作,現在當我執行這個並從我的帖子的2b)中選擇type select時,結果'沒有選擇行'。我究竟做錯了什麼? – monterinio