PrisonBreak بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكمالى الذين لا يعلمون عن ماذا أتحدث : باختصار عندي قاعدة بيانات تحتوي على آلاف العمال وعدد كبير من العمال لهم تاريخ نهاية عقد ينتهي عملهم فيه ..أريد من الأوراكل عمل تفحص يومي لكل عامل له تاريخ نهاية عقد بحيث أن يقوم بتحويل الحالة العملية لجميع العمال الذي لديهم عقد من ( يعمل ) الى ( لا يعمل) عندما يساوي تاريخ نهاية عقدهم تاريخ اليومطلبت مساعدة من أخي AHMAD.HASAN قبل ذلك وأخبرني بالحل ولكن ليس كاملا وأنا بحثت عن باقي الحل ووجدته ولكن الوظيفة لا تعملأطلب من أخي AHMAD.HASAN مساعدتي أخي احمدهل حل مشكلتي يكمن في هذه الأكواد وهل هي صحيحة وتحل مشكلتي أم لاأولا قمت بانشاء بروسيجر كالتالي Create Or Replace Procedure CHK_DATE AS CURSOR C IS SELECT LEAVEDATE FROM INF; BEGIN FOR REC IN C LOOP UPDATE INF SET WORK_STATE_CD = 2 WHERE LEAVEDATE = SYSDATE; END LOOP; COMMIT; End; حيث أن LEAVEDATE هو تاريخ نهاية العقد ..INF هو جدول العمالWORK_STATE_CD هو عمود الحالة العملية والذي يحتوي على خمسة خيارات ( "لا يعمل" هو الثاني من القائمة )ثانياً قمت بانشاء وظيفة كالتالي BEGIN -- Job defined entirely by the CREATE JOB procedure. DBMS_SCHEDULER.create_job ( job_name => 'CHK_DATEE', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN CHK_DATE(''CREATE_PROGRAM (BLOCK)''); END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=hourly; byminute=0', end_date => NULL, enabled => TRUE, comments => 'Job defined entirely by the CREATE JOB procedure.'); END; أنا قمت بتجربة ذلك وتمت عملية انشاء وظيفة وبروسيجر بنجاح ولكنها لم تعمل وبقيت التواريخ ولم تتم عملية تحويل الحالة العملية للعامل , سأكون شاكر جدا لمن يساعدنيأرجو أن تساعدوني بأقصى سرعة وللضرورة لأن مشروعي شارف على الانتهاء ولم يتبقى لي الا القليل .. 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكم اخي العزيز المشكلة لديك في الشرط WHERE LEAVEDATE = SYSDATE;حيث انك تقارن تاريخ بتاريخ اليوم والمشكلة كالتالي انت تقارن تاريخ ووقت بتاريخ ووقت كما نعلم ان التاريخ يحفظ في قاعدة البيانات على صيغة تاريخ ووقت وهنا نحن بحاجة الى تحويل صيغة التاريخ لتتم عملية المقارنة بشكل صحيح لذا يصبح الشرط كالتالي WHERE to_date(LEAVEDATE,'dd-mm-yyyy') = to_date(SYSDATE,'dd-mm-yyyy'); اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
asmaa123 بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكمبدلا من استخدام الكيروسر وهو بطىء وخصوصا اذا كان عدد السجلات كبير اقترح تعديل الوظيفة الى الشكل التالى Create Or Replace Procedure CHK_DATE AS BEGIN UPDATE INF SET WORK_STATE_CD = 2 WHERE to_date(LEAVEDATE,'dd-mm-yyyy') = to_date(SYSDATE,'dd-mm-yyyy'); COMMIT; End; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكماضافة الى كلام اخواني الاعزاء يمكن عمل ال job مباشرة حيث انه لايستدهي عمل البروسيدور لانه جملة ال update تكفي في سطر واحد 2- المفروض يتم تعديل لما يكون تاريخ اليوم أكبر من تاريخ نهاية العقد لان الموظف يظل يدوام لاخر يوم في العقد اليس كذلك3- بالنسبة لاخي العزيز جاد لايشترط التحويل لانه الاوراكل يقوم بعمل تحويل داخلي ويفهم ويقارن صحيح هذا طالما ان نوع العمود في الجدول عندك من النوع date بينما لو كنت تخزن التاريخ في عمود ليس نوعه date مثلا number or varchar2 في هذه الحالة لابد من عمل ماقام به أخي العزيز جاديمكنك عمل مثل هذه ال job BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'update_table', job_type => 'PLSQL_BLOCK', job_action => 'begin UPDATE INF SET WORK_STATE_CD = 2 WHERE LEAVEDATE > SYSDATE; end;', start_date => SYSTIMESTAMP, repeat_interval=>'FREQUENCY=daily ;INTERVAL=1', enabled => TRUE); END; / هذه الوظيفة ستعمل يوميا لكن قبل انشأها لابد وان تتأكد ان المستخدم الذي تعمل عليه له القدرة على انشاء الوظيفة لو غير ذلك هتخش من المستخدم sys /as sysdba grant create any job to scott; وفق الله الجميع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكمسبقني أخي العزيز مصطفى جميل في الرد...وجوابه صحيح ودقيق 100 % ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
PrisonBreak بتاريخ: 5 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 أشكرك جزيل الشكر أخي مصطفى وجميع من ساعدوني وحاولوا مساعدتيوشكر خاص لأخي احمدولكن أخي مصطفى هل عليّ الانتظار حتى الغد لأختبر الوظيفة ؟؟؟ألا توجد طريقة لاختبارها الآن حتى يطمئن قلبي ..وكيف يمكنني أن أضع أكثر من تعديل في هذه الوظيفة .. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 جرب هذه الجوب: BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'update_table', job_type => 'PLSQL_BLOCK', job_action => 'UPDATE INF SET WORK_STATE_CD = 2 WHERE LEAVEDATE > SYSDATE;', next_date => to_date('05/10/2009 17:04:05','dd/mm/yyyy hh24:mi:ss'), repeat_interval=>'FREQUENCY=daily;INTERVAL=1', enabled => TRUE); END; / لاحط ان وقت عمل الجوب هو17:04:04 ..جرب تغيير الوقت... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
PrisonBreak بتاريخ: 5 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 ألف شكر لكل من ساعدني ولمن حاول مساعدتيشكرا جاد , شكرا asmaaوشكر خاص وخاص جدا لأخي مصطفى وأخي احمد على المساعدة الكبيرة والكبيرة جداًقمت بتجربة الوظيفة وتمت العملية بنجاحأقول لأخي احمد بأنني قمت بتغيير القيمة repeat_interval=>'FREQUENCY=daily;INTERVAL=1', الى repeat_interval=>'FREQUENCY=minutely', حتى يقوم باستدعاء الوظيفة كل دقيقة وليس كل يوم وهكذا قمت بتجربتها وبعد عملية التجريب قمت بارجاعها الى التشييك اليومي وليس كل دقيقة ونستطيع أن نستدعي الوظيفة كل ساعة أيضا عن طريق repeat_interval => 'freq=hourly; byminute=0',أخي احمد , أخي مصطفىخطرت ببالي فكرة أريد أن أفاجئ بها من يهمهم أمر مشروعيهل يمكن أن أقوم بعملية باك أب ( نسخة احتياطية ) تلقائيا ووضعها في مكان أقوم أنا بتحديده في الكود يتم عمل هذا كله عن طريق الجوب ولتكن كل أسبوع weekly وتكون تلقائية التشغيلهل يمكن ذلك أنا أعلم أنه يمكن ولكن كيف ذلك ..؟شكرا لكم جميعاًتحياتي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 نعم يمكن ذلك...ان البعض يستخدم الــ job schudual الموجودة من ضمن خصائص الويندوز .... ولكنني لم اقم بتجربتها... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
PrisonBreak بتاريخ: 5 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 سأقوم بتجربتها الآن أخي احمد ..ولكن هل التصدير عن طريق جملة exp يكفي أم هناك تصدير آخر عن طريق جمل أخرى ..؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 السلام عليكمبالنسبة هل يمكن أن أقوم بعملية باك أب ( نسخة احتياطية ) تلقائيا ووضعها في مكان أقوم أنا بتحديده في الكود يتم عمل هذا كله عن طريق الجوب ولتكن كل أسبوع weekly وتكون تلقائية التشغيل لايصح وضع جملة export مباشرة مكان جملة ال update في ال job السابقة لان جملة ال export ليست جملة sql فلايتم تنفييذها ممكن كما قال أخي أحمد "pali" عمل سكيدول بالويندوز يوميا -شهريا عن طريق باتش اعتقد أيضا ممكن هناك طريقة أخرى لكن لا اعرفموفق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
King Oracle بتاريخ: 6 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 6 أكتوبر 2009 مشاركات قيمة جدا في هذا الموضوع واشكر كل من قال بالرد على الاخ الكريم .زادكم الله نورا وعلما .... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 6 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 6 أكتوبر 2009 السلام عليكماخي mustafagamiel اريد ان اوضح لككما نعلم انه لو قمنا بعمل حقل من نوع date فإنه سيحتفض بالقيم بداخله على صيغة وقت وتاريخ ... وهذا شيء معروفلكن الذي لا تعلمه هولو قمنا بإضافة بيانات لهذا الحقل عن طريق فورم وكان القيمة المدخلة هي10-10-2009فإن هذه القيمة ستحفظ في قاعدة البانات على هذا الشكل10-10-2009 12:00:00 pmولو قام الاخ طارح السؤال بتنفيذ الوظيفة المطلوبة يوميا الساعة 10 صباحأ او اي وقت غير الساعة 12:00:00 pmفإن الشرط لدية لن يتحقق لان هذه القيمتين غير متساويةعلما بأنه يقارن عن طريق المساواه بين القيمتينلذلك لا بد من مقارنة قيمتين متشابهتين بالتنسيق لنحصل على النتيجة ونهمل القيمة الزمنية كما شرحتها لكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 6 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 6 أكتوبر 2009 السلام عليكملو قمت بعمل التالي: SELECT SYSDATE FROM DUAL; ماذا سيكون الناتج ؟؟ ... اكيد تاريخ اليوم فقط...قمت بعمل جدول وادخلت تاريخ من الفورم وعند عمل سيليكت على الداتا بيز ظهر التاريخ فقط بدون وقت ....بصراحه اخ جاد..شككتني بحالي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
أبوعبدالملك المصري بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 الأخ jadquraanكلامي بعيد عن الموضوع قليلاًياأخي إذا كان عندك زيادة علم فأخبرنا لكن بدون تجريح للأشخاص بمثل ألفاظ( تتعاملون بشكل سطحي وتتسرعون في الإجابة) فمثل هذه الطريقة تنفر القلوب من بعضهارجاء احذف من قاموسك هذه الألفاظدمتم بعافية اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Alasmari بتاريخ: 7 أبريل 2014 تقديم بلاغ مشاركة بتاريخ: 7 أبريل 2014 موضوع مميز استفدت منه بشكل كبير جزاكم الله خيرا جميعا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ramy_orcl بتاريخ: 7 أبريل 2014 تقديم بلاغ مشاركة بتاريخ: 7 أبريل 2014 بجد موضوع مميز استفدت جدا و جزاكم الله خيرا جميعا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.