屹砾

屹砾技术博客,记录生活点滴。
Email/QQ/MSN/GTalk: eli.wuhan@gmail.com

留言簿

积分与排名

Growing & Life

JavaSE & JavaEE

Linux & Unix

时事点评

阅读排行榜

评论排行榜

备忘:一些ORACLE程序



/*作业计划的例子*/
VARIABLE JOBNO 
NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:JOBNO,
'P_TEST',SYSDATE,'SYSDATE+1/1440',TRUE);
COMMIT;
END;
-----------------------------------------------SQL程序------------------------------------------------

/*查看所有今天应派工的计划信息
  计划的使用标志为Y,
  当前日期在计划执行范围内,
  任务最后生成日期为NULL或在当前日期之前,
  当前日期是派工日期
*/

CREATE OR REPLACE VIEW VIEW_AUTO_TASK AS
SELECT * FROM OPE_APP_CARESET
  
WHERE USE_SIGN='Y' AND (SYSDATE BETWEEN BEGIN_DATE AND END_DATE)
    
AND (LAST_TASK_DATE IS NULL OR LAST_TASK_DATE < TRUNC(SYSDATE))
    
AND (TO_NUMBER(TO_CHAR(SYSDATE,'DD'))=TASK_DATE
      
OR TO_NUMBER(TO_CHAR(SYSDATE,'D'))-1=MOD(TASK_DATE-100,7));

/*任务开始时间计算(返回任务开始时间)
  输入1-31为当月1-31号
  输入101-107为当周星期一到星期日
*/

CREATE OR REPLACE FUNCTION FUNC_TASK_BEGIN_DATE(TIME NUMBER)
RETURN DATE IS 
  BEGIN_DATE DATE;
BEGIN
  
IF TIME > 0 AND TIME <= 31 THEN
    
SELECT TO_DATE(TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TIME,2,'0'),'YYYYMMDD')
      
INTO BEGIN_DATE FROM DUAL;
  ELSIF TIME 
> 100 AND TIME <= 107 THEN
    
