DBMS_JOB.SUBMIT(:jobno,//job号
                'your_procedure;',//要执行的过程
                trunc(sysdate)+1/24,//下次执行时间
                'trunc(sysdate)+1/24+1'//每次间隔时间
               );
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);例子:
create or replace procedure procdemo as
begin
delete from leave_word where title like '%..%' or content like '%..%';
commit;
end procdemo;
/
VARIABLE jobno number;
begin
      DBMS_JOB.SUBMIT(:jobno, 
              'Procdemo;', 
               SYSDATE, 'trunc(SYSDATE) + 1');--每天00:00点删除一次
         commit;
end;
/

解决方案 »

  1.   

    上门已经很明确了,还有一些注意事项
     
    把init<sid>.ora中如下两个参数打开
     JOB_QUEUE_INTERVAL=60
     JOB_QUEUE_PROCESSES=4
     job_queue_keep_connections=true 然后重启一个库,如果原来已经打开了则不用这步了
      

  2.   

    谢谢二位高手,我还请教一个问题,由于我刚开始写存储过程,总是不能成功,例如我写的存储过程如下:
    CREATE OR REPLACE  PROCEDURE "WZW_TEST"."MY_PROC"  (lv_a,lv_b) 
        as
    v_a char(10);
    v_b char(10);
    begin
      select a,b into v_a,v_b from test;
    end my_proc;
    我在oracle dba studio 中以WZW_TEST登陆,在“方案-过程”里面将改语句创建后,没有错误,可是当我打开编辑的时候,按“编译”按钮后,状态总是显示invalid,我的test表属于WZW_TEST,请你们给帮助分析一下,难道不能以WZW_TEST用户创建存储过程?我的WZW_TEST用户角色为:connect,exp_full_database,imp_full_database,resource;系统权限为unilimted tablespace.
      

  3.   

    connect system/manager
    grant resource to wzw_test;
      

  4.   

    wzw_test 已经有resource 角色了。
      

  5.   

    有什么编译错误吗?
    sql*plus里面用show error查看
      

  6.   

    我在sql*plus 里面运行结果也如下:SQL> CREATE OR REPLACE  PROCEDURE "WZW_TEST"."MY_PROC" (lv_a,lv_b) as
      2  v_a char(10);
      3  v_b char(10);
      4  begin
      5    select a,b into v_a,v_b from test;
      6  end my_proc;
      7  /警告: 创建的过程带有编译错误。SQL> show error;
    没有错误。
      

  7.   

    (lv_a varchar2,lv_b varchar2)
      

  8.   

    SQL> CREATE OR REPLACE  PROCEDURE "WZW_TEST"."MY_PROC" (lv_a varchar2,
      2      lv_b varchar2) 
      3  as
      4  v_a varchar2;
      5  v_b varchar2;
      6  begin
      7    select a,b into v_a,v_b from test;
      8  end my_proc;
      9  /警告: 创建的过程带有编译错误。SQL> show error
    没有错误。
      

  9.   

    问题比较奇怪。
    select  a,b  from  test;  
    这条语句在sql*plus里面可以运行吧?
       
      

  10.   

    没有任何问题。你看下面结果:
    SQL> select * from test where rownum<=5;A          B          C
    ---------- ---------- ----------
    1          2          3
    1          1          2
    1          1          1
    1          2          2
    1          6          8
      

  11.   

    奇怪了,
    重新打开sql*plus
    执行看看
    然后show error;
      

  12.   

    SQL> CREATE OR REPLACE  PROCEDURE "WZW_TEST"."MY_PROC" (lv_a varchar2,
      2      lv_b varchar2)
      3  as
      4  v_a varchar2;
      5  v_b varchar2;
      6  begin
      7    select a,b into v_a,v_b from test;
      8  end my_proc;
      9  /警告: 创建的过程带有编译错误。SQL> show error
    没有错误。
    我将创建改表的语句给您,麻烦帮助分析一下,到底怎么回事?
    CREATE TABLE "WZW_TEST"."TEST"("A" VARCHAR2(10) NOT NULL, "B" 
        VARCHAR2(10) NOT NULL, "C" VARCHAR2(10) NOT NULL) ;insert into test values('1','2','3');
    insert into test values('1','22','33');
    insert into test values('1','222','333');
      

  13.   

    我重新打开sql*plus 然后show error;
    还是没有错误!
      

  14.   

    LGQDUCKY 先生说 再给select 和 执行过程的权限;可是还是不行?怎么回事啊?
      

  15.   

    你没有设置v_a,v_b的数据长度。13:25:15 SQL> CREATE  OR  REPLACE    PROCEDURE    MY_PROC (lv_a  varchar2,   lv_b  varchar2)
    13:25:23   2   as  
    13:25:23   3  v_a  test.a%type;
    13:25:45   4  v_b test.b%type;
    13:25:53   5  begin  
    13:25:56   6  select  a,b  into  v_a,v_b  from  test;  
    13:25:56   7  end  my_proc;  
    13:25:56   8  / 过程已创建。已用时间:  00: 00: 00.34
    13:25:57 SQL>
      

  16.   

    谢谢,真是没有设置的缘故。非常感谢您,那我这个存储过程能在sql*plus下直接执行吗?如何执行?这个问题后我将结分给您。
      

  17.   

    sql*plus下:
    exec MY_PROC('a','b');实际上,对于这个存储过程的例子来说,两个传入参数都没有什么作用。
      

  18.   

    我将原代码改为CREATE OR REPLACE  PROCEDURE "WZW_TEST"."MY_PROC"     (lv_a
        varchar2,lv_b varchar2)
        as
    v_a varchar2(10);
    v_b varchar2(10);
    begin
      select a,b into v_a,v_b from test where rownum<=1;
    end my_proc; 执行如下SQL> exec my_proc('a','b');PL/SQL 过程已成功完成。可是我没看到执行结果怎么办?
      

  19.   

    CREATE  OR  REPLACE    PROCEDURE    "WZW_TEST  ".  "MY_PROC  "          (lv_a  
           varchar2,lv_b  varchar2)  
           as  
    v_a  varchar2(10);  
    v_b  varchar2(10);  
    begin  
       select  a,b  into  v_a,v_b  from  test  where  rownum  <=1;  
    dbms_output.put_line('v_a:'||v_a||' v_b:'||v_b);
    end  my_proc;  
    /set server output on;exec  my_proc('a','b');  
     
     
      

  20.   

    我刚才的那个存储过程,我改成了如下:CREATE OR REPLACE  PROCEDURE "WZW_TEST"."DELE_TEST"   as
    begin
     delete from test where a='wzw';
     commit;
    end dele_test;
    能执行,但是我现在想让它30秒执行一次,是不是按照您给我的例子:
    VARIABLE jobno number;
    begin
          DBMS_JOB.SUBMIT(:jobno, 
                  'Procdemo;', 
                   SYSDATE, 'trunc(SYSDATE) + 30/(60*24*60)'  
           commit;
    end;
    /变成这样的?