سؤال

ما هي أفضل طريقة للقيام بالمعادل الدلالي لاستدعاء نظام النوم التقليدي () من داخل روتين Informix SPL؟بمعنى آخر، ببساطة "توقف مؤقتًا" لمدة N ثانية (أو ميلي ثانية أو أي شيء آخر، لكن الثواني جيدة).أنا أبحث عن حل يفعل ذلك لا تتضمن ربط بعض أكواد C الجديدة (التي ربما كتبتها) أو مكتبة أخرى بخادم Informix.يجب أن يكون هذا شيئًا يمكنني القيام به من SPL فقط.سيكون الحل لـ IDS 10 أو 11 جيدًا.

@RET - الإجابة "الواضحة" لم تكن واضحة بالنسبة لي!لم أكن أعرف عن الأمر SYSTEM.شكرًا لك!(ونعم، أنا الرجل الذي تعتقد أنني كذلك.)


نعم، إنه لأغراض التصحيح فقط.لسوء الحظ، CURRENT داخل SPL سيُرجع دائمًا نفس القيمة، التي تم تعيينها عند إدخال المكالمة:

"أي استدعاء إلى CURRENT من داخل وظيفة SPL تستدعيه عبارة EXECUTE FUNCTION (أو EXECUTE PROCEDURE) تُرجع قيمة ساعة النظام عند بدء تشغيل وظيفة SPL."

دليل IBM Informix إلى SQL

التفاف الحالي في روتين فرعي خاص به لا يساعد.تحصل على إجابة مختلفة في الاستدعاء الأول للمجمّع الخاص بك (شريطة أن تستخدم YEAR TO FRACTION(5) أو أي نوع آخر ذو دقة عالية بما يكفي لإظهار الفرق) ولكن بعد ذلك تحصل على نفس القيمة مرة أخرى في كل واحدة استدعاء لاحق، مما يضمن عدم إنهاء أي نوع من الحلقات أبدًا.

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

المحلول

يجب أن يكون هناك سبب وجيه لعدم رغبتك في الإجابة الواضحة:SYSTEM "sleep 5".إذا كان كل ما تريده هو أن يتوقف SPL مؤقتًا أثناء التحقق من القيم المختلفة وما إلى ذلك، فإليك بعض الأفكار (وكلها اختراقات مطلقة بالطبع):

  1. اجعل ملف TRACE عبارة عن أنبوب مسمى (بافتراض وجود نهاية خلفية لنظام Unix)، بحيث يتم حظره حتى تختار القراءة منه، أو
  2. قم بإنشاء جدول آخر يستقصي عنه SPL لإدخال معين من حلقة WHILE، وأدخل الصف المذكور من مكان آخر (غير فعال بشكل فظيع)
  3. اجعل SET LOCK MODE صديقك:قم بتنفيذ "SET LOCK MODE TO WAIT n" وأعد الاستعلام عن جدول كنت تحمل المؤشر مفتوحًا عليه بالفعل.ستحتاج إلى تغليف هذا بمعالج الاستثناء بالطبع.

آمل أن يكون هذا بعض المساعدة (وإذا كنت نفس شهرة JS of Ars وRose::DB، فهذا أقل ما يمكنني فعله؛-)

نصائح أخرى

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

اقتراح:ربما يمكنك الحصول على CURRENT، وإضافته بضع ثوانٍ (دع mytimestamp) ثم في حلقة زمنية حدد CURRENT while CURRENT <= mytimestamp .ليس لدي أي إعداد إعلامي حول مكتبي لتجربته، لذا سيتعين عليك معرفة بناء الجملة الصحيح.مرة أخرى، لا تضع مثل هذا الاختراق على خادم الإنتاج.لقد تم تحذيرك :D

ثم سيتعين عليك تشويه CURRENT في وظيفة أخرى ستستدعيها من الأولى (ولكن هذا اختراق للاختراق السابق ...).

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

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

حله هو استخدام الوظيفة التالية:

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