CREATE OR REPLACE FUNCTION fn_Separar_Nombre
(
   i_Nombre IN Char,
   i_LonPA  IN Number,
   i_LonSA  IN Number,
   i_LonPN  IN Number,
   i_LonSN  IN Number
)
RETURN CHAR
IS
   w_Pos1    Integer;
   w_Pos2    Integer;
   w_Pos3    Integer;
   w_Pri_Ape VarChar(20);
   w_Seg_Ape VarChar(20);
   w_Pri_Nom VarChar(20);
   w_Seg_Nom VarChar(20);
BEGIN
   w_Pos1 := InStr(i_Nombre, '/');
   w_Pos2 := InStr(SubStr(i_Nombre,w_Pos1+1,Length(i_Nombre)-w_Pos1), '/') + w_Pos1;
   w_Pos3 := InStr(SubStr(i_Nombre,w_Pos2+1,Length(i_Nombre)-w_Pos2), ' ') + w_Pos2;
   If w_Pos3 = w_Pos2 Then
      w_Pos3 := Length(i_Nombre);
   End If;
   SELECT Decode(w_Pos1, 1, RPad(' ',i_LonPA,' '), RPad(RTrim(SubStr(i_Nombre,1,w_Pos1-1)), i_LonPA, ' '))
   INTO w_Pri_Ape
   FROM DUAL;
   SELECT Decode(w_Pos2, w_Pos1+1, RPad(' ',i_LonSA,' '), RPad(RTrim(SubStr(i_Nombre,w_Pos1+1,w_Pos2-w_Pos1-1)), i_LonSA, ' '))
   INTO w_Seg_Ape
   FROM DUAL;
   SELECT Decode(w_Pos3, w_Pos2+1, RPad(' ',i_LonPN,' '), RPad(RTrim(SubStr(i_Nombre,w_Pos2+1,w_Pos3-w_Pos2)), i_LonPN, ' '))
   INTO w_Pri_Nom
   FROM DUAL;
   w_Seg_Nom := RPad(RTrim(SubStr(i_Nombre,w_Pos3 + 1,Length(i_Nombre)-w_Pos3)) || ' ', i_LonSN, ' ');
   RETURN(w_Pri_Ape || w_Seg_Ape || w_Pri_Nom || w_Seg_Nom);
END;
/
CREATE PUBLIC SYNONYM fn_Separar_Nombre FOR ADAM.fn_Separar_Nombre;
GRANT ALL ON fn_Separar_Nombre TO ADAMA;
