هل استخدام دالة جدول PL/SQL محددة داخل الأنابيب المسموح بها؟

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

سؤال

تشير مستندات الوظائف التي يتم تحديدها إلى أن DML غير مسموح بها عند استخدامها في عبارة SQL (عادةً SELECT) ، وفي معظم الأمثلة ، يتم استخدام وظائف الأنابيب لتوليد البيانات أو التحول (قبول CUSTOR كمعلمة) ، ولكن ليس إصدار أي بيانات DML.

الآن ، من الناحية الفنية ، من الممكن استخدام الاختيار دون أي خطأ من Oracle (أورا 14551 لن يحدث). ومع ذلك ، لدي تجارب سلوك غريب قابلة للتكرار من الاختيار ؛ بالرغم من PRAGMA AUTONOMOUS_TRANSACTION هو ليس يتم استخدامها ، الصفوف التي تم استردادها من قبل SELECT يبدو ليس دائما أخذ المعاملة المحلية الحالية في الاعتبار ، والتي تبدو وكأنها خطأ بالنسبة لي. والأكثر إثارة للقلق هو حقيقة أنه عند استخدام معاملة موزعة (على سبيل المثال عبر Oramts بدلاً من معاملة محلية) ، يتم استخدام المعاملة.

يحرر: كما اتضح ، يبدو التأثير الغريب مرتبطًا ببعض البيانات في الاستعلام ، والذي يعمل أحيانًا وأحيانًا لا (اعتمادًا على المزاج الحالي لمحسّن Oracle ، على الأقل في 10G). في بعض الحالات ، أحصل على ORA-32036 ، ثم مرة أخرى لا يحدث ، دون تغيير الرمز على الإطلاق. يبدو الآن كما لو أن الاستعلامات التي تفشل أحيانًا مع ORA-32036 هي تلك التي تفشل أيضًا في استخدام المعاملة الصحيحة ، وقد تكون غير مرتبطة بالوظيفة المحددة للأنابيب.

لذا فإن أسئلتي المحددة هي:

  • هل هناك أي بيان ، ويفضل أن يكون رسميًا ، ما إذا كان SELECTS في وظائف الجدول الأنابيب مسموح بها وما هو سياق المعاملات؟

  • هل هناك طريقة أخرى لتعديل الاستعلامات الشائعة الاستخدام التي يمكن استخدامها في عبارات SQL (تمامًا كما تستطيع وظائف الجدول مع TABLE())?

  • هل عانى أي شخص أيضًا من هذا السلوك وربما يعرف المزيد عن ذلك؟ لقد بحثت في Metalink ، لكن للأسف لم أجد أي شيء محدد حول هذا الموضوع.

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

المحلول

  1. عادةً ما تتعلق قيود DML فقط على تعديل التعديل (تحديث ، حذف ...) ، لذلك يجب أن يكون SELECT على ما يرام. سأحاول العثور على بيان محدد من Oracle.

  2. ستكون وجهات النظر هي أول أداة لك لتحويل الاستفسارات الشائعة الاستخدام.

  3. الوظائف لها عيب على طرق العرض: إذا تم استدعاؤها من اختيار آخر ، فلا يتم تنفيذها في نفس الوقت في الوقت المحدد. كل مكالمة إلى SELECT متسقة ولكن نظرًا لأن SELECT موجود في رمز الوظيفة وليس في SQL الرئيسي ، يمكنك إرجاع نتائج غير متسقة. هذا غير ممكن مع وجهات النظر والاختيار الفرعي: إذا استدعى بيان كبير عرضًا ، فسيتم تصميم العرض في نفس الوقت في الوقت الذي كان فيه الاستعلام الرئيسي.

تحديث: بخصوص تعليقك حول الاستعلامات المعلمة

يمكنك إنشاء طرق عرض معلمة ، وهي طرق عرض تعتمد على المتغيرات المحددة قبل التنفيذ. هنا مثال على AskTom إظهار كيف يمكنك القيام بذلك userenv('client_info') أو dbms_session.set_context.

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