zoukankan      html  css  js  c++  java
  • ORACLE_簽核PROC帶游標

    CREATE OR REPLACE PROCEDURE SP_C_TXYYMM(VAPPLY_NO IN VARCHAR2,VUSER_NM IN VARCHAR2,VFAC_NO IN VARCHAR2)
    AS
    BEDATE VARCHAR2(10);
    VTXKQ_NO VARCHAR2(2);
    VITEM VARCHAR2(1);
    EDDATE1 VARCHAR2(10);
    VYEARPER VARCHAR2(4);
    BEDATE1 VARCHAR2(10);
    EDDATE VARCHAR2(10);
    I INT;
    ZZ INT;
    NN INT;
    CC INT;
    DD INT;
    CURSOR TXKQ IS SELECT START_DAY,END_DAY ,TXKQ_NO,YEARPER,APPLY_ITEM FROM A_QH_LEAVEAPPLY_DETAIL WHERE APPLY_NO=VAPPLY_NO;
    BEGIN

    OPEN TXKQ;
    LOOP
    FETCH TXKQ INTO BEDATE,EDDATE,VTXKQ_NO,VYEARPER,VITEM;
    EXIT WHEN TXKQ%NOTFOUND;
    SELECT MONTHS_BETWEEN (TO_DATE(SUBSTR(EDDATE,1,7),'YYYY/MM'), TO_DATE(SUBSTR(BEDATE,1,7),'YYYY/MM') ) INTO ZZ FROM DUAL;
    FOR I IN 0..ZZ LOOP
    BEDATE1:=TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BEDATE,1,7),'YYYY/MM'),I),'YYYY/MM')||'/01';
    EDDATE1:=TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BEDATE,1,7),'YYYY/MM'),I),'YYYY/MM')||'/'||TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(SUBSTR(BEDATE,1,8)||'01','YYYY/MM/DD'),I)),'DD');
    IF I=0 THEN
    BEDATE1:=BEDATE;
    END IF;
    IF I=ZZ THEN
    EDDATE1:=EDDATE;
    END IF;
    SELECT COUNT(*) A INTO CC FROM C_TXYYMM TX, A_QH_LEAVEAPPLY_DETAIL QH
    WHERE (TX.FAC_NO=VFAC_NO OR TX.FAC_NO IN('HR','HGHR')) AND TX.FAC_NO=QH.FAC_NO AND TX.PNL=QH.PNL
    AND BEDATE1||QH.START_TIME=SUBSTR(TX.YYMM,1,7)||'/'||TX.DAY_START
    AND QH.APPLY_NO=VAPPLY_NO;

    IF CC=0 THEN
    IF VTXKQ_NO='3' THEN
    INSERT INTO C_TXYYMM
    SELECT DISTINCT A.FAC_NO,SUBSTR(BEDATE1,1,7)YYMM,A.PNL,B.SEC_NO,A.TXKQ_NO,
    SUBSTR(BEDATE1,9,2)||A.START_TIME DAY_STAR,SUBSTR(EDDATE1,9,2)||A.END_TIME DAY_END
    ,NULL STATEMENT,DECODE(A.YEARPER,'',NULL,A.YEARPER) YEARPER,
    DECODE(A.PERDAY1,'',NULL,A.PERDAY1) PERDAY1,
    DECODE(A.PERDAY2,'',NULL,A.PERDAY2) PERDAY2 ,VUSER_NM,SYSDATE
    FROM A_QH_LEAVEAPPLY_DETAIL A,P_PERSON B
    WHERE (B.FAC_NO=VFAC_NO OR B.FAC_NO IN('HR','HGHR')) AND A.FAC_NO=B.FAC_NO AND A.PNL=B.PNL
    AND APPLY_NO IN (SELECT APPLY_NO FROM APPLY
    WHERE APPLY_NO=VAPPLY_NO)
    AND B.INOUT_MK<>'Y' AND A.TXKQ_NO=VTXKQ_NO AND A.YEARPER=VYEARPER;
    COMMIT;
    ELSE
    INSERT INTO C_TXYYMM
    SELECT DISTINCT A.FAC_NO,SUBSTR(BEDATE1,1,7)YYMM,A.PNL,B.SEC_NO,A.TXKQ_NO,
    SUBSTR(BEDATE1,9,2)||A.START_TIME DAY_STAR,SUBSTR(EDDATE1,9,2)||A.END_TIME DAY_END
    ,NULL STATEMENT,DECODE(A.YEARPER,'',NULL,A.YEARPER) YEARPER,
    DECODE(A.PERDAY1,'',NULL,A.PERDAY1) PERDAY1,
    DECODE(A.PERDAY2,'',NULL,A.PERDAY2) PERDAY2 ,VUSER_NM,SYSDATE
    FROM A_QH_LEAVEAPPLY_DETAIL A,P_PERSON B
    WHERE (A.FAC_NO=VFAC_NO OR A.FAC_NO IN('HR','HGHR')) AND A.FAC_NO=B.FAC_NO AND A.PNL=B.PNL
    AND APPLY_NO IN (SELECT APPLY_NO FROM APPLY
    WHERE APPLY_NO=VAPPLY_NO AND APPLY_ITEM=VITEM)
    AND B.INOUT_MK<>'Y' AND A.TXKQ_NO=VTXKQ_NO;
    COMMIT;
    END IF;
    ELSE
    UPDATE C_TXYYMM C
    SET (C.DAY_END,DATE_TIME,USER_NAME)=
    (SELECT SUBSTR(EDDATE1,9,2)||END_TIME,SYSDATE,VUSER_NM
    FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR')) AND C.FAC_NO=A.FAC_NO AND C.PNL=A.PNL AND A.APPLY_NO=VAPPLY_NO)
    WHERE ( C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR'))
    AND EXISTS ( SELECT A.PNL FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (A.FAC_NO=VFAC_NO OR A.FAC_NO IN('HR','HGHR') )AND A.APPLY_NO=VAPPLY_NO
    AND A.FAC_NO=C.FAC_NO AND A.PNL=C.PNL AND
    C.YYMM||'/'||C.DAY_START=BEDATE1||A.START_TIME );

    COMMIT;
    END IF;
    END LOOP;
    END LOOP;
    CLOSE TXKQ;

    SELECT MONTHS_BETWEEN (TO_DATE(SUBSTR(EDDATE,1,7),'YYYY/MM'), TO_DATE(SUBSTR(BEDATE,1,7),'YYYY/MM') ) INTO NN FROM DUAL;
    SELECT COUNT(*) INTO DD FROM A_QH_LEAVEAPPLY_DETAIL WHERE APPLY_NO=VAPPLY_NO AND (START_TIME='1300' OR END_TIME='1200') ;

    -- IF (NN>0) THEN
    IF (NN>0 AND DD>0) THEN
    UPDATE C_TXYYMM C
    SET (C.DAY_END)=
    (SELECT SUBSTR(C.DAY_END,1,2)||'1700'
    FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR')) AND C.FAC_NO=A.FAC_NO AND C.PNL=A.PNL AND A.APPLY_NO=VAPPLY_NO)
    WHERE (C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR'))
    AND EXISTS ( SELECT A.PNL FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (A.FAC_NO=VFAC_NO OR A.FAC_NO IN('HR','HGHR')) AND A.APPLY_NO=VAPPLY_NO
    AND A.FAC_NO=C.FAC_NO AND A.PNL=C.PNL
    AND C.TXKQ_NO=A.TXKQ_NO AND SUBSTR(A.START_DAY,1,7)=C.YYMM
    );

    UPDATE C_TXYYMM C
    SET (C.DAY_START)=
    (SELECT SUBSTR(C.DAY_START,1,2)||'0730'
    FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR')) AND C.FAC_NO=A.FAC_NO AND C.PNL=A.PNL AND A.APPLY_NO=VAPPLY_NO)
    WHERE (C.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR'))
    AND EXISTS ( SELECT A.PNL FROM A_QH_LEAVEAPPLY_DETAIL A
    WHERE (A.FAC_NO=VFAC_NO OR C.FAC_NO IN('HR','HGHR')) AND A.APPLY_NO=VAPPLY_NO
    AND A.FAC_NO=C.FAC_NO AND A.PNL=C.PNL
    AND C.TXKQ_NO=A.TXKQ_NO AND SUBSTR(A.START_DAY,1,7)<C.YYMM
    );

    END IF;
    /* UPDATE d_free_meat SET MEAT_MK='1' where free_mk<>'A' AND MEAT_MK='0';
    UPDATE d_free_meat SET MEAT_MK='0' where free_mk='A' AND MEAT_MK<>'0' ; */
    END;

  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/buy0769/p/4424972.html
Copyright © 2011-2022 走看看