VARIABLE JOB NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(
    JOB => :JOB,  
    WHAT => 'create_hd_table;', 
    NEXT_DATE => sysdate,
    Interval =>'TRUNC(LAST_DAY(SYSDATE))+1+1/24');  
    COMMIT;
END;这是我job 的代码 现在是执行,好像是Interval =>'TRUNC(LAST_DAY(SYSDATE))+1+1/24'这句有问题 但不加引号 编译也不能通过,请问正确的写法~~

解决方案 »

  1.   

    是什么问题?job不自动执行是吧?
      

  2.   

    函数的调用顺序有错,应该是next_day(trunc(sysdate))
      

  3.   

    next_date有问题吧,怎么着也得写个sysdate以后的日期
    这块没怎么用过,你把next_date改一个sysdate+1/24/60试试
      

  4.   

    把next_date改为to_date('1-12-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss')试试
    看情况你是想每月1号凌晨1点执行
      

  5.   

     试了 我直接运行job 的时候报错
      

  6.   

    报什么错呢?job可以应用过去么?
    还是run的时候报错?
      

  7.   


    在行 1,465 上开始执行命令时出错:
    BEGIN DBMS_JOB.run(114); END;
    错误报告:
    ORA-12011: 无法执行 1 作业
    ORA-06512: 在 "SYS.DBMS_IJOB", line 651
    ORA-06512: 在 "SYS.DBMS_JOB", line 284
    ORA-06512: 在 line 1
    12011. 00000 -  "execution of %s jobs failed"
    *Cause:    An error was caught in dbms_ijob.run from one or more jobs
               which were due to be run.
    *Action:   Look at the alert log for details on which jobs failed and why.
      

  8.   

    create_hd_table;
    看看这个有没有问题
      

  9.   

    create or replace procedure cys_test is
    begin
      insert into sys_bas_user(user_id,user_name) values((select max(to_number(user_id))+1 from sys_bas_user),'abc');
      commit;
    end cys_test;
    这是我的存储过程,其他job参数和你一样,我就执行能通过的.如果我把过程里的sql改错,
    出现的错误就和你一样了.
    你再确认一下存储过程
      

  10.   

    create or replace
    procedure create_hd_table authid current_user as 
          tablename varchar2(50);
          sqlstr varchar2(800);
          flag number(10,0);
          sqlfalg varchar(200);
    begin 
      flag:=0;
          tablename:=UPPER('zj_hd_details_info_');
          tablename:= CONCAT(tablename,to_char(ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), 1),'yyyy_MM'));
          sqlfalg:='select count(*) from user_TABLES where table_name='''||tablename||'''';
          execute immediate sqlfalg into flag;
         -- dbms_output.put_line(flag);
          if flag=0 then  --如果没有这个表 则去创建
             begin 
              sqlstr:='create table '||tablename ||'(C_ID NUMBER(18,0),
    C_C_ID VARCHAR2(50),
    C_ZJ_ID VARCHAR2(50),
    C_SERVER_TYPE VARCHAR2(50),
    C_VIRTUAL_NUMBER VARCHAR2(20),
    C_CALLER VARCHAR2(20),
    C_TRUE_CALLER VARCHAR2(20),
    C_CALLED VARCHAR2(20),
    C_START VARCHAR2(50),
      C_CONNECT VARCHAR2(50),
    C_END VARCHAR2(50),
      c_billing_start VARCHAR2(50),
      C_Hd_billing_end VARCHAR2(50),
      C_h_time VARCHAR2(50),
      C_billing_time VARCHAR2(50),
    C_DIRECTION VARCHAR2(50),
    C_CHANNEL VARCHAR2(50),
    C_RELATION_ID VARCHAR2(50),
    C_NUMBER_TYPE VARCHAR2(50),
    C_W_CONNECT VARCHAR2(20),
    C_CALL_TYPE VARCHAR2(50),
    C_RECORD_NAME VARCHAR2(50),
    C_COST NUMBER(18,0),
      c_iscost VARCHAR2(20)
      )';
     --dbms_output.put_line(sqlstr);
        -- execute immediate sqlstr;
             end;
          end if;
           --dbms_output.put_line(sqlstr);  
    end; 发现把execute immediate sqlstr; 注释就能成功。。
      

  11.   

    不好说.有时候自己运行能成功不代表一直就能成功
    你可以在存储过程里增加exception记录.把出现的异常存到表里或者什么地方
    看看到底问题在哪
      

  12.   

    你把 -- execute immediate sqlstr;
    改成insert into sql_str(sql_string) value(sqlstr);
    把每次的sql语句看看.
      

  13.   


    楼主说单独执行没问题,应该不会有权限的问题吧?
    应该还是procedure有问题.
      

  14.   

    'TRUNC(LAST_DAY(SYSDATE))+1+1/24');  试试这样写 ,'TRUNC(LAST_DAY(SYSDATE)+1)+1/24');  begin
      sys.dbms_job.submit(job => :job,
                          what => 'sxf_iom_bf_prod;',
                          next_date => to_date('23-11-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                          interval => 'trunc(SYSDATE+1)+1/24');
      commit;
    end;
    /
    这个是我在用的 job
      

  15.   

    还有一个问题,你看看你的 show parameter job_queue; 允许job 执行的数量是不是  0 如果 是 0 的话,,修改一下就好了,alter system set job_queue_processes = 10;