Erreur Oracle ORA-06512
-
26-10-2019 - |
Question
Tout ne peut pas comprendre pourquoi il me donne ORA-06512 erreur
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 la structure de la table où l'insert est réalisé:
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
)
La solution
ORA-06512 fait partie de la pile d'erreurs. Il nous donne le numéro de ligne où l'exception est survenue, mais pas la cause de l'exception. Cela est généralement indiqué dans le reste de la pile (que vous avez pas encore posté).
Dans un commentaire que vous avez dit
"encore, l'erreur vient quand PNUM est pas entre 12 et 14, quand PNUM est compris entre 12 et 14, il ne manque pas "
Eh bien, votre code fait ceci:
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
C'est, elle soulève une exception lorsque PNUM n'est pas entre 12 et 14. Ainsi fait le reste de la pile d'erreur comprennent cette ligne?
ORA-06510: PL/SQL: unhandled user-defined exception
Si oui, tout ce que vous devez faire est d'ajouter un bloc d'exception pour gérer l'erreur. Peut-être:
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;
Les couvertures de documentation gestion des exceptions PL / SQL en profondeur.
Autres conseils
La RGC variable est de type VARCHAR2 donc quand vous concat l'insert vous ne mettez pas à l'intérieur des guillemets simples:
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';
En outre l'erreur de relance ORA-06512 lorsque vous essayez d'insérer une valeur trop importante dans une colonne. Vérifiez la definiton de la table M_pNum_GR et les paramètres que vous envoyez. Juste pour préciser si vous essayez d'insérer la valeur 100 sur un champ NUMERIC (2) l'erreur soulèvera.