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;

ORACLE_簽核PROC帶游標的更多相关文章

  1. 网站繁简切换的JS遇到的一个BUG

    公司打算进入台湾市场,最近开发了繁体版本的网站,数据库里的信息全是简体,除了网页上固定的文字手动翻译了,文章内容标题都不是繁体. 于是在网上找了一段比较流行的繁简切换的JS实现了,不过后来却发现,有些 ...

  2. mud目录命令说明

      目錄結構 以下列出的是 ES2 mudlib 根目錄下標準的子目錄結構,以及簡短的說明. /adm 儲存由系統管理者所管理的程式與資料檔. /std 儲存標準物件的程式碼. /obj 儲存通用物件 ...

  3. Android常用元件

    本文来源于 http://blog.csdn.net/wxhlinux/article/details/8601170#comments 1.4  Android應用程式元件1.4.1  Activi ...

  4. ORACLE 學習筆記

    proc 里的 commit等于提交就是你做了insert或者update后,commit后才是真正修改或者插入了数据库中 如果不提交的话,那么这个表就被锁了 CURSOR MYCURSOR is   ...

  5. sql server存儲過程語法

    -- 变量的声明,sql里面声明变量时必须在变量前加@符号    DECLARE @I INT -- 变量的赋值,变量赋值时变量前必须加set    SET @I = 30 -- 声明多个变量    ...

  6. 鸟哥的linux私房菜---非常好的linux基础网址【转】

    转自:http://linux.vbird.org/linux_basic/0320bash.php 在 Linux 的環境下,如果你不懂 bash 是什麼,那麼其他的東西就不用學了!因為前面幾章我們 ...

  7. button属性值

    AccessibilityObject 取得指定給控制項的 AccessibleObject. (繼承自 Control). AccessibleDefaultActionDescription 取得 ...

  8. 鸟哥之安裝 CentOS7.x

    http://linux.vbird.org/linux_basic/0157installcentos7.php since 2002/01/01 新手建議 開始閱讀之前 網站導覽 Linux 基礎 ...

  9. 我的acm vim 备忘

    一.從命令到編輯模式 a :当前单词后面插入Appendi :当前位置插入Inserto :当前行下新开一行插入Open new lineA :当前行尾插入AppendI :当前行首插入InsertO ...

随机推荐

  1. 【caffe-windows】 caffe-master 之 matlab接口配置

    平台环境: win10 64位 caffe-master  vs2013 Matlab2016a 第一步: 打开\caffe-master\windows下的CommonSettings.props文 ...

  2. Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制

    本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...

  3. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

  4. 查看真机的APP沙盒文件

    1.Xcode --> window --> devices -->左边选择设备 右下边选择要查看的app 双击应用可查看目录 点击设置按钮,选 Download Container ...

  5. fastJson java后台转换json格式数据

    什么事JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Progra ...

  6. SO单号中某两项没进FP

    某张SO共60项,有两项没有进FP系统,550 560两项VC物料没有进FP 1.检查in_sales_order发现是有60行数据 2.在INODS时执行FP_SO呢个存储过程会将in_sales_ ...

  7. html() 和 text() 方法的区别

    html()方法仅支持XHTML的文档,不能用于XML文档,而text()既支持HTML文档,也 支持XML文档. html():没有参数,用于获取html的值: html(val):有参数,用于设置 ...

  8. POJ 1661 Help Jimmy LIS DP

    http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...

  9. python 文件拷贝

    用python实现了一个小型的自动发版本的工具.这个“自动发版本”有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(. ...

  10. ORA-01439: column to be modified must be empty to change datatype

    修改数据库字段类型,但是由于数据表已经存在数据,无法修改: 显示错误:  写道 ORA-01439: column to be modified must be empty to change dat ...