web-dev-qa-db-fra.com

ORA-01438: la valeur supérieure à la précision spécifiée autorise cette colonne

Nous obtenons parfois l'erreur suivante de la base de données de notre partenaire:

<i>ORA-01438: value larger than specified precision allows for this column</i>

La réponse complète ressemble à ceci:

<?xml version="1.0" encoding="windows-1251"?>
<response>
  <status_code></status_code>
  <error_text>ORA-01438: value larger than specified precision allows for this column ORA-06512: at &quot;UMAIN.PAY_NET_V1_PKG&quot;, line 176 ORA-06512: at line 1</error_text>
  <pay_id>5592988</pay_id>
  <time_stamp></time_stamp>
</response>

Quelle peut être la cause de cette erreur?

11
user11104

Le nombre que vous essayez de stocker est trop grand pour le champ. Regardez la balance et la précision. La différence entre les deux correspond au nombre de chiffres devant la décimale que vous pouvez enregistrer.

select cast (10 as number(1,2)) from dual
             *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

select cast (15.33 as number(3,2)) from dual
             *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

Tout ce qui se trouve au bas est tronqué (en silence) 

select cast (5.33333333 as number(3,2)) from dual;
CAST(5.33333333ASNUMBER(3,2))
-----------------------------
                         5.33
9
Gary Myers

L'erreur ne semble pas être celle d'un champ de caractère, mais plutôt celle d'un champ numérique. (S'il s'agissait d'un problème de chaîne comme celui mentionné par WW, vous obtiendriez une "valeur trop grande" ou quelque chose de similaire.) Vous utilisez probablement plus de chiffres que ce qui est permis, par exemple 1.000000001 dans une colonne définie par le numéro (10,2).

Regardez le code source mentionné par WW pour déterminer quelle colonne peut être à l'origine du problème. Ensuite, vérifiez si possible les données qui y sont utilisées.

6
Thorsten

Cela indique que vous essayez de mettre quelque chose de trop gros dans une colonne. Par exemple, vous avez une colonne VARCHAR2 (10) et vous mettez 11 caractères. Même chose avec le nombre.

Cela se produit à la ligne 176 du package UMAIN. Vous devriez aller y jeter un coup d'œil pour voir ce qu'il en est. Espérons que vous pourrez le rechercher dans votre contrôle de code source (ou à partir de user_source). Les versions ultérieures d'Oracle signalent mieux cette erreur en vous indiquant quelle colonne et quelle valeur.

3
WW.

En plus des réponses précédentes, vous devriez noter qu’une colonne définie comme VARCHARS (10) stockera 10 octets et non 10 caractères à moins que vous ne la définissiez comme VARCHAR2 (10 CHAR).

[La question du PO semble être liée au nombre ... c'est juste au cas où quelqu'un d'autre aurait un problème similaire]

2
cagcowboy

De http://ora-01438.ora-code.com/ (la ressource définitive en dehors du support Oracle):

ORA-01438: valeur supérieure à la précision spécifiée autorisée pour cette colonne
Cause: lors de l'insertion ou de la mise à jour d'enregistrements, une valeur numérique supérieure à la précision définie pour la colonne a été entrée.
Action: entrez une valeur conforme à la précision de la colonne numérique ou utilisez l'option MODIFY avec la commande ALTER TABLE pour développer la précision.

http://ora-06512.ora-code.com/ :

ORA-06512: à la chaîne de caractères
Cause: un message de trace arrière en tant que pile est déroulé par des exceptions non gérées.
Action: résolvez le problème à l'origine de l'exception ou écrivez un gestionnaire d'exceptions pour cette condition. Ou vous devrez peut-être contacter votre administrateur d’application ou votre DBA.

1
warren

Un problème que j’ai eu, et c’est horriblement délicat, est que l’appel OCI pour décrire un attribut de colonne se comporte différemment selon les versions d’Oracle. Décrire une colonne NUMBER simple créée sans aucune précision ni échelle, renvoie différemment sur 9i, 1Og et 11g

1
Robert Gould

FYI: Les violations de taille de champ numérique donneront ORA-01438: valeur supérieure à la précision spécifiée autorisée pour cette colonne

Les violations de longueur de champ VARCHAR2 donneront ORA-12899: valeur trop grande pour la colonne ...

Oracle distingue les types de données de la colonne en fonction du code d'erreur et du message.

0
Priyome

Il peut être utile de définir des variables comme ci-dessous:

v_departmentid departments.department_id%TYPE;

PAS comme ci-dessous:

v_departmentid NUMBER(4)
0
gokhant