CREATE OR REPLACE
FUNCTION CICLO_VIGENTE_COC
  (P_CDFILIAL IN VARCHAR2,
   P_CDCIA IN VARCHAR2,
   P_NRVOO IN VARCHAR2,
   P_CDTRECHO IN VARCHAR2,
   P_DATA IN DATE,
   P_CDSERVICO IN VARCHAR2,
   P_CDCLASSE IN VARCHAR2,
   P_CDCICLOSERV IN VARCHAR2)
RETURN VARCHAR2
IS
V_CDCICLO VARCHAR2(4);
BEGIN
   BEGIN
     SELECT CASE 
           WHEN CIS.CDFILIAL IS NOT NULL OR (P_CDCICLOSERV = C.CDCICLO) THEN P_CDCICLOSERV
           WHEN CIC.CDFILIAL IS NOT NULL THEN CIC.CDCICLO
           WHEN CIV.CDFILIAL IS NOT NULL THEN CIV.CDCICLO
           WHEN CICIA.CDFILIAL IS NOT NULL THEN CICIA.CDCICLO
           ELSE C.CDCICLO
         END            
    INTO V_CDCICLO
    FROM CIAFILI C /*Usada aqui apenas para o left join com as outras tabelas*/
         /*Frequencia de ciclo por servico*/
         LEFT JOIN FRCICLOSER CIS ON CIS.CDFILIAL = C.CDFILIAL AND
                                     CIS.CDCIA = C.CDCIA AND
                                     CIS.NRVOO = P_NRVOO AND
                                     CIS.CDTRECHO = P_CDTRECHO AND
                                     CIS.CDSERVICO = P_CDSERVICO AND
                                     CIS.DTCICLOSER = P_DATA
         /*Frequencia do ciclo por classe, se nao encontrado ciclo por servico*/
         LEFT JOIN FRCICLOVCLA CIC ON CIC.CDFILIAL = C.CDFILIAL AND
                                      CIC.CDCIA = C.CDCIA AND
                                      CIC.NRVOO = P_NRVOO AND
                                      CIC.CDTRECHO = P_CDTRECHO AND
                                      CIC.CDCLASSE = P_CDCLASSE AND
                                      CIC.DTCICLOVCLA = P_DATA AND
                                      CIS.CDFILIAL IS NULL /*somente se nao tiver por servico*/
         /*Frequencia do ciclo por voo, se nao encontrado ciclo por servico ou por classe*/
         LEFT JOIN FRCICLOVOO CIV ON CIV.CDFILIAL = C.CDFILIAL AND
                                     CIV.CDCIA = C.CDCIA AND
                                     CIV.NRVOO = P_NRVOO AND
                                     CIV.CDTRECHO = P_CDTRECHO AND                                    
                                     CIV.DTCICLOVOO = P_DATA AND
                                     CIS.CDFILIAL IS NULL AND /*somente se nao tiver por servico*/
                                     CIC.CDFILIAL IS NULL /*somente se nao tiver por classe*/
         /*Frequencia do ciclo por companhia, se nao encontrado ciclo por servico, por classe ou por voo*/
         LEFT JOIN FRCICLOCIA CICIA ON  CIV.CDFILIAL = C.CDFILIAL AND
                                        CICIA.CDCIA = C.CDCIA AND                                      
                                        CICIA.DTCICLOCIA = P_DATA AND
                                        CIS.CDFILIAL IS NULL AND /*somente se nao tiver por servico*/
                                        CIC.CDFILIAL IS NULL AND /*somente se nao tiver por classe*/
                                        CIV.CDFILIAL IS NULL /*somente se nao tiver por voos*/
   WHERE C.CDFILIAL = P_CDFILIAL
     AND C.CDCIA = P_CDCIA;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       V_CDCICLO := NULL;
   END;
   RETURN V_CDCICLO;
END;

/