详细问题:
    序列,job和存储过程,利用job做时间控制,每天时间到00:00点,序列重置为1开始
代码如下:
    --序列,初始为一,自增为一
     create sequence mysequence  increment by 1 start with 1 cache 10;
    --oracle存储过程代码
   create or replace procedure seq_reset(v_seqname varchar2) as 
  n number(10); 
  tsql varchar2(100); 
  begin 
  execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
  n:=-(n-1); 
  tsql:='alter sequence '||v_seqname||' increment by '|| n;--让序列一次递增-N,实现归0 
  execute immediate tsql; 
  execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
  tsql:='alter sequence '||v_seqname||' increment by 1 '; 
   execute immediate tsql; 
   end seq_reset;    --调用如下代码就可以让序列重置
   call seq_Reset('mysequence')
问题:
    1.但是我想用job来控制每天00:00时刻让序列自动重置,但是job里面是不是只能调用无参数的存储过程?
    2.不知道为什么,我写job的时候,只要一运行,pl/sql就报出:无效的sql语句,但是sql都没错,网上copy下来的,请高手解答。
    在线等....

解决方案 »

  1.   

    1、可以有参
    2、job的what参数设置:seq_Reset('mysequence');
    3、如果使用cache的话,重置后cache里的序号未用完而取到昨日的编号,为了避免这种情况,可以在创建序列时使用nocache关键字
      

  2.   

    不知道为什么,job只要一创建就说:无效的sql,是怎么回事啊
    比如说:
    --创建一张表
    create table a(
           mydate date
    );
    --创建存储过程,每隔一分钟,插入到数据库里面一条记录
      create or replace procedure test as
      begin
      insert into a values(sysdate);
      end;
    --job,问题就在这,只要执行下面的语句,就说:无效的sql语句!
     variable job1 number;
     begin
      sys.dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次
      commit;
      end;求救!!
      

  3.   

    是的,就显示:无效的sql,怎么回事啊!
      

  4.   

    用楼主的语句执行了下,没问题,test了下,也没发现问题啊
      

  5.   


    把出错的地方改成下面的就行了:
      declare
      job1 number;
     begin
      dbms_job.submit(job1,'test;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
    dbms_job.run(job1);
      commit;
      end;
      

  6.   

    job 可以调用有参的存储过程,
    存储过程需要放在begin 和and之间。
     把你的job贴出来,呵呵。
      

  7.   

    这里有现成的,每天凌晨1点执行
    begin
      sys.dbms_job.submit(job => :job,
                          what => '
    begin
    seq_reset('mysequence');
    end;',
        next_date => to_date('09-07-2010 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
         interval => 'trunc(sysdate)+2/24+1');
      commit;
    end;
      

  8.   

    存储过程中的sql语句没有commit 
      

  9.   

    肯定可以的,应该是你的sql有问题
      

  10.   

    小弟也刚学oracle问一下,如果那个过程的参数是一个变量,或者说是用每天的某个时间,这该怎么调用呢?请高手指点下。
    还有像“TRUNC(sysdate,'mi')+1/(24*60)”这种格式的在job中怎么用,我看大多数多是用的“sysdate,'sysdate+1/1440'”这种的,不是说这种时间会漂移吗?