我想做的工作是:利用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????????

解决方案 »

  1.   

    declare
    jobno number;
    declare
    dbms_job.submit(jobno,'
    declare
    --以下代码为创建索引过程,省略....
    end;',sysdate,'sysdate - 10');
    commit;
    dbms_job.run(jobno,true);
    dbms_job.remove(jobno);
    end;
      

  2.   

    declare
    jobno number;
    declare
    dbms_job.submit(jobno,'
    declare
    --以下代码为创建索引过程,省略....
    end;',sysdate,'null');
    commit;
    dbms_job.run(jobno,true);
    dbms_job.remove(jobno);
    end;
      

  3.   

    submit
    commit
    run
    remove
      

  4.   

    declare
    jobno number;
    declare
    dbms_job.submit(jobno,'
    declare
    --以下代码为创建索引过程,省略....
    end;',sysdate,'null');
    commit;
    dbms_job.run(jobno,true);
    dbms_job.remove(jobno);
    end;
      

  5.   

    如何让一个job在制定的那个时间点运行一次后被删除???
      

  6.   

    to  jlandzpa:sysdate-10 不行,不能用将来的时间作为间隔。
                 用null,也不行,错误为‘不能执行job'
    如果我去掉remove,则可以!但job将定期执行。这样显然不行!
      

  7.   

    文档中是说: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. 
      

  8.   

    如何让一个job在制定的那个时间点运行一次后被删除???
      

  9.   

    to  jlandzpa(欧高黎嘉陈):对,根据文档,用null的确是执行一次,而且我用简单的插入语句也证明了这一点,但不知道为什么,在建索引时不行,本身submit执行成功,但Job一直不能删除。估计是建索引语句错了,但单独那出建索引语句可以执行成功.怎么回事?
      

  10.   

    --没有问题。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
    ----------
             321: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>
      

  11.   

    我创建的是空间索引:
    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;
      

  12.   

    stmt := ''create index i11111 on table(geom) indextype is mdsys.spatial_index '' || ''parameters(''''sdo=2'''')'';这是什么语法,我还没有见过.
      

  13.   

    正真的创建索引是:
    create index i11111 on table(geom) indextype is mdsys.spatial_index parameters('sdo=2')
    因为submit的第二个参数是个pl/sql,要用'包起来,则在''里面的块如果也要用到'(直接写),将出错,好像是两个'表示一个'.
    说实话我也不知道只是否又理论根据,但执行时没出错,且用dbms_output打出来,好像也时对的
      

  14.   

    ? 我为什么运行不了?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
      

  15.   

    --try this
    'create index i11111 on table(geom) indextype is mdsys.spatial_index parameters('||''''||'sdo=2'||''''||')';
      

  16.   

    这是有关空间数据库的问题,我刚才仅仅是写了创建的语法,正真要让这个sql成功
    还有很多额外的工作要做,这些与Job无关。空间索引一般的是不会涉及的!
      

  17.   

    --我也查到了,改成上面应该没有问题,注意索引如果存在需要先删除.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>
      

  18.   

    其实只是你的sql生成的写法不对,上面我的写法output之后是正确的,如果你给我的sql在sqlplus中可以运行的话,那么你照上面改一下,在job中也应该是正确的.
      

  19.   

    to  jlandzpa(欧高黎嘉陈):哥们,还是不行。其实我的语法也是对的,因为索引其实已经创建了,只不过索引创建的又问题。
    我按照你的方法也试了,效果合你的一样。
    你的建议?
    先把分给你,主意接受
      

  20.   

    to jlandzpa(欧高黎嘉陈):你在吗