Je ne peux pas comprendre pourquoi cela me donne une erreur 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 la structure de la table où l'insert est fabriqué:
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
)
ORA-06512 fait partie de la pile d'erreurs. Il nous donne le numéro de ligne où l'exception s'est produite, mais pas la cause de l'exception. Cela est généralement indiqué dans le reste de la pile (que vous n'avez toujours pas publié).
Dans un commentaire tu as dit
"encore, l'erreur vient quand pNum n'est pas entre 12 et 14; quand pNum est entre 12 et 14 il n'échoue pas"
Eh bien, votre code fait ceci:
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
Autrement dit, il déclenche une exception lorsque pNum n'est pas compris entre 12 et 14. Le reste de la pile d'erreurs inclut-il donc cette ligne?
ORA-06510: PL/SQL: unhandled user-defined exception
Si c'est le cas, il vous suffit 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;
La documentation couvre la gestion détaillée des exceptions PL/SQL.
La variable pCv est de type VARCHAR2, donc lorsque vous concatérez l'insert, vous ne le mettez pas entre guillemets simples:
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';
De plus, l'erreur ORA-06512 se déclenche lorsque vous essayez d'insérer une valeur trop grande dans une colonne. Vérifiez la définition de la table M_pNum_GR et les paramètres que vous envoyez. Juste pour clarifier si vous essayez d'insérer la valeur 100 dans un champ NUMERIC (2), l'erreur augmentera.
J'ai également eu la même erreur. Dans mon cas, la raison était que j'avais créé un déclencheur de mise à jour sur une table et sous ce déclencheur, je mettais à jour à nouveau la même table. Et lorsque j'ai supprimé la déclaration de mise à jour du déclencheur, mon problème a été résolu.