CREATE OR REPLACE FUNCTION GETESCOPODESC (
P_NRSUBSCOMPMENU IN NUMBER,
P_IDNIVELESCOPO IN NUMBER,
P_NRORG IN NUMBER)
RETURN VARCHAR2
AS
V_RETURNSTR VARCHAR2(4000);
BEGIN
IF (P_IDNIVELESCOPO = 1) THEN
FOR ESCOPO IN (
  SELECT NMFILIAL AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN FILIAL FIL ON FIL.CDFILIAL = ESCP.CDFILIAL AND FIL.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

IF (P_IDNIVELESCOPO = 2) THEN
FOR ESCOPO IN (
  SELECT NMCIA AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN COMPANHIA CIA ON CIA.CDCIA = ESCP.CDCIA AND CIA.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

IF (P_IDNIVELESCOPO = 3) THEN
FOR ESCOPO IN (
  SELECT DSMANUAL AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN MANUALCIAM MAN ON MAN.CDFILIAL = ESCP.CDFILIAL
   AND MAN.CDCIA = ESCP.CDCIA
   AND MAN.CDMANCIA = ESCP.CDMANCIA
   AND MAN.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

IF (P_IDNIVELESCOPO = 4) THEN
FOR ESCOPO IN (
  SELECT DSSERVICOCIAFILI||' - '||SGCLASSE AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN SERVICOCIAFILI SCF ON SCF.CDFILIAL = ESCP.CDFILIAL
   AND SCF.CDCIA = ESCP.CDCIA
   AND SCF.NRSERVICOCIAFILI = ESCP.NRSERVICOCIAFILI
   AND SCF.NRORG = ESCP.NRORG
  JOIN CLASSE CLA ON CLA.CDCLASSE = ESCP.CDCLASSE AND CLA.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

IF (P_IDNIVELESCOPO = 5) THEN
FOR ESCOPO IN (
  SELECT DSSUBGRU AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN SUBGRUPOM SUB ON SUB.CDSUBGRU = ESCP.CDSUBGRU AND SUB.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

IF (P_IDNIVELESCOPO = 6) THEN
FOR ESCOPO IN (
  SELECT IDCICLO AS NOME FROM ESCOPOSUBSCOMPMENU ESCP
  JOIN CICLO CIC ON CIC.CDCICLO = ESCP.CDCICLO AND CIC.NRORG = ESCP.NRORG
  WHERE ESCP.NRSUBSCOMPMENU = P_NRSUBSCOMPMENU
    AND ESCP.IDNIVELESCOPO = P_IDNIVELESCOPO
    AND ESCP.NRORG = P_NRORG
  ORDER BY NOME
  ) LOOP
    IF (V_RETURNSTR IS NULL) THEN
      V_RETURNSTR := ESCOPO.NOME;
    ELSIF LENGTH(V_RETURNSTR||', '||ESCOPO.NOME) < 3997 THEN
      V_RETURNSTR := V_RETURNSTR||', '||ESCOPO.NOME;
    ELSIF (SUBSTR(V_RETURNSTR, -3) <> '...') THEN
      V_RETURNSTR := V_RETURNSTR||'...';
    END IF;
  END LOOP;
END IF;

RETURN V_RETURNSTR;
END;
/