هل من الممكن أن تشير إلى أسماء الأعمدة عبر المتغيرات ربط في أوراكل؟

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

سؤال

وأنا أحاول أن أشير إلى اسم عمود لطلب استعلام في تطبيق التواصل مع قاعدة بيانات أوراكل. أريد أن استخدام متغير مأزق بحيث يمكنني تغيير حيوي ما للنظام الاستعلام بواسطة.

والمشكلة أن أواجه هو أن قاعدة البيانات ويبدو أن تجاهل النظام عن طريق العمود.

لا أحد يعرف إذا كان هناك طريقة معينة للإشارة إلى عمود قاعدة البيانات عن طريق متغير ربط أو إذا كان من الممكن حتى؟

ومنها مثلا بلدي الاستعلام

SELECT * FROM PERSON ORDER BY :1

و(حيث سوف تكون ملزمة :1 إلى PERSON.NAME) الاستعلام لا تعود النتائج حسب الترتيب الأبجدي، وأنا أخشى أن قاعدة البيانات تفسير هذا على النحو التالي: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

والتي من الواضح لا تعمل.

وهي موضع تقدير أي اقتراحات من ذلك بكثير.

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

المحلول

ولا. لا يمكنك استخدام المتغيرات ربط لجدول أو عمود أسماء.

وهذه المعلومات ضرورية لإنشاء خطة التنفيذ. دون معرفة ما كنت تريد أن تأمر من قبل، سيكون من المستحيل معرفة ما مؤشر الاستخدام، على سبيل المثال.

وبدلا من المتغيرات مأزق، عليك أن أقحم مباشرة اسم العمود في عبارة SQL عندما يقوم البرنامج الخاص به. على افتراض أن لاتخاذ الاحتياطات اللازمة ضد حقن SQL، ليس هناك الجانب السلبي لذلك.

<القوي> تحديث: إذا كنت تريد حقا أن القفز من خلال الأطواق، هل يمكن أن ربما لا شيء من هذا القبيل

order by decode(?, 'colA', colA, 'colB', colB)

ولكن هذا هو مجرد سخيفة. وبطيئة. لا.

نصائح أخرى

وكما كنت تستخدم JDBC. يمكنك إعادة كتابة التعليمات البرمجية الخاصة بك إلى شيء بدون المتغيرات مأزق. وبهذه الطريقة يمكنك أيضا حيوي تغيير ترتيب من قبل منها مثلا:

    String query = "SELECT * FROM PERS ";
    if (condition1){
      query = query+ " order by name ";
    // insert more if/else or case statements
    } else {
      query = query+ " order by other_column ";
    }
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery(query);

وأو حتى

    String columnName = getColumnName(input);
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery("SELECT * FROM PERS ORDER BY "+columnName);

وresultset والنتيجة = select.executeQuery ( "SELECT * FROM PERS ORDER BY" + اسم العمود)؛

وسوف يكون دائما وبيان جديد إلى قاعدة البيانات. هذا يعني أنه غير، مثل تيلو سبق شرحه، من المستحيل أن "إعادة ترتيب" وملزمة بالفعل، وتحسب، أعد، بيان تحليل. عند استخدام هذه مجموعة النتائج أكثر وأكثر في التطبيق الخاص بك، والشيء الوحيد الذي يتغير مع مرور الوقت وترتيب العرض، في محاولة لترتيب مجموعة في رمز العميل الخاص بك. خلاف ذلك، SQL ديناميكية على ما يرام، ولكن يأتي مع بصمة كبيرة.

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