CREATE OR REPLACE FUNCTION NIVEL_ANTERIOR(P_MASCARA VARCHAR2, 
                        P_CAMPO VARCHAR2) RETURN VARCHAR2
AS
   V_MASCARA_SEM_SEP VARCHAR2(20);
   V_COD_NIVEL VARCHAR2(20);
   V_COD_NIVEL_ANT VARCHAR2(20);
   V_TAM_MASCARA NUMBER;
   V_TAM_CAMPO NUMBER;
   V_POS_CAMPO NUMBER;
   V_DIGITO VARCHAR2(1);   
BEGIN   
   IF(P_MASCARA IS NOT NULL AND P_CAMPO IS NOT NULL) THEN

      V_MASCARA_SEM_SEP := REPLACE(P_MASCARA, '.', '');
      V_TAM_MASCARA := LENGTH(V_MASCARA_SEM_SEP);
      V_TAM_CAMPO := LENGTH(P_CAMPO);
      IF V_TAM_MASCARA - V_TAM_CAMPO < 0 THEN
         RETURN NULL;
      END IF;

      V_TAM_MASCARA := LENGTH(P_MASCARA);

      V_COD_NIVEL_ANT := '';
      V_COD_NIVEL := '';   
      V_POS_CAMPO := 1;      
      V_DIGITO := '';
      FOR I IN 1..V_TAM_MASCARA LOOP
         IF V_POS_CAMPO > V_TAM_CAMPO THEN
            EXIT;
         END IF;         
         V_DIGITO := SUBSTR(P_MASCARA, I, 1);
         IF(V_DIGITO = '.') THEN            
            V_COD_NIVEL_ANT := V_COD_NIVEL_ANT || V_COD_NIVEL;
            V_COD_NIVEL := '';
         ELSE
            V_COD_NIVEL := V_COD_NIVEL || SUBSTR(P_CAMPO, V_POS_CAMPO, 1);
            V_POS_CAMPO := V_POS_CAMPO + 1;
         END IF; 
      END LOOP;
      RETURN V_COD_NIVEL_ANT;
   END IF;

   RETURN NULL;
END;