在oracle的jobs里面,脚本如下:
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    ( job       => X 
     ,what      => 'dbms_refresh.refresh(''"MAIN_MCL1"."MV_SHIFT_PERFORMANCE"'');'
     ,next_date => to_date('28-07-2008 10:15:04','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'CASE WHEN TO_CHAR(SYSDATE,''HH24'') < 20            THEN TRUNC(SYSDATE) + 20.75/24      ELSE TRUNC(SYSDATE) + 1 + 8.75/24    END     '
     ,no_parse  => TRUE
    );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/commit;我手动执行后报错:
10:15:08 Info: Job #661 could not be executed.  ORA-12011: execution of 1 jobs failed
ORA-06512: at "SYS.DBMS_IJOB", line 406
ORA-06512: at "SYS.DBMS_JOB", line 272
ORA-06512: at line 1信息就这么多,这个job是去刷新一个数据库快照MV_SHIFT_PERFORMANCE.
刚接触oracle,实在不知道怎么解决这个错误,旁边也没人可以问,快混不下去了

解决方案 »

  1.   

    建好快照应该自动建一个job来执行刷新呀
      

  2.   

    建快照的时候自己会建一个job,你还手动建快照干啥……
    你下个pl/sql developer把,在快照那里选new。
      

  3.   

    好像是你创建job的用户和执行刷新一个数据库快照MV_SHIFT_PERFORMANCE的存储过程不是一个用户导致的.
      

  4.   

    Change DEclare to VariableVariable X NUMBER; 
    BEGIN 
      SYS.DBMS_JOB.SUBMIT 
        ( job      => X 
        ,what      => 'dbms_refresh.refresh(''"MAIN_MCL1"."MV_SHIFT_PERFORMANCE"'');' 
        ,next_date => to_date('28-07-2008 10:15:04','dd/mm/yyyy hh24:mi:ss') 
        ,interval  => 'CASE WHEN TO_CHAR(SYSDATE,''HH24'') < 20            THEN TRUNC(SYSDATE) + 20.75/24      ELSE TRUNC(SYSDATE) + 1 + 8.75/24    END    ' 
        ,no_parse  => TRUE 
        ); 
      SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: '   to_char(x)); 
    END; 

      

  5.   

    问题是现在我去看的时候,这个JOB停止了,我就手动执行这个job,然后就是报错误信息
      

  6.   

    sysdba身份登路数据库,执行:
    select * from dba_jobs;
    找到你要执行的job的jobid,假如是111,执行下面的命令:
    begin
     dbms_ijob.run(111);
    end;
      

  7.   

    dbms_ijob.run(111); 在sys下报错:invalid sql statement
      

  8.   

    你这个JOB是重建报错还是执行报错?
      

  9.   

    是执行报错,在另外的一个数据库中完全一样的设定,是可以执行的楼上的帅哥,拜托了,别见笑,oracle我实在是菜的很
      

  10.   

    你的数据库里里面有jobid是111的job吗??????sysdba身份登路数据库,执行: 
    select * from dba_jobs; 
    找到你要执行的job的jobid,假如是111,执行下面的命令: 
    begin 
      dbms_ijob.run(111); 
    end;
    /
      

  11.   

    回楼上dbms_job.run(111); 
    还是同样的错误,我就奇怪了
    这个命令是手动执行job吗?还需要什么信息才能解决这个问题?
    我看了,创建和刷新的都是在同一个账户下执行的
    我很郁闷
      

  12.   

    我估计两种可能1、X 变量前面没有加  ':'2、job_queue_processes 是否为零 
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20
      

  13.   


    因为是正式环境,我不敢做任何的更改,这些都是老外弄的,现在老外走了,没人知道怎么弄.
    其实这个快照就是select 了一个view,我很奇怪他为什么要这么做,难道只是为了数据快?可是那么多的view每天都在用,包括这个view也每天很多人查询
    我不敢去改他的代码直接去select 这个view,因为不知道他是不是还有其他的意义,没人知道
    所以我现在早上每天去手动刷新MV_SHIFT_PERFORMANCE这个数据库快照但是另外的数据库也有一模一样的快照存在,我实在是看不出哪里有差异哎
      

  14.   

    你这个是物化视图还是快照?
    不过这两个东西都可以自动定时刷新啊。不用你去建JOB刷新或者手动刷新。
      

  15.   

    我也遇到和楼主一样的问题。
    1。用ctxsys用户,赋权给你这个用户
    GRANT   EXECUTE   ON   "CTXSYS"."CTX_DDL"   TO   <user>;
    2。建立一个自己的过程,调用这个
    dbms_refresh.refresh('"MAIN_MCL1"."MV_SHIFT_PERFORMANCE"'); 
    3.在job中在执行你建立的这个过程我这样做了之后, 手动运行这job没有问题,但是就是不定时执行。
    挺郁闷的
      

  16.   

    不好意思, 把自己的代码 "CTXSYS"."CTX_DDL" 
    给贴上去了。但是,赋权是第一步骤。
    赫赫。
      

  17.   


    可以确定是snapshot,我在snapshots下看到有这个MV_SHIFT_PERFORMANCE
    job不是我建的,我去看的时候MV_SHIFT_PERFORMANCE是没有刷新,然后看到job中这个job是停止了的
      

  18.   

    你可以不管这个JOB,让它自动刷新吧。
    我没做过,你看看这个语句,完全就不去建什么JOB了:设置快照刷新时间
    Alter snapshot anson  refresh fast Start with sysdate+1/24*60 next sysdate+10/24*60;
    --oracle自动在1分钟后进行第一次快速刷新,以后每隔10分钟快速刷新一次
    Alter snapshot anson  refresh complete Start with sysdate+30/24*60*60 next sysdate+1;
    --oracle自动在30钞后进行第一次完全刷新,以后每隔1天完全刷新一次
      

  19.   

    CREATE OR REPLACE PROCEDURE pro_refresh
      IS
    BEGIN
            begin
            dbms_refresh.refresh('"MAIN_MCL1"."MV_SHIFT_PERFORMANCE"'); 
            commit;
            end;
     END;DECLARE 
      X NUMBER; 
    BEGIN 
      SYS.DBMS_JOB.SUBMIT 
        ( job      => X 
        ,what      => 'pro_refresh;' 
        ,next_date => to_date('28-07-2008 10:15:04','dd/mm/yyyy hh24:mi:ss') 
        ,interval  => 'CASE WHEN TO_CHAR(SYSDATE,''HH24'') < 20            THEN TRUNC(SYSDATE) + 20.75/24      ELSE TRUNC(SYSDATE) + 1 + 8.75/24    END    ' 
        ,no_parse  => TRUE 
        ); 
      SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' ¦ ¦ to_char(x)); 
    END; 
      

  20.   

    DECLARE 
      X NUMBER; 
    BEGIN 
      SYS.DBMS_JOB.SUBMIT 
        ( job      => X 
        ,what      => 'pro_refresh;' 
        ,next_date => to_date('28-07-2008 10:15:04','dd/mm/yyyy hh24:mi:ss') 
        ,interval  => 'CASE WHEN TO_CHAR(SYSDATE,''HH24'') < 20            THEN TRUNC(SYSDATE) + 20.75/24      ELSE TRUNC(SYSDATE) + 1 + 8.75/24    END    ' 
        ,no_parse  => TRUE 
        ); 
       commit;--刚刚这个commit没有加
      SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' ¦ ¦ to_char(x)); 
    END;