الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

تحويل بروسيجر الى تريغر

Featured Replies

بتاريخ:

عندي بروسيجر فيه يمنع الاضافة على الجدول اذا كان للموظف اكثر من اربعة اجازات او اثنتين ان كان دوامه جزئيا
السؤال اريد ان اقلبه الى database trigger لكي اضمن الكود مئة بالمئة

PROCEDURE emp_leave
 IS
v_count number;
v_kind  number;
BEGIN select  count(to_char(leave_date_original,'mm/yyyy'))  into v_count from leave 
where leave_emp_id=:leave_emp_id;
select emp_kind into v_kind from employees 
where emp_id=:leave_emp_id;
if v_kind = 1 and v_count>=4   then
message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä 4 ãÑÇÊ Ýí ÇáÔåÑ áãæÙÝí ÇáÏæÇã ÇáßÇãá');
	message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä 4 ãÑÇÊ Ýí ÇáÔåÑ áãæÙÝí ÇáÏæÇã ÇáßÇãá');
elsif  v_kind >= 2 and v_count >=2 then
message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä ãÑÊíä áãæÙÝí ÇáÏæÇã ÇáÌÒÆí');
message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä ãÑÊíä áãæÙÝí ÇáÏæÇã ÇáÌÒÆí');
else
message('ÛíÑ ãÚÑÝ Úáì ÇáäÙÇã');
end if;
raise form_trigger_failure;
END;


كيف ؟ وبكون مشكوركم

بتاريخ:

السلام عليكم
شيل تعريف البروسيدور
واكتب تعريف ال trigger

create or replace trigger trigger_name  before insert or update on your_table
for each row
decalre
v_count number;
v_kind number;
BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave 
where leave_emp_id=:leave_emp_id;
select emp_kind into v_kind from employees 
where emp_id=:leave_emp_id;
if v_kind = 1 and v_count>=4 then
raise_appllcation_error(-20211,'you cant');
elsif v_kind >= 2 and v_count >=2 then
raise_appllcation_error(-20211,'you cant');else
end if;
END;



أنا مشعارف أه معنى الرسالة لانها غير واضحة لكن يمكنك تعديله
عموما جربه

بتاريخ:
  • كاتب الموضوع

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

بتاريخ:

هتزود شرط على جملة السلكت الاولى

هو انا مش عارف ايه الداتا اللي انت بتسجلها بس اكيد يعني بتدخل قيمة في الكولم اللي اسمه leave_date_original
يبقى احنا محتاجين نقارن الشهر بتاع قيمة التاريخ الجديدة ، بكل التواريخ بتاعة الاستئذانات بتاعة الموظف ، ولو التاريخ ده بيساوي التاريخ الجديد
هيرجع عدد الاستئذانات ، وعادي بأه كمل التريجر زي ماهو

وهيكون التريجر كده

create or replace trigger trigger_name before insert or update on your_table
for each row
decalre
v_count number;
v_kind number;
BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave 
where leave_emp_id=:leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm');
select emp_kind into v_kind from employees 
where emp_id=:leave_emp_id;
if v_kind = 1 and v_count>=4 then
raise_appllcation_error(-20211,'you cant');
elsif v_kind >= 2 and v_count >=2 then
raise_appllcation_error(-20211,'you cant');else
end if;
END;

بتاريخ:
  • كاتب الموضوع

اوكي اخي الكريم مشكور في البداية ولكن عندي ملاحظات على التريغر
اولا انا رح اكون في الفورم والفورم رح يكون واقف عند رقم موظف معين لنفرض رقمه 69
الان كيف سأقول للتريغر اني بدي بس تتأكد من هذا الموظف وليس كل موظف وذلك لانو اذا بدو يتأكد من كل الموظفين ليس منطقيا؟؟؟ هل انا اصبت ام لا ؟؟؟ وشكرا لك انتظر ردك

بتاريخ:

نعم معاك حأ .... بس خد بالك التريجر ده على الداتا بيز مش على الفورم
ومش هيحصل غير في حالة الانسرت وا الابديت

يبقى هتغير بس وتضيف كلمة :new في التريجر
يعني بدل ما يكون الشرط اللي موجود في جملة السلكتايه الاولى كده

where leave_emp_id=:leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm');




هيكون كده

where leave_emp_id=:new.leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm');



ويبقى التريجر الجديد بالشكل ده

create or replace trigger trigger_name before insert or update on your_table
for each row
decalre
v_count number;
v_kind number;
BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave 
where leave_emp_id=:new.leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm');
select emp_kind into v_kind from employees 
where emp_id=:leave_emp_id;
if v_kind = 1 and v_count>=4 then
raise_appllcation_error(-20211,'you cant');
elsif v_kind >= 2 and v_count >=2 then
raise_appllcation_error(-20211,'you cant');else
end if;
END;




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

جرب كده

تم تعديل بواسطة abdu1_far

بتاريخ:
  • كاتب الموضوع

التريغر لا يقبل العمل ويعطيني الخطأ التالي مع انني راجعته حرف حرف
PLS-00103: Encountered the symbol "END" when expecting one of the
following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe

بتاريخ:

لان حضرتك بتعمل SELECT في جدول وفي نفس الوقت بتعمل فيه ابديت او انسيرت
منطقيا الكود ده بيقولي ايه
في حالة الانسرت او الابديت ..... يعني كده الجدول معموله LOCK لانه في مود الانسرت او الابديت
وجوه التريجر بنقوله روح سلكت منه الجدول ، طب ازاي والجدول محجوز حاليا ... مطنقيا ما ينفعش
انت كده عايز تعمل 2 ترانزاكشن في نفس الواقت
طب الحل
هتستخدم ال PRAGMA

هتروح في الDECLARE وتزود السطر ده

PRAGMA AUTONOMOUS_TRANSACTION;
بس كده وجرب
لو ما استغلتش ياريت تبعت لي الجودل ده ، بس بلاش امتداد.RAR عشان مش هيفتح معايا هنا
جرب ياباشا

بتاريخ:
  • كاتب الموضوع

لم يعمل الكود مع التعديل

مرفق الكود والجدول

لاتنسا ان رقم الموظف leave_emp_id
مربوط مع جدول الموظفين

تم تعديل بواسطة maher534510

بتاريخ:

يا فندم التريجر شغال كويس
بس كلمة RAISE_APPLICATION_ERROR
كانت مكتوبه خطأ بس
وعادي ممكن تشيل
PRAGMA AUTONOMOUS_TRANSACTION;

جرب بس اكتب كلمة RAISE_APPLICATION_ERROR كده

انت بس كنت حاطط LL في كلمة APPLICATION ، هي المفروض LI

تم تعديل بواسطة abdu1_far

بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

يا اخواني انا معاكم كلامكم صحيح ولكن نفس الخطأ مرفق الصورة للتاكد

بتاريخ:

السلام عليكم
مكتوب بالكود else بالاخير ما فائدتها ؟؟؟
انت عامل if مرتين
يعني مو لازم يكون عندك end if مرتين ؟؟؟

post-73694-1246972984_thumb.jpg

بتاريخ:
  • كاتب الموضوع

مشكور يا حبيب فعلا كلمة else هي المشكلة كلها مشكورين جميعا صدقا اني اشعر عندما ادخل هذا المنتدى كأني في بيتي مشكورين كلكم اخواني واحبائي

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.