Oracle10 و JDBC:كيفية جعل شار تجاهل مسافات زائدة في المقارنة?

StackOverflow https://stackoverflow.com/questions/603245

  •  03-07-2019
  •  | 
  •  

سؤال

لدي استعلام يحتوي

...حيث PRT_STATUS='الديوان' ...

على prt_status مجال بأنها شار(5) على الرغم من.لذلك دائما مبطن مع المساحات.الاستعلام المباريات لا نتيجة.لجعل هذا الاستعلام علي أن أعمل

...حيث وrtrim(PRT_STATUS)='الديوان'

التي لا تعمل.

هذا مزعج.

في نفس الوقت بضع نقية جافا DBMS العملاء (أوراكل SQLDeveloper و AquaStudio) أنا لم يكن لديك مشكلة مع الاستعلام الأول ، يعودون النتيجة الصحيحة.الضفدع لا يوجد لديه أي مشكلة.

أفترض أنها ببساطة الاتصال في وضع التوافق (مثلا ، ANSI) ، وبالتالي فإن أوراكل يعلم أن شار(5) من المتوقع أن يكون مقارنة مع أي احترام أحرف زائدة.

كيف يمكن أن أفعل ذلك مع كائنات الاتصال أحصل طلبي ؟

التحديث لا أستطيع تغيير مخطط قاعدة البيانات.

الحل كان في الواقع الطريقة أوراكل يقارن المجالات مع مرت في المعلمات.

عندما يتم ربط السلسلة يتم تمريرها عبر PreparedStatement.setString () ، الذي يحدد نوع VARCHAR ، وبالتالي أوراكل يستخدم العدد المقارنة-و فشل.

حاولت استخدام setObject(n,str,أنواع.شار).يفشل.وبتفريغ يدل على أن أوراكل يتجاهل شار ويمررها في VARCHAR مرة أخرى.

البديل الذي يعمل في نهاية المطاف هو

setObject(n,str,OracleTypes.FIXED_CHAR);

يجعل القانون ليس المحمولة على الرغم من.

واجهة المستخدم العملاء تنجح لسبب مختلف -- يستخدمون حرف حرفية غير ملزمة.عندما كنت اكتب PRT_STATUS='الديوان', 'الديوان' هو الحرفي ، مقارنة باستخدام مبطن الطريق.

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

المحلول

علما بأن أوراكل يقارن CHAR القيم باستخدام فارغة مبطن مقارنة دلالات.

من نوع البيانات المقارنة القواعد,

أوراكل يستخدم فارغة مبطن المقارنة دلالات فقط عند كل القيم في المقارنة إما عبارات نوع البيانات CHAR, NCHAR نصية حرفية, أو القيم التي يتم إرجاعها من قبل المستخدم وظيفة.

في المثال الخاص بك ، 'ONT' مرت كما تربط المعلمة أم أنها بنيت في الاستعلام حرفيا ، كما يتضح?إذا ربط المعلمة, ثم تأكد من أنه لا بد كنوع CHAR.وإلا التحقق من العميل مكتبة النسخة المستخدمة ، حقا الإصدارات القديمة من أوراكل (مثلا ، v6) مختلفة مقارنة دلالات على CHAR.

نصائح أخرى

إذا كان لا يمكنك تغيير جدول قاعدة البيانات ، يمكنك تعديل الاستعلام الخاص بك.

بعض البدائل وRTRIM:

..حيث PRT_STATUS مثل 'ONT%' ...

..حيث PRT_STATUS = 'الديوان' ...-- 2 المساحات البيضاء خلف T

..حيث PRT_STATUS = rpad('الديوان',5,' ') ...

وأود أن تغيير شار(5) عمود في varchar2(5) في ديسيبل.

يمكنك استخدام الزهر إلى شار العملية في الاستعلام الخاص بك:

... WHERE PRT_STATUS=cast('ONT' as char(5))

أو في أكثر عمومية JDBC الطريقة:

... WHERE PRT_STATUS=cast(? as char(5))

ثم في JDBC رمز لا تستخدم statement.setString(1, "ONT");

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