Pregunta

Simplemente no puedo entender por qué me da un error ORA-06512

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;
END PX;

La base de estructura para la tabla donde se realiza el inserto:

CREATE TABLE "DB"."M12GR" (
    "IDM12GR" NUMBER(10,0) NOT NULL ENABLE, 
    "CV" VARCHAR(5) NOT NULL ENABLE, 
    "SUP" FLOAT(126) NOT NULL ENABLE, 
    "IDM12" NUMBER(10,0) NOT NULL ENABLE, 

    CONSTRAINT "PRIMARY_30" PRIMARY KEY ("IDM12GR"),
    CONSTRAINT "M12SUELORM12" FOREIGN KEY ("IDM12") REFERENCES "DB"."M12" ("IDM12") ENABLE
)
¿Fue útil?

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 se produce cuando PNUM no está entre 12 y 14; cuando PNUM está entre 12 y 14, no falla"

Bueno, tu código hace esto:

IF ((pNum < 12) OR (pNum > 14)) THEN     
    RAISE vSOME_EX;

Es decir, plantea 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.

Otros consejos

La variable PCV es de tipo varchar2, por lo que cuando concatora el inserto, no lo coloca dentro de cotizaciones individuales:

 EXECUTE IMMEDIATE  'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';

Además, el error ORA-06512 aumenta 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), el error aumentará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top