CREATE OR REPLACE FUNCTION MSG
(
P_CODIGO IN VARCHAR2,
P_PARAM00 IN VARCHAR2 DEFAULT NULL,
P_PARAM01 IN VARCHAR2 DEFAULT NULL,
P_PARAM02 IN VARCHAR2 DEFAULT NULL,
P_PARAM03 IN VARCHAR2 DEFAULT NULL,
P_PARAM04 IN VARCHAR2 DEFAULT NULL,
P_PARAM05 IN VARCHAR2 DEFAULT NULL,
P_PARAM06 IN VARCHAR2 DEFAULT NULL,
P_PARAM07 IN VARCHAR2 DEFAULT NULL,
P_PARAM08 IN VARCHAR2 DEFAULT NULL,
P_PARAM09 IN VARCHAR2 DEFAULT NULL,
P_PARAM10 IN VARCHAR2 DEFAULT NULL,
P_PARAM11 IN VARCHAR2 DEFAULT NULL,
P_PARAM12 IN VARCHAR2 DEFAULT NULL,
P_PARAM13 IN VARCHAR2 DEFAULT NULL,
P_PARAM14 IN VARCHAR2 DEFAULT NULL,
P_PARAM15 IN VARCHAR2 DEFAULT NULL,
P_PARAM16 IN VARCHAR2 DEFAULT NULL,
P_PARAM17 IN VARCHAR2 DEFAULT NULL,
P_PARAM18 IN VARCHAR2 DEFAULT NULL,
P_PARAM19 IN VARCHAR2 DEFAULT NULL,
P_PARAM20 IN VARCHAR2 DEFAULT NULL
)
RETURN VARCHAR2
AS
   V_MSG VARCHAR2(4000);
   V_INIMSG VARCHAR2(30);
   V_FIMMSG VARCHAR2(30);
   V_PARAMSEPARATOR VARCHAR2(30);
BEGIN
   V_INIMSG := '_MSGSTA_';
   V_FIMMSG := '_MSGEND_';
   V_PARAMSEPARATOR := '$$';

   IF P_CODIGO IS NOT NULL AND LENGTH(P_CODIGO) + LENGTH(V_INIMSG) + LENGTH(V_FIMMSG) <= 4000 THEN     
      
      V_MSG := V_INIMSG;

      V_MSG := V_MSG || P_CODIGO;

      IF P_PARAM00 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM00 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM00;
      END IF;
      IF P_PARAM01 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM01 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM01;
      END IF;
      IF P_PARAM02 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM02 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM02;
      END IF;
      IF P_PARAM03 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM03 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM03;
      END IF;
      IF P_PARAM04 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM04 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM04;
      END IF;
      IF P_PARAM05 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM05 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM05;
      END IF;
      IF P_PARAM06 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM06 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM06;
      END IF;
      IF P_PARAM07 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM07 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM07;
      END IF;
      IF P_PARAM08 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM08 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM08;
      END IF;
      IF P_PARAM09 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM09 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM09;
      END IF;
      IF P_PARAM10 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM10 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM10;
      END IF;
      IF P_PARAM11 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM11 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM11;
      END IF;
      IF P_PARAM12 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM12 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM12;
      END IF;
      IF P_PARAM13 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM13 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM13;
      END IF;
      IF P_PARAM14 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM14 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM14;
      END IF;
      IF P_PARAM15 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM15 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM15;
      END IF;
      IF P_PARAM16 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM16 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM16;
      END IF;
      IF P_PARAM17 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM17 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM17;
      END IF;
      IF P_PARAM18 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM18 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM18;
      END IF;
      IF P_PARAM19 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM19 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM19;
      END IF;
      IF P_PARAM20 IS NOT NULL AND (LENGTH(V_MSG) + LENGTH(V_PARAMSEPARATOR || P_PARAM20 || V_FIMMSG) <= 4000) THEN
         V_MSG := V_MSG || V_PARAMSEPARATOR || P_PARAM20;
      END IF;

      V_MSG := V_MSG || V_FIMMSG;
            
      RETURN V_MSG;
   END IF;
   RETURN NULL;
END;
/