CREATE OR REPLACE FUNCTION MASCARA_PRODUTO(
        P_CDARVPROD IN PRODUTO.CDARVPROD%TYPE) RETURN VARCHAR2
AS
   V_MASCARADO VARCHAR2(30);
   V_SIMBOLO   VARCHAR2(1);
   V_INI       NUMBER;
   V_QTDIGITO  NUMBER;
   V_RECORTE   VARCHAR2(30);
BEGIN
   V_MASCARADO := NULL;
   V_INI := 1;

   FOR C_NIVEIS IN (SELECT length(REGEXP_SUBSTR(CDPICTPROD,'[^.]+', 1, LEVEL)) AS TAMMASCARA, ROWNUM FROM PARAMGERAL
                    CONNECT BY REGEXP_SUBSTR(CDPICTPROD, '[^.]+', 1, LEVEL) IS NOT NULL)
   LOOP
      V_QTDIGITO := C_NIVEIS.TAMMASCARA;

      IF V_MASCARADO IS NULL THEN
         V_SIMBOLO := '';
      ELSE
         V_SIMBOLO := '.';
      END IF;

      V_RECORTE := SUBSTR(P_CDARVPROD, V_INI, V_QTDIGITO);

      IF V_RECORTE IS NULL THEN
         V_MASCARADO  := V_MASCARADO;
         GOTO END_LOOP;
      ELSE
         V_MASCARADO  := V_MASCARADO||V_SIMBOLO||SUBSTR(P_CDARVPROD, V_INI, V_QTDIGITO);
      END IF;

      V_INI := V_INI+V_QTDIGITO;
   END LOOP;
   <<END_LOOP>>
   NULL; -- evitar erro de GOTO
   RETURN V_MASCARADO;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('MASCARA_PRODUTO','6.45.016'); END;
/
