web-dev-qa-db-fra.com

Erreur Oracle ORA-06512

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
)
5
Tililin Tin Tin

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.

30
APC

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.

1

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.

0
Ibrahim Danisg