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 例外をキャッチします (選択ステートメントを実行するときに最も可能性の高い例外です)

私は次のことをお勧めします:

  • 次のような条件で、多くのクエリを 1 つに集約してみてください

    AND (TC.BL = PNUMBL OR TC.BL IS NULL)

  • これが不可能な場合は、次のようにしてください

    select count(*) from query1count from ... where ...condition...

    if (query1count>0) then ...

    そうしないと

    -- 別のクエリを実行します

お役に立てれば。

于 2013-09-13T18:31:14.080 に答える