سؤال

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

هل من الممكن في PL / SQL لطباعة الإخراج فورا (غير مؤقتا)؟ إذا لم يكن كذلك، ما هي البدائل التي يوصي بها الناس للحصول على نتيجة مماثلة؟

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

المحلول

يمكنك الحصول على إجراء يكتب رسائل إلى جدول باستخدام معاملة مستقلة شيء مثل:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

ثم مراقب الجدول من جلسة أوراكل أخرى.

نصائح أخرى

لدينا خدعة صغيرة لهذا.

يمكنك استخدام dbms_application_info.set_client_info ("بعض المعلومات هنا")؛ إنشاء بعض المتغيرات واستبدال السلسلة داخل "".

واستخدم Select Client_info من جلسة V $ لمراقبة التقدم المحرز.

لقد كنت أستخدم DBMS_PIPE لهذا الغرض. إرسال رسائل إلى أنابيب مسماة وقراءتها من جلسة أخرى. قد لا تعمل هذه الطريقة في بيئة RAC عندما قد تتصل عمليات الكتابة والقراءة بعقدة مختلفة.

بدلا من ذلك، يمكنك إدراج الرسائل في جدول باستخدام إجراء يعمل في جلسة خاصة به باستخدام "Pragma Autonomousous_Transaction". يمكنك الاستعلام عن هذه الرسائل من جلسة أخرى

تحرير: أرى أن خياري الثاني قد ذكر بالفعل.

هناك عموما خياران:

  • إرسال الإخراج إلى جدول أوراكل (أو جدول مؤقت)
  • الكتابة إلى نظام الملفات (مضيف قاعدة البيانات) مع UTL_File

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

قد يعتمد على أداة العميل الخاصة بك. لم أستخدم SQL * Plus منذ فترة، ولكن عندما أقوم بتصحيح الإجراءات في مطور PL / SQL، أفتح نافذة أمر وقرسم SET SERVEROUTPUT ON أمر. ثم عندما أعمل الإجراء، أي شيء مطبوع DBMS_OUTPUT.PUT_LINE يظهر حتى على الفور.

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

البديل هو استخدام وظيفة خطوط الأنابيب التي ترجع معلومات التسجيل الخاصة بك. نرى هنا على سبيل المثال: http://berxblog.blogspot.com/2009/01/Pipelined-Function-vs-dbmsoutput.html. عند استخدام وظيفة خطوط الأنابيب، لا تضطر إلى استخدام SQLPlus / Toad / SQL Developer وغيرها ...

يمكنك استخدام أنبوب DBMS ومشاهد الأنابيب في مطور PL / SQL للقبض بشكل غير متزامن لجميع المعلومات عند وضعها في الأنبوب.

كن حذرا لوضع الأشياء فقط في أنبوب عندما يكون هناك شخص قراءته. خلاف ذلك، سوف تفشل مكالمتك عندما تكون الأنبوب ممتلئا.

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

خيار آخر هو الحصول على إجراء PL / SQL الخاص بك لإرسال بريد إلكتروني مع رسالة السجل فيها. يتطلب ذلك أن تحتوي قاعدة البيانات الخاصة بك على إمكانية إرسال البريد الإلكتروني، والتي يمكن إضافتها باستخدام UTL_SMTP.

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