create or replace FUNCTION LISTA_ALERGENICO (
    P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
    P_CDSERVFILI   IN SERVICO.CDSERVFILI%TYPE,
    P_CDFILAUXPRAT IN PRATO.CDFILAUXPRAT%TYPE,
    P_CDPRATO      IN PRATO.CDPRATO%TYPE,
    P_IDALERGENICO IN VARCHAR2 DEFAULT 'SIGLA',    
    P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE DEFAULT NULL
) RETURN VARCHAR2 IS

V_SGALERGENICO VARCHAR2(4000);
V_ALERGENICO_I VARCHAR2(4000);
BEGIN
   V_SGALERGENICO := '';
   IF P_CDPRODUTO IS NOT NULL THEN /* RETORNA OS ICONES DO ALERGENICO DO PRODUTO CONCATENADOS COM _ E AS SIGLAS DOS ALERGENICOS COM - */
      SELECT '_'||ICONES||'_' AS ICONES, SGALERGENICO
        INTO V_ALERGENICO_I, V_SGALERGENICO
        FROM (SELECT DISTINCT LISTAGG(A.DSICONE, '_') WITHIN GROUP (ORDER BY A.DSICONE) "ICONES",
                     LISTAGG(A.SGALERGENICO, ' - ') WITHIN GROUP (ORDER BY A.SGALERGENICO) "SGALERGENICO"
                FROM ALERGENICOPROD AL, ALERGENICO A
               WHERE A.NRALERGENICO = AL.NRALERGENICO AND AL.CDPRODUTO = P_CDPRODUTO);

   ELSE
      SELECT LISTAGG(DSICONE, '_') WITHIN GROUP (ORDER BY DSICONE) "ICONES" , 
             LISTAGG(SGALERGENICO, ' - ') WITHIN GROUP (ORDER BY SGALERGENICO) "SGALERGENICO" /* RETORNA OS ICONES DO ALERGENICO DO PRATO CONCATENADOS COM _ E AS SIGLAS DOS ALERGENICOS COM - */
        INTO V_ALERGENICO_I, V_SGALERGENICO
        FROM (SELECT DISTINCT DSICONE, SGALERGENICO
                FROM (SELECT RS.CDPRODUTO
                        FROM RECESERV RS
                       WHERE RS.CDFILIAL = P_CDFILIAL AND RS.CDSERVFILI = P_CDSERVFILI AND RS.CDFILAUXPRAT = P_CDFILAUXPRAT AND RS.CDPRATO = P_CDPRATO
                      UNION ALL
                      SELECT RF.CDPRODUTO
                        FROM RECEFILI RF
                       WHERE RF.CDFILIAL = P_CDFILIAL AND RF.CDFILAUXPRAT = P_CDFILAUXPRAT AND RF.CDPRATO = P_CDPRATO AND 
                             NOT EXISTS (SELECT S.CDPRODUTO
                                           FROM RECESERV S
                                          WHERE S.CDFILIAL = P_CDFILIAL AND S.CDSERVFILI = P_CDSERVFILI AND S.CDFILAUXPRAT = P_CDFILAUXPRAT AND S.CDPRATO = P_CDPRATO)
                      UNION ALL
                      SELECT RP.CDPRODUTO 
                        FROM RECEPADR RP
                       WHERE RP.CDFILAUXPRAT = P_CDFILAUXPRAT AND RP.CDPRATO = P_CDPRATO AND 
                             NOT EXISTS (SELECT SS.CDPRODUTO
                                           FROM RECESERV SS 
                                          WHERE SS.CDFILIAL = P_CDFILIAL AND SS.CDSERVFILI = P_CDSERVFILI AND SS.CDFILAUXPRAT = P_CDFILAUXPRAT AND SS.CDPRATO = P_CDPRATO) AND 
                             NOT EXISTS (SELECT F.CDPRODUTO 
                                           FROM RECEFILI F
                                          WHERE F.CDFILIAL = P_CDFILIAL AND F.CDFILAUXPRAT = P_CDFILAUXPRAT AND F.CDPRATO = P_CDPRATO)
                     ) R, ALERGENICOPROD AL, ALERGENICO A
               WHERE A.NRALERGENICO = AL.NRALERGENICO AND AL.CDPRODUTO = R.CDPRODUTO
            );
   END IF;   
   RETURN CASE WHEN P_IDALERGENICO = 'ICONE' THEN '_'||V_ALERGENICO_I||'_' ELSE V_SGALERGENICO END;
END;
/