أوراكل تنفيذ فوري مع عدد متغير من يربط ممكن ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

هل هناك طريقة لاستخدام عدد متغير من المتغيرات ربط في الدعوة إلى EXECUTE IMMEDIATE بطريقة أو بأخرى ؟

وبشكل أكثر تحديدا, لا تحتاج إلى تمرير واحد المعلمة إلى المجهول SQL ولكن أنا لا أعرف كيف في كثير من الأحيان أنها سوف تستخدم هناك.

حاولت شيئا مثل

EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;

لكنه رمى الظهر مع ORA-01008: not all variables bound.

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

المحلول

لا يمكنك أن تفعل هذا مع EXECUTE IMMEDIATE.ومع ذلك ، يمكنك القيام بذلك باستخدام أوراكل DBMS_SQL الحزمة.على قاعدة بيانات دليل التطبيق المطور وقد المقارنة بين EXECUTE IMMEDIATE كنت على دراية ، dbms_sql الأساليب. هذه الصفحة الوثائق DBMS_SQL, ولكن لديه بعض الأمثلة (الرابط أعلاه) التي ينبغي أن تحصل فقط (على سبيل المثال 1 حالة بسيطة من تشغيل بيان أن يمكن أن يكون عدد التعسفي من ربط المتغيرات). DBMS_SQL هو الكثير أكثر تعقيدا من منظور الترميز ، ولكنها سوف تسمح لك أن تفعل أي شيء يمكنك تصور.

مثيلات متعددة من ربط متغير تحدث في SQL مسموح بها.ولكن عليك أن تعرف اسم التي تربط المتغير (مثلا ، :فار في هذه الحالة) من أجل تمرير إلى DBMS_SQL.BIND_VARIABLE.

نصائح أخرى

يمكنك أيضا حل هذه المشكلة عن طريق استخدام WITH البيان.عموما باستخدام DBMS_SQL هو أفضل, ولكن في بعض الأحيان هذا هو أبسط طريقة:

BEGIN
    EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;

هذا موضوع على AskTom يغطي هذا الموضوع في التفاصيل.

في حالة إذا كنت تريد تمرير معلمة واحدة أو لا شيء, هل يمكن بناء اثنين من الاستفسارات التي قد معلمة واحدة و في واحدة من هذه الاستعلام لم يتم استخدامه (i-e المسند صحيح دائما) مثل هذا:

-- query1
SELECT * FROM DUAL WHERE dummy = :x;

-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;

ربما يمكنك صقل المسند بحيث محسن سوف تفهم أنه هو دائما صحيح.

وبشكل أكثر تحديدا, لا تحتاج إلى تمرير معلمة واحدة إلى المجهول SQL ولكن أنا لا أعرف كيف في كثير من الأحيان أنها سوف تستخدم هناك.

في الحقيقة أنا واجهت نفس المشكلة قبل يومين ، صديق مشترك معي طريقة للقيام بذلك بالضبط مع EXECUTE IMMEDIATE.

فإنه ينطوي على توليد PLSQL كتلة مقابل SQL كتلة نفسها.عند استخدام EXECUTE IMMEDIATE مع كتلة من PLSQL البرمجية ، يمكنك ربط المتغيرات بالاسم بدلا من مجرد موقف.

تحقق من بلدي على سبيل المثال/رمز على نفسي مثل هذا السؤال/الجواب الموضوع:

يمكن للمرء أن استخدام dbms_sql مثل ستيف Broberg شرح ولكن الناتجة المؤشر لا يمكن أن تستهلك (اقرأ) في الكثير من العملاء.أوراكل 11 قد أضاف وظيفة التحويل (dbms_sql.to_refcursor) الذي يجعل من الممكن تحويل dbms_sql المؤشر إلى المرجع المؤشر ولكن لسبب ما لا يمكن للمرء أن تستهلك هذه تحويلها المرجع المؤشر في .صافي التطبيق.يمكن للمرء أن تستهلك العادية المرجع المؤشر في .صافي ولكن ليس المرجع المؤشر الذي اعتادت ان تكون dbms_sql المؤشر.

لذلك أي نوع من العميل سيتم استهلاك هذا المؤشر?

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