2016-11-08 74 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