oracle定時器在項目中的應用

業務需求:

如今業務人員提出了一個需求:html

在項目中的工做流,都要有一個流程編號,此編號有必定的規則:java

前四五位是流程的字母縮寫,中間是8位的日期,後面五位是流水碼,要求流水碼天天從00001開始。即:QJLC2018060800001sql

 

沒有想到更好的方式,暫時考慮到了使用oracle的定時器來天天定時的將流水碼重置爲1。數據庫

Oracle數據庫表和定時器的建立:

建立任務編碼表:oracle

/*==============================================================*/函數

/* Table: t_flow_taskcode_conf                                  */編碼

/*==============================================================*/spa

create table t_flow_taskcode_conf  (.net

   flowflag              varchar2(8),code

   flowab                varchar2(10),

   flowcode             NUMBER(5)

);

comment on table t_flow_taskcode_conf is '流程生成任務編號表';

comment on column t_flow_taskcode_conf.flowflag is '流程標識';

comment on column t_flow_taskcode_conf.flowab is '流程四位縮寫';

comment on column t_flow_taskcode_conf.flowcode is '流水碼';

 

insert into t_flow_taskcode_conf (FLOWFLAG, FLOWAB, FLOWCODE) values ('QJLC', 'QJLC', 1);

insert into t_flow_taskcode_conf (FLOWFLAG, FLOWAB, FLOWCODE) values ('BGYP', 'BGYP', 1);

insert into t_flow_taskcode_conf (FLOWFLAG, FLOWAB, FLOWCODE) values ('DJBX', 'DJBX', 1);

commit;

 建立oracle內部的定時器:

create or replace procedure taskcode_procedure is

begin

  update t_flow_taskcode_conf fc set fc.flowcode = 1;

  commit;

end;

 

--定義taskcode天天自動初始化的job任務

declare taskcodejob number;

begin

  dbms_job.submit(

        taskcodejob,  --定時器ID,系統自動得到

        'taskcode_procedure;', --what 執行的存儲過程名

        sysdate,  --定時器開始執行的時間,這樣寫表示當即執行 --next_date,能夠不填

        'TRUNC(sysdate)+1'--'Interval時間字符串' --關鍵設置,此處表示天天的0點執行

  );

commit;

end;

  

#########下面是一些oracle中的job表和內置定時器函數的介紹:

--  select * from user_jobs;  --查看調度任務

--  select * from dba_jobs_running;--查看正在執行的調度任務

--  select * from dba_jobs;--查看執行完的調度任務

 

----更新一個job的sql代碼

declare

taskcodejob number;

begin

      dbms_job.run(3);        --運行jobid爲3的定時器

      --dbms_job.remove(10);   --9是從user_jobs這個表中查詢到而後手動賦值到這裏的

      --dbms_job.broken(8);    --中止一個job

      --dbms_job.interval(84,'TRUNC(sysdate)+15/1440');--更改定時器的運行頻率

commit;

end; 

 

項目中的使用

Java代碼:

/**  * 傳入流程的標誌,返回流程的任務編碼  * @param taskCodeEnum  * @return  */ public String getAndSetTaskCode(FlowTaskCodeEnum taskCodeEnum){
   String flowflag = taskCodeEnum.toString();  //flowflag是」BGYP」,」QJLC」等字符串
   //先獲取流程的編碼
  
String taskcode = publicCollectDao.getTaskCodeByFlow(flowflag);    Map<String,Object> map = new HashMap<>();    map.put("flowflag",flowflag);    //設置流程的編碼加1    publicCollectDao.updateFlowCode(map);    return taskcode; }

Mybatis的xml文件:

<select id="getTaskCodeByFlow" parameterType="string" resultType="string">

  select fc.flowab||to_char(sysdate,'yyyyMMdd')||lpad(fc.flowcode,5,'0') taskcode

  from t_flow_taskcode_conf fc 

  where fc.flowflag = #{flowflag}

</select>

<update id="updateFlowCode" parameterType="map">

  update t_flow_taskcode_conf set flowcode = flowcode+1 where flowflag=#{flowflag}

</update>

 

上面的java代碼,要保證getAndSetTaskCode()方法在使用時開啓了事務。

 

參考:

https://www.cnblogs.com/mingforyou/archive/2012/06/06/2538063.html

https://blog.csdn.net/anrry258/article/details/26555693

注意區分是普通的sql窗口仍是commond窗口。

相關文章
相關標籤/搜索