PROCEDURE PROC_CORE_MANAGER
(P_LOTNO VARCHAR2, 
P_RESULT OUT VARCHAR2) 
IS
  V_LOTORG VARCHAR(25);
  V_COUNT  NUMBER;
  V_LOTNO  VARCHAR(25);
  V_LIKE   VARCHAR(15);
  v_xxx    VARCHAR(20);
BEGIN
  SELECT COUNT(1) INTO V_COUNT FROM CORELIST WHERE LOTNO = P_LOTNO;
  IF (V_COUNT < 1) THEN
    BEGIN
      SELECT GLOTORG INTO V_LOTORG FROM GLOTINFO WHERE GLOTNO = P_LOTNO;
    EXCEPTION              --上面一句出现异常就走,不出现就直接跳走了,不接着执行下面的语句了 ,怎么解决
      WHEN NO_DATA_FOUND THEN
        BEGIN
          V_LOTORG := 'no data found';
        END;
        IF (V_LOTORG = 'no data found') THEN
          BEGIN
            --判断是否是伪码,判断方法:把批号的最后两位替换为01
            V_LIKE := SUBSTR(P_LOTNO, 1, 8) || '01';
            SELECT GLOTORG
              INTO V_LOTORG
              FROM GLOTINFO
             WHERE GLOTNO = V_LIKE;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              BEGIN
                V_LOTORG := 'no data found';
              END;
              
         IF (V_LOTORG = 'no data found') THEN
          BEGIN
                  P_RESULT := -1;
          END;
              ELSE
                BEGIN
                  SELECT LOTNO
                    INTO V_LOTNO
                    FROM CORELIST
                   WHERE LOTNO IN (SELECT GLOTNO
                                     FROM GLOTINFO
                                    WHERE GLOTORG = V_LOTORG);
                EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                    BEGIN
                      V_LOTNO := 'no data found';
                    END;
                    IF (V_LOTNO = 'no data found') THEN
                      BEGIN
                        P_RESULT := -1;
                      END;
                    ELSE
                      BEGIN
                        P_RESULT := V_LOTNO;
                      END;
                    END IF;
                END;
              END IF;
          END;
        ELSE
          BEGIN
            SELECT LOTNO
              INTO V_LOTNO
              FROM CORELIST
             WHERE LOTNO IN
                   (SELECT GLOTNO FROM GLOTINFO WHERE GLOTORG = V_LOTORG);
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              BEGIN
                V_LOTNO := 'no data found';
              END;
              IF (V_LOTNO = 'no data found') THEN
                BEGIN
                  P_RESULT := -1;
                END;
              ELSE
                BEGIN
                  UPDATE CORELIST
                     SET LOTNO = P_LOTNO
                   WHERE LOTNO = V_LOTNO;
                  P_RESULT := 2; --更新信息成功
                EXCEPTION
                  WHEN OTHERS THEN
                    BEGIN
                      P_RESULT := -2; --数据操作异常
                      ROLLBACK;
                    END;
                    COMMIT;
                END;
              END IF;
          END;
        END IF;
      
    END;
  ELSE
    BEGIN
      P_RESULT := 1; --正常记录
      COMMIT;
    END;
  
  END IF;
END PROC_CORE_MANAGER;当出现异常的时候Exception会捕捉,然后接着往下走,可是一旦不出现异常就会直接跳出IF,

解决方案 »

  1.   

    写的看起来好多begin-end..
    你试下这样写呢:
    BEGIN
      SELECT COUNT(1) INTO V_COUNT FROM CORELIST WHERE LOTNO = P_LOTNO;
      IF (V_COUNT < 1) THEN
        BEGIN
         --这一块用一个begin-end包起来
         BEGIN 
          SELECT GLOTORG INTO V_LOTORG FROM GLOTINFO WHERE GLOTNO = P_LOTNO;
        EXCEPTION              --上面一句出现异常就走,不出现就直接跳走了,不接着执行下面的语句了 ,怎么解决
          WHEN NO_DATA_FOUND THEN
              V_LOTORG := 'no data found';
         END;        IF (V_LOTORG = 'no data found') THEN