الانتقال إلى المحتوى

كيفية عمل هذه ال Job


PrisonBreak

Recommended Posts

السلام عليكم
الى الذين لا يعلمون عن ماذا أتحدث : باختصار عندي قاعدة بيانات تحتوي على آلاف العمال وعدد كبير من العمال لهم تاريخ نهاية عقد ينتهي عملهم فيه ..
أريد من الأوراكل عمل تفحص يومي لكل عامل له تاريخ نهاية عقد بحيث أن يقوم بتحويل الحالة العملية لجميع العمال الذي لديهم عقد من ( يعمل ) الى ( لا يعمل) عندما يساوي تاريخ نهاية عقدهم تاريخ اليوم

طلبت مساعدة من أخي 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;

أنا قمت بتجربة ذلك وتمت عملية انشاء وظيفة وبروسيجر بنجاح ولكنها لم تعمل وبقيت التواريخ ولم تتم عملية تحويل الحالة العملية للعامل , سأكون شاكر جدا لمن يساعدني
أرجو أن تساعدوني بأقصى سرعة وللضرورة لأن مشروعي شارف على الانتهاء ولم يتبقى لي الا القليل ..

رابط هذا التعليق
شارك

السلام عليكم

اخي العزيز المشكلة لديك في الشرط

WHERE LEAVEDATE = SYSDATE;

حيث انك تقارن تاريخ بتاريخ اليوم

والمشكلة كالتالي انت تقارن تاريخ ووقت بتاريخ ووقت

كما نعلم ان التاريخ يحفظ في قاعدة البيانات على صيغة تاريخ ووقت وهنا نحن بحاجة الى تحويل صيغة التاريخ لتتم عملية المقارنة بشكل صحيح

لذا يصبح الشرط كالتالي

WHERE to_date(LEAVEDATE,'dd-mm-yyyy') = to_date(SYSDATE,'dd-mm-yyyy');

رابط هذا التعليق
شارك

السلام عليكم

بدلا من استخدام الكيروسر وهو بطىء وخصوصا اذا كان عدد السجلات كبير
اقترح تعديل الوظيفة الى الشكل التالى

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;

رابط هذا التعليق
شارك

السلام عليكم
اضافة الى كلام اخواني الاعزاء
يمكن عمل ال 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;




وفق الله الجميع

رابط هذا التعليق
شارك

أشكرك جزيل الشكر أخي مصطفى وجميع من ساعدوني وحاولوا مساعدتي
وشكر خاص لأخي احمد
ولكن أخي مصطفى هل عليّ الانتظار حتى الغد لأختبر الوظيفة ؟؟؟
ألا توجد طريقة لاختبارها الآن حتى يطمئن قلبي ..
وكيف يمكنني أن أضع أكثر من تعديل في هذه الوظيفة ..

رابط هذا التعليق
شارك

جرب هذه الجوب:

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 ..
جرب تغيير الوقت...

رابط هذا التعليق
شارك

ألف شكر لكل من ساعدني ولمن حاول مساعدتي
شكرا جاد , شكرا asmaa
وشكر خاص وخاص جدا لأخي مصطفى وأخي احمد على المساعدة الكبيرة والكبيرة جداً
قمت بتجربة الوظيفة وتمت العملية بنجاح
أقول لأخي احمد بأنني قمت بتغيير القيمة repeat_interval=>'FREQUENCY=daily;INTERVAL=1', الى repeat_interval=>'FREQUENCY=minutely', حتى يقوم باستدعاء الوظيفة كل دقيقة وليس كل يوم وهكذا قمت بتجربتها وبعد عملية التجريب قمت بارجاعها الى التشييك اليومي وليس كل دقيقة ونستطيع أن نستدعي الوظيفة كل ساعة أيضا عن طريق repeat_interval => 'freq=hourly; byminute=0',

أخي احمد , أخي مصطفى
خطرت ببالي فكرة أريد أن أفاجئ بها من يهمهم أمر مشروعي
هل يمكن أن أقوم بعملية باك أب ( نسخة احتياطية ) تلقائيا ووضعها في مكان أقوم أنا بتحديده في الكود يتم عمل هذا كله عن طريق الجوب ولتكن كل أسبوع weekly وتكون تلقائية التشغيل
هل يمكن ذلك أنا أعلم أنه يمكن ولكن كيف ذلك ..؟
شكرا لكم جميعاً
تحياتي

رابط هذا التعليق
شارك

نعم يمكن ذلك...
ان البعض يستخدم الــ job schudual الموجودة من ضمن خصائص الويندوز .... ولكنني لم اقم بتجربتها...

رابط هذا التعليق
شارك

السلام عليكم
بالنسبة

هل يمكن أن أقوم بعملية باك أب ( نسخة احتياطية ) تلقائيا ووضعها في مكان أقوم أنا بتحديده في الكود يتم عمل هذا كله عن طريق الجوب ولتكن كل أسبوع weekly وتكون تلقائية التشغيل


لايصح وضع جملة export مباشرة مكان جملة ال update في ال job السابقة لان جملة ال export ليست جملة sql فلايتم تنفييذها

ممكن كما قال أخي أحمد "pali" عمل سكيدول بالويندوز يوميا -شهريا عن طريق باتش

اعتقد أيضا ممكن هناك طريقة أخرى لكن لا اعرف
موفق
رابط هذا التعليق
شارك

السلام عليكم

اخي mustafagamiel اريد ان اوضح لك

كما نعلم انه لو قمنا بعمل حقل من نوع date فإنه سيحتفض بالقيم بداخله على صيغة وقت وتاريخ ... وهذا شيء معروف

لكن الذي لا تعلمه هو

لو قمنا بإضافة بيانات لهذا الحقل عن طريق فورم وكان القيمة المدخلة هي
10-10-2009
فإن هذه القيمة ستحفظ في قاعدة البانات على هذا الشكل

10-10-2009 12:00:00 pm

ولو قام الاخ طارح السؤال بتنفيذ الوظيفة المطلوبة يوميا الساعة 10 صباحأ او اي وقت غير الساعة 12:00:00 pm

فإن الشرط لدية لن يتحقق لان هذه القيمتين غير متساوية
علما بأنه يقارن عن طريق المساواه بين القيمتين

لذلك لا بد من مقارنة قيمتين متشابهتين بالتنسيق لنحصل على النتيجة ونهمل القيمة الزمنية كما شرحتها لكم
 

رابط هذا التعليق
شارك

السلام عليكم
لو قمت بعمل التالي:

SELECT SYSDATE FROM DUAL;



ماذا سيكون الناتج ؟؟ ... اكيد تاريخ اليوم فقط...

قمت بعمل جدول وادخلت تاريخ من الفورم وعند عمل سيليكت على الداتا بيز ظهر التاريخ فقط بدون وقت ....

بصراحه اخ جاد..شككتني بحالي B)

post-73694-1254863363_thumb.jpg

رابط هذا التعليق
شارك

الأخ jadquraan
كلامي بعيد عن الموضوع قليلاً
ياأخي إذا كان عندك زيادة علم فأخبرنا لكن بدون تجريح للأشخاص بمثل ألفاظ( تتعاملون بشكل سطحي وتتسرعون في الإجابة)
فمثل هذه الطريقة تنفر القلوب من بعضها
رجاء احذف من قاموسك هذه الألفاظ
دمتم بعافية

رابط هذا التعليق
شارك

  • بعد 4 سنة...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية