2016-11-08 71 views
1

我已經計劃在Oracle DBMS中調度下面的工作,儀式現在的工作與下面的錯誤執行,計劃作業是表的Oracle DBMS中調度作業失敗

begin 
    DBMS_SCHEDULER.CREATE_JOB (
     job_name    => 'KEEP_STATS_DBNEW4', 
     job_type    => 'PLSQL_BLOCK', 
     job_action   => 'begin insert into my_log_table2 (MUSER,MCNT) (select osuser, count(osuser) as active_conn_count from v$session group by osuser order by active_conn_count desc);commit;end;', 
     start_date   => timestamp '2016-11-08 12:40:00', 
     repeat_interval  => 'FREQ=MINUTELY;INTERVAL=10;', 
     enabled    => TRUE); 
end; 
/

結構: -

即在表

SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS where job_name like '%KEEP_STATS_DBNEW4%' 
下面

記錄

CREATE TABLE my_log_table2 
(
MUSER varchar(255), 
MCNT varchar(255), 
MDATE TIMESTAMP(6) 
); 

誤差是堆棧跟蹤

ORA-06550: line 1, column 878: 
PL/SQL: ORA-00907: missing right parenthesis 
ORA-06550: line 1, column 756: 
PL/SQL: SQL Statement ignored 

回答

1

它與預定無關;您提交的匿名PL/SQL塊中的insert語句無效。你已經(格式化):

begin 
    insert into my_log_table2 (MUSER,MCNT) 
    (
    select osuser, count(osuser) as active_conn_count 
    from v$session 
    group by osuser 
    order by active_conn_count desc 
); 
    commit; 
end; 

而是insert ... select不應該有周圍的查詢部分括號;它應該僅僅是:

begin 
    insert into my_log_table2 (MUSER,MCNT) 
    select osuser, count(osuser) as active_conn_count 
    from v$session 
    group by osuser 
    order by active_conn_count desc; 
    commit; 
end; 

...雖然order by很可能沒有做什麼有用的東西 - 它不會影響數據是如何在以後恢復。

除非您將該日誌表清除出去,或者已經有一個觸發器自動執行此操作,否則使用sysdate添加日期列可能會有用;如果調用此列MDATE那麼你的工作可以這樣做:

begin 
    insert into my_log_table2 (MDATE, MUSER, MCNT) 
    select sysdate, osuser, count(*) 
    from v$session 
    group by osuser; 
    commit; 
end; 
+0

非常感謝您的及時提醒你的要求請告訴我怎樣才能添加日期欄還,我的意思是在表中我加入,但在上面的pl/sql塊我想添加它,這樣每次連接的名稱和計數以及時間戳 – user1906154

+0

@ user1906154 - 您只需要在插入列中包含新的列名稱列表,並將sysdate添加到選擇列表。更新以顯示。 (假設你有日期列而不是時間戳 - 因爲你不需要額外的精度,如果你有時間戳列,你可以使用'systimestamp'而不是'sysdate')。 –

+0

@Alaex poole謝謝,所以我創建日期列爲MDATE DATE創建表語句 – user1906154