CREATE FUNCTION Obtener_Nif( num NUMBER ) RETURN VARCHAR2 IS
numero NUMBER
resultado VARCHAR2
BEGIN
numero := 23
resultado= num || substr( 'TRWAGMYFPDXBNJZSQVHLCKET' , MOD(num, numero)+1,1)
end Obtener_Nif
return(resultado)
WHEN NO_DATA_FOUND THEN
return '0'
END
Hola,
El código tiene varios problemas de sintaxis, no es solo uno. Vamos por partes, comparando con la versión corregida:
CREATE OR REPLACE FUNCTION Obtener_Nif(num NUMBER) RETURN VARCHAR2 IS
numero NUMBER := 23;
resultado VARCHAR2(50);
BEGIN
resultado := TO_CHAR(num) || SUBSTR('TRWAGMYFPDXBNJZSQVHLCKET', MOD(num, numero) + 1, 1);
RETURN resultado;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '0';
END Obtener_Nif;
/
Los fallos concretos que tenía el original:
1. Faltan los ; al final de cada declaración y sentencia. En PL/SQL cada declaración de variable y cada instrucción dentro de BEGIN...END necesita su punto y coma, sin excepción.
2. resultado VARCHAR2 sin longitud. Para variables locales (a diferencia del tipo de retorno de la función, que sí puede ir sin longitud), VARCHAR2 necesita un tamaño explícito, por ejemplo VARCHAR2(50).
3. resultado= num en vez de resultado := num. La asignación en PL/SQL es :=, no = a secas (ese se reserva para comparaciones).
4. Concatenar un NUMBER con || sin convertirlo primero. num es NUMBER y lo estás concatenando con un resultado de tipo texto. Oracle a veces hace la conversión implícita, pero es frágil y depende de la configuración regional de la sesión: mejor convertir explícitamente con TO_CHAR(num).
5. El END Obtener_Nif estaba antes del RETURN y del manejo de la excepción. El orden correcto es: cuerpo de la función, RETURN con el resultado, después el bloque EXCEPTION (si hace falta), y END siempre al final de todo.
6. Faltaba la palabra clave EXCEPTION antes de WHEN NO_DATA_FOUND. Sin ella, PL/SQL no sabe que ese bloque es un manejador de excepciones, es sintaxis obligatoria para empezar esa sección.
Con estos seis cambios el bloque debería compilar sin errores. Si al ejecutar CREATE OR REPLACE te sigue marcando algún error, mira el resultado de SHOW ERRORS justo después, te da el número de línea exacto del problema.
Un saludo,
David Carrero