IF TO_NUMBER(TO_CHAR(SYSDATE,'D'))-1 = MOD(TIME-100,7THEN
      
SELECT TRUNC(SYSDATE) INTO BEGIN_DATE FROM DUAL;
    
ELSE
      
SELECT TRUNC(NEXT_DAY(SYSDATE,
        
CASE TIME
        
WHEN 101 THEN '星期一'
        
WHEN 102 THEN '星期二'
        
WHEN 103 THEN '星期三'
        
WHEN 104 THEN '星期四'
        
WHEN 105 THEN '星期五'
        
WHEN 106 THEN '星期六'
        
WHEN 107 THEN '星期日'
        
END)) INTO BEGIN_DATE FROM DUAL;
    
END IF;
  
END IF;
  
RETURN BEGIN_DATE;
END;

/*任务结束时间计算(返回任务结束时间)
  输入任务开始时间和任务期限
*/

CREATE OR REPLACE FUNCTION FUNC_TASK_END_DATE(TIME DATE, LTD NUMBER)
RETURN DATE IS
  END_DATE DATE;
BEGIN
  
SELECT TO_DATE(TO_CHAR(TIME+LTD-1,'YYYYMMDD')||'235959','YYYYMMDDHH24MISS')
    
INTO END_DATE FROM DUAL;
  
RETURN END_DATE;
END;

/*自动生成任务单号
  格式为当前日期YYYYMMDD加上任务数
  自动根据当前日期和已存在任务数生成任务单号
*/

CREATE OR REPLACE FUNCTION FUNC_CREATE_TASK_CODE
RETURN VARCHAR2 IS
  VAR_TASK_CODE 
VARCHAR2(12);
BEGIN
  
SELECT TO_CHAR(SYSDATE,'YYYYMMDD')||LPAD((COUNT(ROWID)+1),4,'0')
    
INTO VAR_TASK_CODE FROM OPE_APP_CARESEND
    
WHERE TRUNC(TASK_DATE)=TRUNC(SYSDATE);
  
RETURN VAR_TASK_CODE;
END;

/*根据计划生成任务的存储过程
  根据所有今天应派工的计划生成任务
*/

CREATE OR REPLACE PROCEDURE PROC_CREATE_TASK_BY_PLAN AS
BEGIN
  
DECLARE 
  VAR_CARESET_ID VIEW_AUTO_TASK.CARESET_ID
%TYPE;  /*计划编号*/  
  VAR_AREACARE_ID VIEW_AUTO_TASK.AREACARE_ID
%TYPE;  /*区域编号*/  
  VAR_CARESET_ADMINID VIEW_AUTO_TASK.CARESET_ADMINID
%TYPE;  /*计划制定人*/  
  VAR_STAKEOUT_SORTID VIEW_AUTO_TASK.STAKEOUT_SORTID
%TYPE;  /*监控类别*/  
  VAR_MEDIAFILE_SORTIDS VIEW_AUTO_TASK.MEDIAFILE_SORTIDS
%TYPE;  /*媒体类别*/  
  VAR_MEDIAFILE_AMOUNT VIEW_AUTO_TASK.MEDIAFILE_AMOUNT
%TYPE;  /*媒体数量*/  
  VAR_CAREACCEPT_ADMINID VIEW_AUTO_TASK.CAREACCEPT_ADMINID
%TYPE;  /*任务执行人*/  
  VAR_CYCLE_DATA VIEW_AUTO_TASK.CYCLE_DATA
%TYPE;  /*任务执行开始时间*/  
  VAR_TASK_DAYS VIEW_AUTO_TASK.TASK_DAYS
%TYPE;  /*任务执行期限*/  
  VAR_TASK_BEGIN_DATE DATE;  
/*任务开始时间*/ 
  VAR_TASK_END_DATE DATE;  
/*任务结束时间*/
  VAR_TASK_ID 
NUMBER;  /*任务编号*/
  VAR_TASK_CODE 
VARCHAR2(12);  /*任务单号*/
  VAR_IDX 
NUMBER := 0;  /*序号*/
  
CURSOR CS IS 
    
SELECT CARESET_ID, AREACARE_ID, CARESET_ADMINID, STAKEOUT_SORTID,
      MEDIAFILE_SORTIDS, MEDIAFILE_AMOUNT, CAREACCEPT_ADMINID, CYCLE_DATA, TASK_DAYS
      
FROM VIEW_AUTO_TASK;
  
BEGIN
    
OPEN CS;
    
FETCH CS INTO VAR_CARESET_ID, VAR_AREACARE_ID, VAR_CARESET_ADMINID, VAR_STAKEOUT_SORTID,
      VAR_MEDIAFILE_SORTIDS, VAR_MEDIAFILE_AMOUNT, VAR_CAREACCEPT_ADMINID, VAR_CYCLE_DATA, VAR_TASK_DAYS;
    
WHILE CS%FOUND LOOP     
      
SELECT FUNC_TASK_BEGIN_DATE(VAR_CYCLE_DATA)
        
INTO VAR_TASK_BEGIN_DATE FROM DUAL;/*设置任务开始时间*/      
      
SELECT FUNC_TASK_END_DATE(VAR_TASK_BEGIN_DATE,VAR_TASK_DAYS)
        
INTO VAR_TASK_END_DATE FROM DUAL;/*设置任务结束时间*/
      
SELECT CARESEND_ID.NEXTVAL INTO VAR_TASK_ID FROM DUAL;/*设置任务编号*/
      
SELECT FUNC_CREATE_TASK_CODE INTO VAR_TASK_CODE FROM DUAL;/*设置任务单号*/
      
SELECT VAR_IDX + 1 INTO VAR_IDX FROM DUAL;/*序号自增*/
      
INSERT INTO OPE_APP_CARESEND(AREACARE_ID, CARESEND_ADMINID, STAKEOUT_SORTID,
        MEDIAFILE_NAME, MEDIAFILE_AMOUNT, CAREACCEPT_ADMINID, BEGIN_DATE,END_DATE,
        USE_SIGN, TASK_DATE, CARESEND_ID, CARESEND_CODE, TASK_SORTID, SEND_SORTID)
        
VALUES(VAR_AREACARE_ID, VAR_CARESET_ADMINID, VAR_STAKEOUT_SORTID, VAR_MEDIAFILE_SORTIDS,
        VAR_MEDIAFILE_AMOUNT, VAR_CAREACCEPT_ADMINID, VAR_TASK_BEGIN_DATE, VAR_TASK_END_DATE,
        
'Y', SYSDATE, VAR_TASK_ID, VAR_TASK_CODE, '01''02');
      
UPDATE OPE_APP_CARESET SET LAST_TASK_DATE=SYSDATE WHERE CARESET_ID=VAR_CARESET_ID;
      DBMS_OUTPUT.PUT_LINE(
'NO.'||VAR_IDX
        
||' 已经生成 '||VAR_TASK_ID||' 号任务, 任务单号 '||VAR_TASK_CODE
        
||', 依据 '||VAR_CARESET_ID||' 号计划');
      
FETCH CS INTO VAR_CARESET_ID, VAR_AREACARE_ID, VAR_CARESET_ADMINID, VAR_STAKEOUT_SORTID,
        VAR_MEDIAFILE_SORTIDS, VAR_MEDIAFILE_AMOUNT, VAR_CAREACCEPT_ADMINID, VAR_CYCLE_DATA, VAR_TASK_DAYS;
    
END LOOP;
    
IF VAR_IDX = 0 THEN
      DBMS_OUTPUT.PUT_LINE(
'没有任何任务可以生成');
    
END IF;
    
CLOSE CS;
  
END;
END;

/*作业计划*/
/*每五分钟执行一次*/
VARIABLE VAR_JOB 
NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:VAR_JOB,
'PROC_CREATE_TASK_BY_PLAN;',
  SYSDATE
+5/1440,
  
'SYSDATE+5/1440');
  
COMMIT;
END;
/*每天09:55执行一次*/
VARIABLE VAR_JOB 
NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:VAR_JOB,
'PROC_CREATE_TASK_BY_PLAN;',
  TRUNC(SYSDATE)
+(9*60+55)/(24*60),
  
'TRUNC(SYSDATE+1)+(9*60+55)/(24*60)');
  
COMMIT;
END;

/*查询作业*/
SELECT JOB,SCHEMA_USER,LAST_DATE,NEXT_DATE,INTERVAL,INSTANCE FROM USER_JOBS;
/*设置字段显示宽度*/
COL COLUMN_NAME 
FOR A50;

posted on 2008-07-10 19:14 屹砾 阅读(31) 评论(0)  编辑  收藏 所属分类: Database


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
成果网帮您增加网站收入
 
相关链接:
网站导航: