设为首页 收藏本站
查看: 793|回复: 0

[经验分享] 标准的Oracle存储过程

[复制链接]

尚未签到

发表于 2016-7-17 10:10:52 | 显示全部楼层 |阅读模式
为什么我说它标准呢?因为这个存储过程中包括了,游标的使用,for语句,if语句,定义变量的使用,第二个存储过程还有传入参数的使用,做个模版,以后仿照来写就可以了。

CREATE OR REPLACE PROCEDURE NEWHR.update_boykq_ding
IS
/******************************************************************************
創建人:丁樂進
創建時間:2010/7/9
用途:保密
******************************************************************************/
   v_dt              VARCHAR (20);
   v_workno          VARCHAR (20);
   v_begintime       DATE;
   v_workshift       NUMBER;
   v_temp            NUMBER;
   v_ondutytime      NUMBER;
   v_otoffdutytime   NUMBER;
   v_r1              NUMBER;
   v_r2              NUMBER;
   v_a1              NUMBER;
   v_a2              NUMBER;
   v_a3              NUMBER;
   v_a4              NUMBER;

   CURSOR find_workno
   IS
      SELECT dt, workno
        FROM (SELECT    TO_CHAR (TO_NUMBER (TO_CHAR (borndate, 'yyyy')) + 18
                                )
                     || TO_CHAR (borndate, 'mmdd') dt,
                     borndate, workno
                FROM hrm_employees)
       WHERE dt >= '20090801';
BEGIN
   OPEN find_workno;

   LOOP
      FETCH find_workno
       INTO v_dt, v_workno;

      EXIT WHEN find_workno%NOTFOUND;

      SELECT COUNT (*)
        INTO v_workshift
        FROM kqm_employeeshift
       WHERE SUBSTR (shiftno, 0, 1) = 'C'
         AND workno = v_workno
         AND TO_CHAR (startdate, 'yyyy/MM/dd') >= '2009/08/01'
         AND TO_CHAR (enddate, 'yyyyMMdd') <= v_dt;

      IF v_workshift > 0
      THEN

         UPDATE kqm_employeeshift
            SET shiftno = 'A611'
          WHERE workno = v_workno
            AND SUBSTR (shiftno, 0, 1) = 'C'
            AND TO_CHAR (startdate, 'yyyy/MM/dd') >= '2009/08/01'
            AND TO_CHAR (enddate, 'yyyyMMdd') <= v_dt;
      END IF;


      FOR rec IN (SELECT   ondutytime, offdutytime, kqdate
                      FROM kqm_kaoqindata
                     WHERE workno = v_workno
                       AND TO_CHAR (kqdate, 'yyyy/MM/dd') >= '2009/08/01'
                       AND TO_CHAR (kqdate, 'yyyyMMdd') <= v_dt
                       AND SUBSTR (shiftno, 0, 1) = 'C'
                       AND othours = 0
                  ORDER BY kqdate)
      LOOP
         SELECT ondutytime
           INTO v_begintime
           FROM kqm_kaoqindata
          WHERE workno = v_workno AND ondutytime = rec.ondutytime;

         IF rec.ondutytime IS NOT NULL
         THEN
            SELECT COUNT (*)
              INTO v_r1
              FROM kqm_bellcarddata
             WHERE workno = v_workno
               AND cardtime <= rec.ondutytime + 1 / 24
               AND cardtime >= rec.ondutytime - 1 / 24;

            IF v_r1 > 0
            THEN
               SELECT COUNT (*)
                 INTO v_a1
                 FROM kqm_bellcarddata
                WHERE workno = v_workno
                  AND cardtime =
                         TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '07:50',
                                  'yyyymmdd HH24:mi:ss'
                                 );

               IF v_a1 > 0
               THEN

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - 1 / 1440
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.ondutytime + 1 / 24
                     AND cardtime >= rec.ondutytime - 1 / 24;
               ELSE

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.ondutytime + 1 / 24
                     AND cardtime >= rec.ondutytime - 1 / 24;
               END IF;
            END IF;
         END IF;

         IF rec.offdutytime IS NOT NULL
         THEN
            SELECT COUNT (*)
              INTO v_r2
              FROM kqm_bellcarddata
             WHERE workno = v_workno
               AND cardtime <= rec.offdutytime + 1 / 24
               AND cardtime >= rec.offdutytime - 1 / 24;

            IF     v_r2 > 0
               AND TO_CHAR (rec.offdutytime, 'yyyy/MM/dd') <> '2010/01/01'
            THEN
               SELECT COUNT (*)
                 INTO v_a2
                 FROM kqm_bellcarddata
                WHERE workno = v_workno
                  AND cardtime =
                         TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '07:50',
                                  'yyyymmdd HH24:mi:ss'
                                 );

               IF v_a2 > 0
               THEN

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - 1 / 1440
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.offdutytime + 1 / 24
                     AND cardtime >= rec.offdutytime - 1 / 24;
               ELSE

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.offdutytime + 1 / 24
                     AND cardtime >= rec.offdutytime - 1 / 24;
               END IF;
            END IF;
         END IF;

         IF TO_CHAR (rec.kqdate, 'yyyy/MM/dd') <> '2010/01/01'
         THEN

            UPDATE kqm_kaoqindata
               SET ondutytime =
                        ondutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   offdutytime =
                        offdutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   shiftno = 'A611'
             WHERE workno = v_workno AND kqdate = rec.kqdate;
         END IF;
      END LOOP;


      FOR rec IN (SELECT ondutytime, otoffdutytime, kqdate
                    FROM kqm_kaoqindata
                   WHERE workno = v_workno
                     AND SUBSTR (shiftno, 0, 1) = 'C'
                     AND TO_CHAR (kqdate, 'yyyy/MM/dd') >= '2009/08/01'
                     AND TO_CHAR (kqdate, 'yyyyMMdd') <= v_dt
                     AND othours > 0)
      LOOP
         SELECT ondutytime
           INTO v_begintime
           FROM kqm_kaoqindata
          WHERE workno = v_workno AND ondutytime = rec.ondutytime;

         SELECT COUNT (*)
           INTO v_temp
           FROM otm_advanceapply
          WHERE workno = v_workno
            AND otdate = rec.kqdate
            AND SUBSTR (otshiftno, 0, 1) = 'C';

         IF rec.ondutytime IS NOT NULL
         THEN
            SELECT COUNT (*)
              INTO v_ondutytime
              FROM kqm_bellcarddata
             WHERE workno = v_workno
               AND cardtime <= rec.ondutytime + 1 / 24
               AND cardtime >= rec.ondutytime - 1 / 24;

            IF v_ondutytime > 0
            THEN
               SELECT COUNT (*)
                 INTO v_a3
                 FROM kqm_bellcarddata
                WHERE workno = v_workno
                  AND cardtime =
                         TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '07:50',
                                  'yyyymmdd HH24:mi:ss'
                                 );

               IF v_a3 > 0
               THEN

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - 1 / 1440
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.ondutytime + 1 / 24
                     AND cardtime >= rec.ondutytime - 1 / 24;
               ELSE

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.ondutytime + 1 / 24
                     AND cardtime >= rec.ondutytime - 1 / 24;
               END IF;
            END IF;
         END IF;

         IF rec.otoffdutytime IS NOT NULL
         THEN
            SELECT COUNT (*)
              INTO v_otoffdutytime
              FROM kqm_bellcarddata
             WHERE workno = v_workno
               AND cardtime <= rec.otoffdutytime + 1 / 24
               AND cardtime >= rec.otoffdutytime - 1 / 24;

            IF     v_otoffdutytime > 0
               AND TO_CHAR (rec.otoffdutytime, 'yyyy/MM/dd') <> '2010/01/01'
            THEN
               SELECT COUNT (*)
                 INTO v_a4
                 FROM kqm_bellcarddata
                WHERE workno = v_workno
                  AND cardtime >= cardtime - 12/ 24
                  AND cardtime =
                         TO_DATE (TO_CHAR (cardtime, 'yyyymmdd') || '07:50',
                                  'yyyymmdd HH24:mi:ss'
                                 );

               IF v_a4 > 0
               THEN

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - 1 / 1440
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.otoffdutytime + 1 / 24
                     AND cardtime >= rec.otoffdutytime - 1 / 24;
               ELSE

                  UPDATE kqm_bellcarddata
                     SET cardtime =
                              cardtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              ),
                         readtime =
                              readtime
                            - 12 / 24
                            - (  v_begintime
                               - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                          || '19:50',
                                          'yyyymmdd HH24:mi:ss'
                                         )
                              )
                   WHERE workno = v_workno
                     AND cardtime <= rec.otoffdutytime + 1 / 24
                     AND cardtime >= rec.otoffdutytime - 1 / 24;
               END IF;
            END IF;
         END IF;

         IF TO_CHAR (rec.kqdate, 'yyyy/MM/dd') <> '2010/01/01'
         THEN

            UPDATE kqm_kaoqindata
               SET ondutytime =
                        ondutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   offdutytime =
                      TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '17:40',
                               'yyyymmdd HH24:mi:ss'
                              ),
                   otondutytime =
                      TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '17:40',
                               'yyyymmdd HH24:mi:ss'
                              ),
                   otoffdutytime =
                        otoffdutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   shiftno = 'A611'
             WHERE workno = v_workno AND kqdate = rec.kqdate;
         END IF;

         IF v_temp > 0
         THEN

            UPDATE otm_advanceapply
               SET endtime =
                        endtime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   begintime =
                      TO_DATE (TO_CHAR (begintime, 'yyyymmdd') || '17:40',
                               'yyyymmdd HH24:mi:ss'
                              ),
                   otshiftno = 'A611'
             WHERE otdate = rec.kqdate AND workno = v_workno;


            UPDATE otm_realapply
               SET endtime =
                        endtime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   begintime =
                      TO_DATE (TO_CHAR (v_begintime, 'yyyymmdd') || '17:40',
                               'yyyymmdd HH24:mi:ss'
                              ),
                   ondutytime =
                        ondutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   offdutytime =
                        offdutytime
                      - 12 / 24
                      - (  v_begintime
                         - TO_DATE (   TO_CHAR (v_begintime, 'yyyymmdd')
                                    || '19:50',
                                    'yyyymmdd HH24:mi:ss'
                                   )
                        ),
                   shiftno = 'A611'
             WHERE otdate = rec.kqdate AND workno = v_workno;
         END IF;
      END LOOP;
   END LOOP;

   CLOSE find_workno;

   COMMIT;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
   WHEN OTHERS
   THEN
      RAISE;
END update_boykq_ding;
/

CREATE OR REPLACE PROCEDURE NEWHR.del_sundaykq_ding (pselectdate IN DATE)
IS
/******************************************************************************
   創建人;丁樂進
   創建日期:2010/7/9
******************************************************************************/
   v_workno      VARCHAR (30);
   v_projectid   VARCHAR (36);
   v_otdate      DATE;

   CURSOR find_workno
   IS
      SELECT workno, otdate
        FROM otm_advanceapply
       WHERE isproject = 'Y' AND otdate >= pselectdate;
BEGIN

   DELETE FROM otm_realapply
         WHERE TO_CHAR (otdate, 'd') = '1' AND otdate >= pselectdate;


   DELETE FROM otm_advanceapply
         WHERE TO_CHAR (otdate, 'd') = '1' AND otdate >= pselectdate;


   DELETE FROM kqm_bellcarddata
         WHERE TO_CHAR (cardtime, 'd') = '1' AND cardtime >= pselectdate;

   OPEN find_workno;

   LOOP
      FETCH find_workno
       INTO v_workno, v_otdate;

      EXIT WHEN find_workno%NOTFOUND;

      SELECT ID
        INTO v_projectid
        FROM otm_advanceapply
       WHERE isproject = 'Y' AND otdate = v_otdate AND workno = v_workno;

      DELETE FROM otm_advanceapply
            WHERE isproject = 'Y' AND otdate = v_otdate AND ID = v_projectid;


      DELETE FROM otm_realapply
            WHERE advanceid = v_projectid;
   END LOOP;

   CLOSE find_workno;


   UPDATE kqm_kaoqindata
      SET ondutytime = '',
          offdutytime = '',
          exceptiontype = 'F',
          othours = '',
          workhours = ''
    WHERE TO_CHAR (kqdate, 'd') = '1' AND kqdate >= pselectdate;

   COMMIT;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END del_sundaykq_ding;
/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245213-1-1.html 上篇帖子: oracle的case语句实例 下篇帖子: Oracle日期转字符串
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表