【问题标题】:oracle dbms scheduler job is failingoracle dbms 调度程序作业失败
【发布时间】:2017-03-22 02:05:37
【问题描述】:

我在 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;
/

表格的结构是:-

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

表中记录的错误

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

下面是堆栈跟踪

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

【问题讨论】:

    标签: oracle dbms-scheduler


    【解决方案1】:

    这与计划无关;您提交的匿名 PL/SQL 块内的插入语句无效。你有(重新格式化):

    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;
    

    【讨论】:

    • 非常感谢您及时提出建议,请您说明如何添加日期列,我的意思是在表中我正在添加它,但在上面的 pl/sql 块中我也想添加它这样每次连接的名称和计数也与时间戳一起存储
    • @user1906154 - 您只需在插入列列表中包含该新列名,并将 sysdate 添加到选择列表中。更新以表明这一点。 (假设您有日期列而不是时间戳 - 因为您不需要额外的精度。如果您确实有时间戳列,则可以使用 systimestamp 而不是 sysdate)。
    • @Alaex poole 谢谢,所以我在创建表语句中将日期列设置为 MDATE DATE
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多