No olvides que en las ciencias cualquier problema casi siempere puede tener diversas resoluciones, por lo tanto te compartimos lo más óptimo y mejor.
Solución:
ORA-06512 es parte de la pila de errores. Nos da el número de línea donde ocurrió la excepción, pero no la causa de la excepción. Eso generalmente se indica en el resto de la pila (que aún no ha publicado).
en un comentario dijiste
“aún así el error viene cuando pNum no esta entre 12 y 14; cuando pNum esta entre 12 y 14 no falla”
Bueno, tu código hace esto:
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
Es decir, genera una excepción cuando pNum no está entre 12 y 14. Entonces, ¿el resto de la pila de errores incluye esta línea?
ORA-06510: PL/SQL: unhandled user-defined exception
Si es así, todo lo que necesita hacer es agregar un bloque de excepción para manejar el error. Quizás:
PROCEDURE PX(pNum INT,pIdM INT,pCv VARCHAR2,pSup FLOAT)
AS
vSOME_EX EXCEPTION;
BEGIN
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
ELSE
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('||pCv||', '||pSup||', '||pIdM||')';
END IF;
exception
when vsome_ex then
raise_application_error(-20000
, 'This is not a valid table: M'||pNum||'GR');
END PX;
La documentación cubre el manejo de excepciones PL/SQL en profundidad.
- Saber más.
La variable pCv es de tipo VARCHAR2, por lo que cuando concatena la inserción, no la coloca entre comillas simples:
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';
Además, aparece el error ORA-06512 cuando intenta insertar un valor demasiado grande en una columna. Verifique la definición de la tabla M_pNum_GR y los parámetros que está enviando. Solo para aclarar, si intenta insertar el valor 100 en un campo NUMÉRICO (2), aparecerá el error.
Comentarios y calificaciones del artículo
Si para ti ha resultado de utilidad nuestro artículo, sería de mucha ayuda si lo compartieras con otros juniors y nos ayudes a extender este contenido.