如何让job仅仅执行一次???
如何让job仅仅执行一次?????
我想做的工作是:利用job执行创建索引的工作,在创建完后自动删除索引!
我的源码大概如下:
declare
jobno number;
declare
dbms_job.submit(jobno,'
declare
--以下代码为创建索引过程,省略...
end;',sysdate,'sysdate');
commit;
dbms_job.run(jobno,true);
dbms_job.remove(jobno);
end;
但执行完后报错,说是不能执行Job????
declare
jobno number;
declare
dbms_job.submit(jobno,'
declare
--以下代码为创建索引过程,省略...
end;',sysdate,'sysdate - 10');
commit;
dbms_job.run(jobno,true);
dbms_job.remove(jobno);
end;
declare
jobno number;
declare
dbms_job.submit(jobno,'
declare
--以下代码为创建索引过程,省略...
end;',sysdate,'null');
commit;
dbms_job.run(jobno,true);
dbms_job.remove(jobno);
end;
declare
jobno number;
declare
dbms_job.submit(jobno,'
declare
--以下代码为创建索引过程,省略...
end;',sysdate,'null');
commit;
dbms_job.run(jobno,true);
dbms_job.remove(jobno);
end;
如何让一个job在制定的那个时间点运行一次后被删除???
to jlandzpa:sysdate-10 不行,不能用将来的时间作为间隔。
用null,也不行,错误为‘不能执行job'
如果我去掉remove,则可以!但job将定期执行。这样显然不行!
文档中是说:
The interval parameter must evaluate to a time in the future. Legal intervals include:
'sysdate + 7'
Run once a week.
'next_day(sysdate,''TUESDAY'')'
Run once every Tuesday.
'null'
Run only once.
If interval evaluates to NULL and if a job completes successfully, then the job is automatically deleted from the queue.
如何让一个job在制定的那个时间点运行一次后被删除???
to jlandzpa(欧高黎嘉陈):对,根据文档,用null的确是执行一次,而且我用简单的插入语句也证明了这一点,但不知道为什么,在建索引时不行,本身submit执行成功,但Job一直不能删除。估计是建索引语句错了,但单独那出建索引语句可以执行成功.怎么回事?
--没有问题。
21:39:14 jlanzpa817>create or replace procedure jl_1 as
21:39:14 2 begin
21:39:14 3 execute immediate 'create index ind_tname on test (tname)';
21:39:14 4 dbms_output.put_line(1);
21:39:14 5 end;
21:39:14 6 /
过程已创建。
已用时间: 00: 00: 00.61
21:39:15 jlanzpa817>drop index ind_tname;
drop index ind_tname
*
ERROR 位于第 1 行:
ORA-01418: 指定的索引不存在
已用时间: 00: 00: 00.40
21:39:21 jlanzpa817>VARIABLE jobno number;
21:39:27 jlanzpa817>BEGIN
21:39:27 2 DBMS_JOB.SUBMIT(:jobno,
21:39:27 3 'jl_1;',SYSDATE, 'null');
21:39:27 4 commit;
21:39:27 5 END;
21:39:28 6 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.20
21:39:29 jlanzpa817>
21:39:39 jlanzpa817>print jobno
JOBNO
----------
3
21:39:39 jlanzpa817>drop index ind_tname;
索引已丢弃。
已用时间: 00: 00: 00.30
21:39:45 jlanzpa817>exec dbms_job.remove(3);
BEGIN dbms_job.remove(3); END;
*
ERROR 位于第 1 行:
ORA-23421: 作业编号3在作业队列中不是一个作业
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 86
ORA-06512: 在"SYS.DBMS_IJOB", line 525
ORA-06512: 在"SYS.DBMS_JOB", line 166
ORA-06512: 在line 1
已用时间: 00: 00: 00.40
21:39:54 jlanzpa817>
你的版本是多少? 在创建索引时,别人还动不动数据?
我这里很正常,只运行了一次,索引也创建成功了.
能否把建索引那段贴出来了吗?
我创建的是空间索引:
declare
jobno number;
begin
dbms_job.submit(jobno,'
declare
stmt varchar2(400)
stmt := ''create index i11111 on table(geom) indextype is mdsys.spatial_index '' || ''parameters(''''sdo=2'''')'';
execute immediate stmt;
end;',sysdate );
commit;
end;
stmt := ''create index i11111 on table(geom) indextype is mdsys.spatial_index '' || ''parameters(''''sdo=2'''')'';
这是什么语法,我还没有见过.
正真的创建索引是:
create index i11111 on table(geom) indextype is mdsys.spatial_index parameters('sdo=2')
因为submit的第二个参数是个pl/sql,要用'包起来,则在''里面的块如果也要用到'(直接写),将出错,好像是两个'表示一个'.
说实话我也不知道只是否又理论根据,但执行时没出错,且用dbms_output打出来,好像也时对的
? 我为什么运行不了?
22:10:03 jlanzpa817>create index i11111 on
22:11:12 2 table(test) indextype is mdsys.spatial_index parameters('tname=2');
table(test) indextype is mdsys.spatial_index parameters('tname=2')
*
ERROR 位于第 2 行:
ORA-00903: 无效表名
已用时间: 00: 00: 00.20
--try this
'create index i11111 on table(geom) indextype is mdsys.spatial_index parameters('||''''||'sdo=2'||''''||')';
这是有关空间数据库的问题,我刚才仅仅是写了创建的语法,正真要让这个sql成功
还有很多额外的工作要做,这些与Job无关。空间索引一般的是不会涉及的!
--我也查到了,改成上面应该没有问题,注意索引如果存在需要先删除.
22:11:13 jlanzpa817>create or replace procedure jl_1 as
22:16:26 2 stmt varchar2(200);
22:16:26 3 begin
22:16:26 4 stmt := 'create index i11111 on table(geom) indextype is mdsys.spatial_index parameter
s('||''''||'sdo=2'||''''||')';
22:16:26 5 --execute immediate 'create index ind_tname on test (tname)';
22:16:26 6 dbms_output.put_line(stmt);
22:16:26 7 end;
22:16:26 8 /
过程已创建。
已用时间: 00: 00: 00.80
22:16:27 jlanzpa817>exec jl_1
create index i11111 on table(geom) indextype is mdsys.spatial_index
parameters('sdo=2')
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.50
22:16:32 jlanzpa817>
其实只是你的sql生成的写法不对,上面我的写法output之后是正确的,如果你给我的sql在sqlplus中可以运行的话,那么你照上面改一下,在job中也应该是正确的.
哥们,谢谢,我回去后试一试,明天给你加分!谢谢!
我得回去了!明天见
to jlandzpa(欧高黎嘉陈):哥们,还是不行。其实我的语法也是对的,因为索引其实已经创建了,只不过索引创建的又问题。
我按照你的方法也试了,效果合你的一样。
你的建议?
先把分给你,主意接受