在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,实在不知道怎么解决这个错误,旁边也没人可以问,快混不下去了
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,实在不知道怎么解决这个错误,旁边也没人可以问,快混不下去了
你下个pl/sql developer把,在快照那里选new。
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;
/
select * from dba_jobs;
找到你要执行的job的jobid,假如是111,执行下面的命令:
begin
dbms_ijob.run(111);
end;
select * from dba_jobs;
找到你要执行的job的jobid,假如是111,执行下面的命令:
begin
dbms_ijob.run(111);
end;
/
还是同样的错误,我就奇怪了
这个命令是手动执行job吗?还需要什么信息才能解决这个问题?
我看了,创建和刷新的都是在同一个账户下执行的
我很郁闷
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20
因为是正式环境,我不敢做任何的更改,这些都是老外弄的,现在老外走了,没人知道怎么弄.
其实这个快照就是select 了一个view,我很奇怪他为什么要这么做,难道只是为了数据快?可是那么多的view每天都在用,包括这个view也每天很多人查询
我不敢去改他的代码直接去select 这个view,因为不知道他是不是还有其他的意义,没人知道
所以我现在早上每天去手动刷新MV_SHIFT_PERFORMANCE这个数据库快照但是另外的数据库也有一模一样的快照存在,我实在是看不出哪里有差异哎
不过这两个东西都可以自动定时刷新啊。不用你去建JOB刷新或者手动刷新。
1。用ctxsys用户,赋权给你这个用户
GRANT EXECUTE ON "CTXSYS"."CTX_DDL" TO <user>;
2。建立一个自己的过程,调用这个
dbms_refresh.refresh('"MAIN_MCL1"."MV_SHIFT_PERFORMANCE"');
3.在job中在执行你建立的这个过程我这样做了之后, 手动运行这job没有问题,但是就是不定时执行。
挺郁闷的
给贴上去了。但是,赋权是第一步骤。
赫赫。
可以确定是snapshot,我在snapshots下看到有这个MV_SHIFT_PERFORMANCE
job不是我建的,我去看的时候MV_SHIFT_PERFORMANCE是没有刷新,然后看到job中这个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天完全刷新一次
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;
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;