بتاريخ: 1 أبريل 201313 سنة comment_234430 السؤال: اكتب trigger يقوم بمنع اضافة موظف على جدول الموظفين راتبه اعلى من أعلى راتب في الموظفين. الحل: create or replace trigger Do_Not_Add before insert on emp for each row begin if :new.sal > max(sal) then raise_application_error(-20001,'لا يمكن الإضافة'); end if; end; / لا أعرف ما الخطأ أرجو منكم المساعدة وجزاكم الله خيرا تم تعديل 2 أبريل 201313 سنة بواسطة Ahmad.Hasan تقديم بلاغ
بتاريخ: 1 أبريل 201313 سنة comment_234434 create or replace trigger Do_Not_Add before insert on emp for each row declare v_max number; begin select max(sal) into v_max from emp; if :new.sal > v_max then raise_application_error(-20001,'لا يمكن الإضافة'); end if; end; تم تعديل 2 أبريل 201313 سنة بواسطة Ahmad.Hasan تقديم بلاغ
بتاريخ: 2 أبريل 201313 سنة comment_234437 الطريقة الصحيحة حتى تحصل على أعلى راتب هي جملة select التي كتبها الأخ elnaggar55555 لكنها أيضاً لن تعمل لأن ال trigger لا يقبل أن تكتب جملة select على نفس ال table الذي يعمل عليه ال trigger داخل ال trigger (تستطيع أن تعمل select على أي table تريد مل عدا emp). إذا جربت طريقة الأخ elnaggar55555 و لم تعمل فالحل الوحيد هو أن تنقل ال code إلى ال form تقديم بلاغ
بتاريخ: 2 أبريل 201313 سنة comment_234440 الطريقة الصحيحة حتى تحصل على أعلى راتب هي جملة select التي كتبها الأخ elnaggar55555 لكنها أيضاً لن تعمل لأن ال trigger لا يقبل أن تكتب جملة select على نفس ال table الذي يعمل عليه ال trigger داخل ال trigger (تستطيع أن تعمل select على أي table تريد مل عدا emp). إذا جربت طريقة الأخ elnaggar55555 و لم تعمل فالحل الوحيد هو أن تنقل ال code إلى ال form كلام سليم ولكن يعمل الترجر باضافة بسيطة كما في الكود التالي: CREATE OR REPLACE TRIGGER do_not_add BEFORE INSERT ON scott.emp FOR EACH ROW DECLARE v_max NUMBER; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT MAX (sal) INTO v_max FROM scott.emp; COMMIT; IF :NEW.sal > v_max THEN raise_application_error (-20001, 'You Cant Add'); END IF; END; / تقديم بلاغ
بتاريخ: 2 أبريل 201313 سنة comment_234445 تستطيع أن تعمل select على أي table حتى emp لكن لا تستطيع ان insert or update الطريقة الصحيحة حتى تحصل على أعلى راتب هي جملة select التي كتبها الأخ elnaggar55555 لكنها أيضاً لن تعمل لأن ال trigger لا يقبل أن تكتب جملة select على نفس ال table الذي يعمل عليه ال trigger داخل ال trigger (تستطيع أن تعمل select على أي table تريد مل عدا emp). إذا جربت طريقة الأخ elnaggar55555 و لم تعمل فالحل الوحيد هو أن تنقل ال code إلى ال form تقديم بلاغ
بتاريخ: 2 أبريل 201313 سنة comment_234452 الطريقة الصحيحة حتى تحصل على أعلى راتب هي جملة select التي كتبها الأخ elnaggar55555 لكنها أيضاً لن تعمل لأن ال trigger لا يقبل أن تكتب جملة select على نفس ال table الذي يعمل عليه ال trigger داخل ال trigger (تستطيع أن تعمل select على أي table تريد مل عدا emp). إذا جربت طريقة الأخ elnaggar55555 و لم تعمل فالحل الوحيد هو أن تنقل ال code إلى ال form كلام سليم ولكن يعمل الترجر باضافة بسيطة كما في الكود التالي: CREATE OR REPLACE TRIGGER do_not_add BEFORE INSERT ON scott.emp FOR EACH ROW DECLARE v_max NUMBER; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT MAX (sal) INTO v_max FROM scott.emp; COMMIT; IF :NEW.sal > v_max THEN raise_application_error (-20001, 'You Cant Add'); END IF; END; / معلومة جديدة لكن لو سمحت سؤال ... ما معنى PRAGMA AUTONOMOUS_TRANSACTION; ؟ و هل بالإمكان عمل commit داخل trigger ؟ تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.