我写了一个过程,大概如下:
CREATE OR REPLACE PROCEDURE ABC.PROC_INSERT_C
IS
BEGIN
     INSERT INTO C (SELECT A,B FROM D WHERE LRRQ=TO_DATE(SYSDATE,'dd.mon.yyy');
     COMMIT;
EXCEPTION
     WHEN OTHERS THEN
          INSERT INTO C_ERROR VALUES (SYSDATE,'发生错误');
     COMMIT;
END;
/
然后将其提交给Oracle的Job去定时执行
DECLARE
v_job number;
v_start DATE;
BEGIN
v_start := to_date(to_char(sysdate,'yyyy.mm.dd')||' 09:30:00 ','yyyy.mm.dd hh:mi:ss PM');
dbms_job.submit(v_job,'ABC.PROC_INSERT_C;',v_start,'sysdate + 1');
COMMIT;
END;
/
执行完这段语句后,可在DBA_JOBS视图中看见Oracle已经接受了我的这个任务。我直接在Oracle中运行ABC.PROC_INSERT_C向C表插数据没有问题。
但是在系统时间超过9:30后,我发现C表中没有数据,怀凝JOB没有被Oracle执行,通过查看DBA_JOBS视图,发现FAILURES列的值为4,一会后变为5,说明失败了5次了,证明Oracle的确在执行我的过程,但不知道为什么会失败,我的过程又不需要参数,而且单执行过程是正确的呀!快救救我吧!先谢了!

解决方案 »

  1.   

    这两个参数对吗?init<sid>.ora中 JOB_QUEUE_INTERVAL=60
     JOB_QUEUE_PROCESSES=4
     job_queue_keep_connections=true 然后重启一个库,如果原来已经打开了则不用这步了
      

  2.   

    要不修改一下下次执行时间:dbms_job.next_date(job,next_date);
      

  3.   

    你试试 job:dbms_job.run(jobno); 行不行?
      

  4.   

    我的系统以上参数如下:
    JOB_QUEUE_INTERVAL=10
    JOB_QUEUE_PROCESSES=4但没有 job_queue_keep_connections=true 这一句。
    是不是这里有问题呢?
      

  5.   

    我在dba_jobs中查到我的过和的JOB号是9,然后执行如下:
    declare
          v_job binary_integer;
    begin
          v_job := 9;
          dbms_job.run(v_job);
    end;
    /执行后系统返回信息:
    ORA-23421 作业编号9在作业队中不是一个作业
    ORA-06512 在"SYS.DBMS_SYS_ERROR",排列86
    ORA-06512 在"SYS.DBMS_IJOB",525
    ORA-06512 在"SYS.DBMS_JOB",254
    ORA-06512 在line 5是不是我执行的不正确?
      

  6.   

    ORA-23421 作业编号9在作业队中不是一个作业问题出在这里了...
      

  7.   

    完了,现在JOB已经BROKEN了…………
      

  8.   

    已经重建了
    在object browser中执行此过程完全正确
    提交到JOB后仍然执行失败
    通过查询JOB的运行状态,结果没有记录
    select sid,log_user,r.this_date,r.this_sec from dba_jobs_running r,dba_jobs j where r.job=j.job;
    结果无记录
      

  9.   

    刚查了一下资料,说:
    如果数据库实例处于限制模式下(restricted mode),则队列管理进程不允许调用作业执行。
      

  10.   

    select sid,log_user,r.this_date,r.this_sec from dba_jobs_running r,dba_jobs j where r.job=j.job;
    只要不是在运行时,这句是不会查出结果来的。
    我的机器上正常运行着一个作业,运行上面的语句也查不出结果来。
      

  11.   

    又找了个资料:如下:做为DBA的你如何检查你的数据库是什么状态呢?(A)你可以检查V$INSTANCE视图中的ACTIVE_STATE这上字段。SQL> SELECT ACTIVE_STATE FROM V$INSTANCE;ACTIVE_ST---------NORMAL
      

  12.   

    我的系统中的v$instance视图没有你上面的这个列 名称                                      空?      类型
     ----------------------------------------- -------- ----------------------------
     INSTANCE_NUMBER                                    NUMBER
     INSTANCE_NAME                                      VARCHAR2(16)
     HOST_NAME                                          VARCHAR2(64)
     VERSION                                            VARCHAR2(17)
     STARTUP_TIME                                       DATE
     STATUS                                             VARCHAR2(7)
     PARALLEL                                           VARCHAR2(3)
     THREAD#                                            NUMBER
     ARCHIVER                                           VARCHAR2(7)
     LOG_SWITCH_WAIT                                    VARCHAR2(11)
     LOGINS                                             VARCHAR2(10)
     SHUTDOWN_PENDING                                   VARCHAR2(3)
     DATABASE_STATUS                                    VARCHAR2(17)
     INSTANCE_ROLE                                      VARCHAR2(18)
      

  13.   

    其内容如下:
    INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                                                        VERSION           STARTUP_TI STATUS  PAR    THREAD# ARCHIVE LOG_SWITCH_ LOGINS     SHU DATABASE_STATUS   INSTANCE_ROLE
    1 mytestdb         GYTAX-WLINE                                                      8.1.7.0.0         02-1月 -05 OPEN    NO           1 STOPPED             ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE
      

  14.   

    你把作业删除重建一次就好了!
    VARIABLE jobno number;
    begin
          DBMS_JOB.SUBMIT(:jobno, 
                  'Procdemo;',--此处为存储过程名称 
                   SYSDATE, 'SYSDATE + 1/720');
             commit;
    end;
    /
      

  15.   

    还没有啊!查看DBA_JOBS,已经反映调度失败12次了,一夜没睡,完了,麻烦你再帮我找找原因吧!
      

  16.   

    你试试下面的语句:DECLARE
    v_job number;
    v_start DATE;
    BEGIN
    v_start :=to_date(to_char(sysdate,'yyyy.mm.dd') ||' 21:30:00 ', 'yyyy.mm.dd hh24:mi:ss');
    dbms_job.submit(v_job,'ABC.PROC_INSERT_C();',v_start,'sysdate + 1');
    COMMIT;
    END;
    /1、改了一下日期格式;
    2、存储过程带了个括号。
      

  17.   

    我试了,还是不行,失败次数1,我的系统是windows 2000
      

  18.   

    暂时另辟途径吧:用windows 2000的调度完成这个作业。1、新建一个 insert.sql文件,文件内容:
    BEGIN
         INSERT INTO C (SELECT A,B FROM D WHERE LRRQ=TO_DATE(SYSDATE,'dd.mon.yyy');
         COMMIT;
    EXCEPTION
         WHEN OTHERS THEN
              INSERT INTO C_ERROR VALUES (SYSDATE,'发生错误');
         COMMIT;END;
    假如存为c:\script\insert.sql2、再创建一个CMD文件:内容:
    sqlplus scott/tiger@ora8 @c:\script\insert.sql
    把这个文件存为c:\script\job.cmd
    3、最后可以利用AT这个命令来设置自动执行:
    AT 21:30 /every:M,T,W,Th,F,S,Su "c:\script\job.cmd"
      

  19.   

    敬告日志:
    Fri Dec 31 21:52:56 2004
    Errors in file D:\oracle\admin\mydb\bdump\mydbSNP3.TRC:
    ORA-12012: error on auto execute of job 24
    ORA-06550: line 1, column 96:
    PLS-00201: 必须说明标识符 'ABC.PROC_INSERT_C'
    ORA-06550: line 1, column 96:
    PL/SQL: Statement ignored但是我用ABC登录数据库执行PROC_INSERT_C结果正确,我想是不是与我用SYSTEM用户执行的DBMS_JOB.SUBMIT有关,这样的话在USER_JOBS视图中就找不到what='ABC.PROC_INSERT_C'的记录,只有在DBA_JOBS视图中才可以找到。
      

  20.   

    用 ABC 用户执行一下 DBMS_JOB.SUBMIT
      

  21.   

    创建一个简单的测试:
    创建测试表
    SQL> create table a(a date);
    表已创建。
    创建一个自定义过程
    SQL> create or replace procedure test as
      2  begin
      3  insert into a values(sysdate);
      4  end;
      5  /
    过程已创建。
    创建JOB
    SQL> variable job1 number;
    SQL> begin
      2  dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次
      3  end;
      4  /
    PL/SQL 过程已成功完成。
    运行JOB
    SQL> begin
      2  dbms_job.run(:job1);
      3  end;
      4  /
    PL/SQL 过程已成功完成。
    SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;
    时间
    -------------------
    2001/01/07 23:51:21
    2001/01/07 23:52:22
    2001/01/07 23:53:24删除JOB
    SQL> begin
      2  dbms_job.remove(:job1);
      3  end;
      4  / 
    PL/SQL 过程已成功完成。看以上是否能正常运行,如果可以就从你的程序找问题吧,不行就得从数据库找问题。
      

  22.   

    问题已搞定,就是要先给ABC用户分配足够权限,然后再用ABC用户登录数据库执行DBMS_JOB.SUBMIT,就成功了。谢谢大家热心帮助。
    再过一天就结贴。
      

  23.   

    谢谢楼主和wangybyangxr(王永斌) 兄,我正在做的项目爷需要用到类似的功能,多谢你们的指点