0

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

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 个开始异常。

4

1 回答 1

0

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

如果我是正确的,代码是:

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

我建议:

  • 尝试将许多查询聚合为一个,条件如下

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

  • 如果这是不可能的,做类似的事情

    select count(*) into query1count from ... where ...conditions...

    如果 (query1count>0) 那么 ...

    别的

    -- 做另一个查询

希望这可以帮助。

于 2013-09-13T18:31:14.080 回答