سؤال

أنا أستخدم برنامج التشغيل الرقيق JDBC الخاص بـ Oracle (10.2.0.3) للاتصال بقاعدة بيانات Oracle 10g.أرغب في الحصول على معلومات حول أعمدة قاعدة البيانات، لذلك أستخدمها ResultSetMetaData.أهم المعلومات التي أحتاجها هي نوع العمود وطوله لذلك أستخدمه getColumnType, getPrecision, ، و getScale طُرق.

يعمل لاستعلام بسيط (select * from tablename) إذا كان نوع العمود "بسيطًا" مثل VARCHAR2(50), NUMBER(5), NUMBER(6,2).إذا كان لدي استعلام أكثر تعقيدًا (select count(*) from tablename) أو استعلام يستند إلى طريقة عرض تحتوي على بعض العمليات الحسابية المعقدة، فإن الطرق تعطي نتائج غريبة مثل:

  • getScale: -127
  • كلاهما getPrecision و getScale هو 0
  • getPrecision: -1

وضع oracle.jdbc.J2EE13Compliant خاصية الاتصال به true (كما هو مقترح من قبل العديد من صفحات الويب) يزيل getScale=-127 ولكنه لا يزال يُرجع نتيجة 0/0.

على الأرجح يجب أن أقوم بإنشاء حل بديل لهذه النتائج الغريبة، ولكن أولاً أحتاج على الأقل إلى وثائق شاملة حول سلوك ResultSetMetaData الخاص بـ Oracle.على سبيل المثال، سيكون الجدول الضخم الذي يحمل معنى getPrecision/getScale لجميع أنواع SQL أمرًا رائعًا.هل هناك وثائق مثل هذا في مكان ما؟

هل كانت مفيدة؟

المحلول

لا يمكن لـ Oracle إرجاع نوع بناءً على طريقة العرض أو count(*) لأنه لم يتم التصريح بذلك صراحة.يمكن أن يُرجع العرض الخاص بك أي دقة أو مقياس اعتمادًا على الجداول الأساسية للعرض.

للتغلب على ذلك، ستحتاج إلى إرسال النوع في استعلامك أو عرضه على النحو التالي:

select CAST (count(*) AS NUMBER(30))

نصائح أخرى

البديل هو الاستعلام user_tab_columns أو all_tab_columns.

مقياس 0 مقبول:الرقم (5) هو نفس الرقم (5،0)

ومع ذلك، يجب أن تكون الدقة عددًا صحيحًا بين 1 و38 عند تعريفها.عندما يكون غير محدد، كما في NUMBER، يجب على السائق إرجاع شيء ما لأنه لا يمكنه إرجاع قيمة فارغة.في هذه الحالة يختار السائق العودة 0.

يبدو لي أنه لا يوجد توثيق شامل حول ResultSetMetaData.دليل مطور Oracle® Database JDBC ومرجعه الإصدار 10g الإصدار 2 (10.2) و 11 جرام الإصدار 2 (11.2) يعطي مثالاً عن اسم العمود ونوعه هنا, ، ولا يتناولون الجوانب الأخرى.

كان لدى شخص ما مشكلة مماثلة مع PostgreSQL منذ سنوات وقام بإجراء تصحيح.ربما تستخدم Oracle نفس قاعدة التعليمات البرمجية هنا.

يمكنك محاولة استخدام الملف ojdbc14.jar بدلاً من ojdbc14.jar حيث تم تجميع فئاته باستخدام "javac -g" وتحتوي على بعض معلومات التتبع.

يمكنك أيضًا المحاولة أحدث السائقين.

يمكنك استخدام ال rs.getBigDecimal(columnIndex) ومن العلامة العشرية الكبيرة يمكنك الحصول على قيم الدقة/المقياس للأعمدة المحددة.

ليس ردًا مباشرًا على سؤالك، ولكن الحل البديل الذي ذكرته:

إذا كان كل ما عليك فعله هو التحقق من مخططات قاعدة البيانات أو مقارنتها، فبدلاً من ResultSetMetaData والاستعلام عن كافة الجداول، استخدم معلومات مخطط Oracle كما هو موضح في الهندسة العكسية لنموذج البيانات.لقد استخدمته في الأداة المساعدة الخاصة بي لتصدير هذه المعلومات إلى نص

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top