CREATE OR REPLACE FUNCTION CONVERTE_UNIDADE_PRODUTO(
   P_CDPRODUTO VARCHAR2,
   P_QTPRODUTO FLOAT,
   P_SGUNIDADEORI VARCHAR2,
   P_SGUNIDADEDEST VARCHAR2
)RETURN FLOAT
IS
V_VRFTCONVER FLOAT(126);
V_IDTIPOPE VARCHAR2(1);
V_ORDEM FLOAT(126);
V_INVERTEOPERACAO VARCHAR2(1);
BEGIN
   BEGIN
      SELECT VRFTCONVER, IDTIPOPE, ORDEM
        INTO V_VRFTCONVER, V_IDTIPOPE, V_ORDEM
        FROM(SELECT TO_NUMBER(C.VRFATOCONVES) AS VRFTCONVER,
                    RPAD('/', 1, ' ')       AS IDTIPOPE,
                    0.0 AS ORDEM
               FROM CONVPRODUTO C LEFT JOIN PRODUTO P ON P.CDPRODUTO = C.CDPRODUTO
              WHERE (C.CDPRODUTO = P_CDPRODUTO) AND
                    (P.SGUNIDADE = P_SGUNIDADEORI) AND
                    (C.SGUNIDADE = P_SGUNIDADEDEST)
             UNION ALL
             SELECT TO_NUMBER(C.VRFATOCONVES) AS VRFTCONVER,
                    RPAD('*', 1, ' ')       AS IDTIPOPE,
                    1.0 AS ORDEM
               FROM CONVPRODUTO C LEFT JOIN PRODUTO P ON P.CDPRODUTO = C.CDPRODUTO
              WHERE (C.CDPRODUTO = P_CDPRODUTO) AND 
                    (P.SGUNIDADE = P_SGUNIDADEDEST) AND 
                    (C.SGUNIDADE = P_SGUNIDADEORI)
             UNION ALL
             SELECT TO_NUMBER(VRFTCONVER)  AS VRFTCONVER,
                    RPAD(IDTIPOPE, 1, ' ') AS IDTIPOPE,
                    2.0 AS ORDEM
               FROM CONVUNID
              WHERE (SGUNIDPARA = P_SGUNIDADEDEST) AND
                    (SGUNIDDE = P_SGUNIDADEORI)
             UNION ALL
             SELECT TO_NUMBER(VRFTCONVER)  AS VRFTCONVER,
                    RPAD(IDTIPOPE, 1, ' ') AS IDTIPOPE,
                    3.0 AS ORDEM
               FROM CONVUNID
              WHERE (SGUNIDPARA = P_SGUNIDADEORI ) AND
                    (SGUNIDDE = P_SGUNIDADEDEST )
             ORDER BY ORDEM
            )
       WHERE ROWNUM = 1;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_VRFTCONVER := NULL;
         V_IDTIPOPE := NULL;
         V_ORDEM := NULL;
      END;
   V_INVERTEOPERACAO := CASE WHEN V_ORDEM = 3.0 THEN 'S' ELSE 'N' END;
   /*SE NAO EXISTE CONVERSAO - RETORNA 0*/
   IF V_ORDEM IS NOT NULL THEN
      IF V_IDTIPOPE = '*' THEN
         RETURN CASE WHEN V_INVERTEOPERACAO = 'S' THEN CASE WHEN V_VRFTCONVER = 0 THEN 0 ELSE ROUND(P_QTPRODUTO / V_VRFTCONVER ,5) END ELSE ROUND(P_QTPRODUTO * V_VRFTCONVER ,5) END;
      ELSE
         RETURN CASE WHEN V_INVERTEOPERACAO = 'N' THEN CASE WHEN V_VRFTCONVER = 0 THEN 0 ELSE ROUND(P_QTPRODUTO / V_VRFTCONVER,5) END ELSE ROUND(P_QTPRODUTO * V_VRFTCONVER ,5) END;
      END IF;
   ELSE
      RETURN 0.0;
   END IF;
END;
/