بتاريخ: 1 ديسمبر 200718 سنة comment_117579 السلام عليكم ورحمه الله وبركاتهانا عند تريجر بعمل فيه SELECT على قيم معينه فى جدول انا اريد ان عمل EXCEPTION يعمل الاتى إذا لم يجد ناتج يقوم بعمل INSERT وإذا وجد ناتج قام بعمل UPDATE فى حاله عدم وجود ناتج انا قمت بعمل WHEN NO_DATA__FOUND وفى حاله وجود ناتجقمت بعمل WHEN TOO_MANAY_ ROWS ولكنها لم تعمل لماذا؟ DECLARE V_EMPNO NUMBER; V_ENAME VARCHAR2(30); BEGIN SELECT EMPNO,ENAME INTO V_EMPNO,V_ENAME FROM EMP WHERE EMPNO=1000; EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO EMP(EMPNO,ENAME) VALUES(1000,'AHMED'); COMMIT; WHEN TOO_MANY_ROWS THEN UPDATE EMP SET EMPNO=2000,ENAME='YASER'; COMMIT; END الكود لايوجد به اخطاء ولكن لايقوم بعمل UPDATE تم تعديل 1 ديسمبر 200718 سنة بواسطة waleedsh تقديم بلاغ
بتاريخ: 1 ديسمبر 200718 سنة comment_117603 بسم الله الرحمن الرحيمعندما تستخدم when too_many_row exceptionفدا معناه أن لو ناتج الselect statement طلع فى أكتر من row إذن فى هذه الحالة يتنفذ الexceptionولكن ناتج الselect statement تكون row واحد فقط إذن فى هذه الحالة مش هيتنفذ الexceptionوممكن دى تكون المشكله عندك .وكمان المثال بتاعك مبنى على الempno يعنى إستحاله يكون فى تكرار وبالتالى الexception when_too_many_rows عمره ماهيتنفذ .الحلتشيل when_too_many_rows خالص لأن مالوش لازمه.وتضع بعد جملة الselect if v_empno is not null thenUPDATE EMP SET EMPNO=2000,ENAME='YASER';COMMIT;end if; تقديم بلاغ
بتاريخ: 1 ديسمبر 200718 سنة كاتب الموضوع comment_117614 السلام عليكم ورحمه الله وبركاتهبخصوص الجدول emp فانا مستخدمه هنا كمثال فقط ولكن المشكله عندى فى جدول ليس فيه primary key وانا استخدمتالطريقه السابقه ولم يحدث update لااعرف السبب ارجو الرد وياريت لو حد يقلنى exception المضاد ل when no_data_foundاى اذا وجد صف واحد فقط تقديم بلاغ
بتاريخ: 3 ديسمبر 200718 سنة كاتب الموضوع comment_117756 السلام عليكم ورحمه الله وبركاتهياجماعه اين اضع جمله if v_empno is not null thenUPDATE EMP SET EMPNO=2000,ENAME='YASER';COMMIT;التى اشار اليها الاخ محمد هل بعد when no_data_found ام قبل exception ارجو الرد وايضا انا اريد لن اعرف exception المضادwhen no_data_found تقديم بلاغ
بتاريخ: 3 ديسمبر 200718 سنة comment_117759 أخي البرنامج بشتغل صح بس المشكلة انك مش مخزن بيانات تلائم الوضع اللي انت فيهيعني مثلاً لازم يكون عندك موظفين اثنين رقمهم 1000ولازم يكون عندك مخزن موظف رقمه 2000كما انه لا يصح ان يكون اكثر من commit في نفس البرنامج لذلك يمكنك كتابة ال commit بعد جملة ال select وبالتالي فإنه عند تنفيذ اي exception فأنه عمل commit تقديم بلاغ
بتاريخ: 3 ديسمبر 200718 سنة comment_117810 السلام عليكم ورحمه الله وبركاتهاخى nhamzehn اظنك تقصد عمل commit اخر الكود وليس بعد select وارى من وجهه نظرى انه لايوجد اى مشكله فى عمل commit كل مره حتى ولو اكثر من مره لجمله واحده insert or update ولكن لايوجد داعى لذللك وهى لاتكون المشكله عند الاخ وليد تقديم بلاغ
بتاريخ: 3 ديسمبر 200718 سنة comment_117820 السلام عليكمأخى الكريم وليد حط فى الإعتبار دائماً عندما تستخدم select .إن ناتج هذه الجمله هناك 3 إحتمالات.1-ممكن الselect تجيب row واحدتحط بعد جملة الselectif v_empno is not null thenوتضع هنا اللى انت عايز تنفذهend if;2-وممكن أكثر من الrowتستخدم فيها when too_many_rows3-وممكن مفيش rows خالصتستخدم فيها when no_data_found تقديم بلاغ
بتاريخ: 4 ديسمبر 200718 سنة comment_117879 السلام عليكم ورحمه الله وبركاتهاشكر الاخ احمد على هذه الاجابه الجميله والمختصره ولكن لى تعليق بخصوص النقطه رقم واحد هو ان الافضل استخدام الجمله الاتيه select count(empno) into v_empno from emp where empno=1000 ; if v_empno=1 then My Code لان النقطه التى ذكرتها ممكن تاتى باكثر من صف واحد والتعامل معه يكون على انه صف واحد وان ارى والله اعلم اننا يجب ان نستخدم count فى كل الجمل لان الناتج سيكون قيمه واحده يمكن وضعها فى v_empno ولكن عند عدم استخدام count فمن الممكن ان يكون ناتج select اكثر من صف ولن تسمح v_empno ,v_ename إلا تخزين قيمه واحد فقط اومكن ان لانستخدم count ولكن لابد ان نعرف cursor نضع فيه ناتج select ونضع فيه جمل if خاصه %rowcount ارجو ان يكون الله وفقنى فى التوضيح وارجو المشاركه من باقى الاخوه رقنى الله وإياكم اتباع السلف الصالح تم تعديل 4 ديسمبر 200718 سنة بواسطة amr fawzy تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.