كيف يمكنني معرفة ما إذا كان الرقم 10385274000 يناسب:رقم (10) لأوراكل؟
سؤال
لقد كنت أعمل طوال الأسبوع لإصلاح خطأ في الإنتاج.
لقد وصلت أخيرًا إلى النقطة التي يمكنني من خلالها العثور على السجل المذنب الذي يسبب كل هذه الفوضى.
لقد حصلت على رسالة الخطأ التالية:
java.sql.SQLException: [BEA][Oracle JDBC Driver][Oracle]ORA-01438: value larger than specified precision allows for this column
في نهاية المطاف، من جميع المعلومات التي أعتقد أنها قد تكون بيانات خاطئة، يحاول النظام إدراج:
10385274000
في رقم (10)
كيف يمكنني معرفة ما إذا كانت هذه القيمة مناسبة أم لا؟
شكرًا لك
يحرر
وفقًا لاقتراح ميشيل تود:
create table xyz( testfield number( 10 ) );
insert into xyz values( 10385274000 )
Error: ORA-01438: value larger than specified precision allowed for this column
شكرا يا شباب!!!
شكرًا لك على تدفق المكدس
يحرر
ملاحظات لنفسي (حتى لا أنسى ما هي المشكلة)
كان لدي منتج Oracle هذا الذي يخزن في جدول قاعدة البيانات وقت الحدث
START_TIME|END_TIME
اتضح أنه يقوم كل ليلة بنسخ هذه المعلومات احتياطيًا في جدول آخر ولكنه يقوم بإجراء عملية trnsformation في هذه العملية.يتم تخزينه على النحو التالي:
TOTALTIME
تأتي المشكلة عندما يتم حساب هذا الحقل عن طريق طرح ENDTIME - STARTTIME.يتم تخزين الرقم الناتج في هذا العمود الذي تم تعريفه على النحو التالي: رقم 10)
حسنًا، اتضح أنه إذا كان END_TIME-START_TIME بعيدًا جدًا في الوقت (حوالي 4 أشهر أو نحو ذلك) فإن القيمة (بالمللي ثانية) ستكون كبيرة جدًا ولن تتناسب مع العمود المستهدف (أعتقد أنه يحتوي على شيء مثل endTime .getTime() - startTime.getTime() داخل الكود)
كل هذا يبدو سهلاً للغاية وسخيفًا للغاية الآن، لكن الأمر استغرق مني 4 أيام+ لمعرفة ذلك، لأنه نظرًا لأن هذا تطبيق مغلق، لم يكن لدي أدنى فكرة عما كان يحدث، والشيء الوحيد الذي حصلت عليه هو تتبع المكدس.
اضطررت إلى إجراء هندسة عكسية (بالمعنى القديم للكلمة، يدويًا ومن الواضح بدون المصدر) للعملية برمتها لاكتشاف ذلك.
عندما فعلت ذلك، حصلت على نفس الخطأ في "برنامج الترحيل المشفر يدويًا" الخاص بي ومعرفة كيفية حله!
المحلول
يحدد الرقم 10 في NUMBER(10) حجم الحقل.وهذا يعني أن الحقل يمكن أن يحتوي على رقم يصل طوله إلى 10 أحرف.يتكون رقمك من 11 رقمًا، وبالتالي تكون القيمة كبيرة جدًا لتناسبها.أي شيء أصغر من (<) 10 مليار (10,000,000,000) يمكن إدخاله دون مشاكل.هذا ما تحتاج إلى التحقق منه إذا كنت تريد التحقق من صحة القيمة قبل الإدراج.