PL SQL替代嵌套异常

时间:2013-09-13 18:12:12

标签: sql oracle exception plsql where

我想知道是否有任何替代方法可以解决这种逻辑,而不使用嵌套异常。这是返回整数值的Function的一部分。谢谢。

IF PNOMTARIFA = 'DEPOSITO' 
THEN
   BEGIN
      SELECT CL.ID_TIPO_CONT_LINEA, 
             CL.NOMBRE_TIPO_CONTENEDOR, 
             TC.DEPOSITO ,
             L.NOMBRE
        INTO idcontlinea, 
             tcontenedor, 
             deposito, 
             vlinea
        FROM TIPO_CONT TE, 
             TIPO_CONT_LINEA CL, 
             TARIFAS_DEPOSITO TC, 
             LINEAS L
       WHERE TE.ID_TIPO_CONT = CL.ID_TIPO_CONTENEDOR
         AND CL.ID_TIPO_CONT_LINEA = TC.ID_TIPO_CONT_LINEA
         AND CL.LINEA = L.LINEA
         AND TE.ID_TIPO_CONT = PTIPO_CONT
         AND CL.LINEA = PLINEA
         AND TC.NIT = PNITCLIENTE
         AND TC.BL = PNUMBL
         AND TC.VIGENCIA_DEPOSITO >= trunc(SYSDATE);

    EXCEPTION 
       WHEN OTHERS THEN 
         BEGIN
            SELECT CL.ID_TIPO_CONT_LINEA, 
                   CL.NOMBRE_TIPO_CONTENEDOR, 
                   TC.DEPOSITO ,
                   L.NOMBRE
              INTO idcontlinea, 
                   tcontenedor, 
                   deposito, 
                   vlinea
              FROM TIPO_CONT TE, 
                   TIPO_CONT_LINEA CL, 
                   TARIFAS_DEPOSITO TC, 
                   LINEAS L
             WHERE TE.ID_TIPO_CONT = CL.ID_TIPO_CONTENEDOR
               AND CL.ID_TIPO_CONT_LINEA = TC.ID_TIPO_CONT_LINEA
               AND CL.LINEA = L.LINEA
               AND TE.ID_TIPO_CONT = PTIPO_CONT
               AND CL.LINEA = PLINEA
               AND TC.NIT = PNITCLIENTE
               AND TC.PUERTO_CARGUE = PPTOCARGUE
               AND TC.PUERTO_DESCARGUE = PPTODESCARGUE
               AND PCLIENTEEXT LIKE '%'||TC.CLIENTE_EXT||'%'
               AND TC.BL IS NULL
               AND TC.VIGENCIA_DEPOSITO >= trunc(SYSDATE);
        EXCEPTION 
           WHEN OTHERS THEN
             BEGIN
                SELECT CL.ID_TIPO_CONT_LINEA, 
                       CL.NOMBRE_TIPO_CONTENEDOR, 
                       TC.DEPOSITO , 
                       L.NOMBRE
                  INTO idcontlinea, 
                       tcontenedor, 
                       deposito, 
                       vlinea
                  FROM TIPO_CONT TE, 
                       TIPO_CONT_LINEA CL, 
                       TARIFAS_DEPOSITO TC, 
                       LINEAS L
                 WHERE TE.ID_TIPO_CONT = CL.ID_TIPO_CONTENEDOR
                   AND CL.ID_TIPO_CONT_LINEA = TC.ID_TIPO_CONT_LINEA
                   AND CL.LINEA = L.LINEA
                   AND TE.ID_TIPO_CONT = PTIPO_CONT
                   AND CL.LINEA = PLINEA
                   AND TC.NIT = PNITCLIENTE
                   AND TC.PUERTO_CARGUE = PPTOCARGUE
                   AND TC.PUERTO_DESCARGUE = PPTODESCARGUE
                   AND TC.CLIENTE_EXT IS NULL
                   AND TC.BL IS NULL
                   AND TC.VIGENCIA_DEPOSITO >= trunc(SYSDATE);
            EXCEPTION WHEN OTHERS THEN

......嵌套了近30个例外。

1 个答案:

答案 0 :(得分:0)

恕我直言,这种类型的代码很难调试和维护。

如果我没错,代码是:

  • 多次执行相同的查询,条件略有不同
  • 使用异常来捕获NO_DATA_FOUND异常(这是执行select语句时最可能的异常)

我建议:

  • 尝试将多个查询聚合在一起,条件如

    AND(TC.BL = PNUMBL或TC.BL为空)

  • 如果无法做到这一点,请执行

    之类的操作

    选择计数(*) 进入query1count 来自...... 哪里......条件......

    if(query1count> 0)然后......

    否则

    - 再做一次查询

希望这有帮助。