CREATE OR REPLACE FUNCTION FN_CODIGO_GENERA(P_NOMBRE IN VARCHAR2)
RETURN VARCHAR2
IS
V_RES VARCHAR2(100) :='';
V_PALABRA VARCHAR2(100);
V_POS INT;
V_LAST_POS INT:=0;
V_INDEX INT:=0;
-- COLECCION DE VALORES, UNO PARA CADA PALABRA QUE ENCONTREMOS
TYPE COL_ARRAY IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
COL_PALABRAS COL_ARRAY;
BEGIN
-- VAMOS A CREAR UN REGISTRO PARA CADA PALABRA EN NUESTRA COLECCION, BUSCANDO LOS ESPACIOS CORRESPONDIENTES
V_POS := INSTR(P_NOMBRE, ' ');
-- SI NO ENCONTRAMOS NINGUN ESPACIO, SIGNIFICA QUE SOLAMENTE HAY UNA PALABRA
IF V_POS = 0 THEN
V_RES := SUBSTR(P_NOMBRE,1,3);
RETURN V_RES;
END IF;
-- SI HAY ALGUN ESPACIO VAMOS A DESCOMPONER CADA PALABRA EN NUESTRA COLECCION
WHILE V_POS != 0 LOOP
V_INDEX := V_INDEX + 1;
V_POS := INSTR(P_NOMBRE, ' ', V_LAST_POS+1);
-- VERIFICAR QUE NO SEA LA ULTIMA PALABRA
IF V_POS != 0 THEN
V_PALABRA := SUBSTR(P_NOMBRE, V_LAST_POS+1, V_POS-V_LAST_POS-1);
ELSE
V_PALABRA := SUBSTR(P_NOMBRE, V_LAST_POS+1, LENGTH(P_NOMBRE)-V_LAST_POS);
END IF;
COL_PALABRAS(V_INDEX) := V_PALABRA;
V_LAST_POS := V_POS;
END LOOP;
-- AHORA QUE TENEMOS CADA PALABRA SEPARADA EN LA COLECCION, PODEMOS HACER REFERENCIA A ELLAS SEGUN LAS REGLAS QUE REQUIERAS
-- EN ESTE CASO ESPECIFICO, ESTAMOS CONCATENANDO LAS DOS PRIMERAS LETRAS DE LA PRIMERA PALABRA
-- Y LAS DOS PRIMERAS LETRAS DE LA TERCERA PALABRA, EN EL ENTENDIDO QUE LA SEGUNDA PALABRA SIEMPRE ES LA LETRA "Y"
V_RES := SUBSTR(COL_PALABRAS(1),1,2) || SUBSTR(COL_PALABRAS(3),1,2);
-- DEVOLVER EL RESULTADO DE LA FUNCION
RETURN V_RES;
END FN_CODIGO_GENERA;