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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

سؤال فى Exception


8 رد (ردود) على هذا الموضوع

#1 waleedsh

waleedsh

    عضو

  • الأعضــاء
  • 4 مشاركة

تاريخ المشاركة 01 December 2007 - 10:18 AM

السلام عليكم ورحمه الله وبركاته
انا عند تريجر بعمل فيه SELECT على قيم معينه فى جدول انا اريد ان عمل EXCEPTION يعمل الاتى إذا لم يجد ناتج يقوم بعمل
INSERT وإذا وجد ناتج قام بعمل UPDATE فى حاله عدم وجود ناتج انا قمت بعمل WHEN NO_DATA__FOUND وفى حاله وجود ناتج
قمت بعمل WHEN TOO_MANAY_ ROWS ولكنها لم تعمل لماذا؟ [codebox]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[/codebox]


الكود لايوجد به اخطاء ولكن لايقوم بعمل UPDATE

تم التعديل بواسطة waleedsh, 01 December 2007 - 10:29 AM.


#2 samoracle

samoracle

    مشترك

  • الأعضــاء
  • 110 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 01 December 2007 - 01:01 PM

احذف كلمة
commit
من قال "استغفر الله الذى لا اله الا هو الحي القيوم واتوب اليه " ثلاث مرات
غفر له ذنوبه لوكانت مثل زبد البحر
القران الكريم

#3 Ahmed Farghaly

Ahmed Farghaly

    عضو نشط

  • الأعضــاء
  • 233 مشاركة

تاريخ المشاركة 01 December 2007 - 03:31 PM

بسم الله الرحمن الرحيم

عندما تستخدم 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 then
UPDATE EMP SET EMPNO=2000,ENAME='YASER';COMMIT;
end if;
Oracle Developer

OCP

ومــا توفيـقــى إلا باللـــــه

#4 waleedsh

waleedsh

    عضو

  • الأعضــاء
  • 4 مشاركة

تاريخ المشاركة 01 December 2007 - 06:09 PM

السلام عليكم ورحمه الله وبركاته
بخصوص الجدول emp فانا مستخدمه هنا كمثال فقط ولكن المشكله عندى فى جدول ليس فيه primary key وانا استخدمت
الطريقه السابقه ولم يحدث update لااعرف السبب ارجو الرد وياريت لو حد يقلنى exception المضاد ل when no_data_found
اى اذا وجد صف واحد فقط

#5 waleedsh

waleedsh

    عضو

  • الأعضــاء
  • 4 مشاركة

تاريخ المشاركة 03 December 2007 - 10:29 AM

السلام عليكم ورحمه الله وبركاته
ياجماعه اين اضع جمله
if v_empno is not null then
UPDATE EMP SET EMPNO=2000,ENAME='YASER';COMMIT;

التى اشار اليها الاخ محمد هل بعد when no_data_found ام قبل exception ارجو الرد وايضا انا اريد لن اعرف exception المضاد
when no_data_found

#6 nhamzehn

nhamzehn

    مشترك

  • الأعضــاء
  • 187 مشاركة
  • الاهتمامات:المطالعة

تاريخ المشاركة 03 December 2007 - 10:52 AM

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

يعني مثلاً لازم يكون عندك موظفين اثنين رقمهم 1000
ولازم يكون عندك مخزن موظف رقمه 2000
كما انه لا يصح ان يكون اكثر من commit في نفس البرنامج لذلك يمكنك كتابة ال commit بعد جملة ال select وبالتالي فإنه عند تنفيذ اي exception فأنه عمل commit
سبحان الله وبحمده سبحان الله العظيم

اللهم لك الحمد والشكر كما ينبغي لجلال وجهك وعظيم سلطانك

#7 amr fawzy

amr fawzy

    مشترك

  • الأعضــاء
  • 132 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 03 December 2007 - 05:25 PM

السلام عليكم ورحمه الله وبركاته
اخى nhamzehn اظنك تقصد عمل commit اخر الكود وليس بعد select وارى من وجهه نظرى انه لايوجد اى مشكله فى عمل commit كل مره حتى ولو اكثر من مره لجمله واحده insert or update ولكن لايوجد داعى لذللك وهى لاتكون المشكله عند الاخ وليد

#8 Ahmed Farghaly

Ahmed Farghaly

    عضو نشط

  • الأعضــاء
  • 233 مشاركة

تاريخ المشاركة 03 December 2007 - 07:02 PM

السلام عليكم

أخى الكريم وليد حط فى الإعتبار دائماً عندما تستخدم select .
إن ناتج هذه الجمله هناك 3 إحتمالات.

1-ممكن الselect تجيب row واحد
تحط بعد جملة الselect
if v_empno is not null then
وتضع هنا اللى انت عايز تنفذه
end if;

2-وممكن أكثر من الrow
تستخدم فيها when too_many_rows

3-وممكن مفيش rows خالص
تستخدم فيها when no_data_found
Oracle Developer

OCP

ومــا توفيـقــى إلا باللـــــه

#9 amr fawzy

amr fawzy

    مشترك

  • الأعضــاء
  • 132 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 04 December 2007 - 10:21 AM

السلام عليكم ورحمه الله وبركاته
اشكر الاخ احمد على هذه الاجابه الجميله والمختصره ولكن لى تعليق بخصوص النقطه رقم واحد هو ان الافضل استخدام الجمله الاتيه
[codebox]select count(empno) into v_empno from emp where empno=1000 ;
if v_empno=1 then
My Code[/codebox]
لان النقطه التى ذكرتها ممكن تاتى باكثر من صف واحد والتعامل معه يكون على انه صف واحد وان ارى والله اعلم اننا يجب ان نستخدم count فى كل الجمل لان الناتج سيكون قيمه واحده يمكن وضعها فى v_empno ولكن عند عدم استخدام count فمن
الممكن ان يكون ناتج select اكثر من صف ولن تسمح v_empno ,v_ename إلا تخزين قيمه واحد فقط
اومكن ان لانستخدم count ولكن لابد ان نعرف cursor نضع فيه ناتج select ونضع فيه جمل if خاصه %rowcount
ارجو ان يكون الله وفقنى فى التوضيح وارجو المشاركه من باقى الاخوه رقنى الله وإياكم اتباع السلف الصالح

تم التعديل بواسطة amr fawzy, 04 December 2007 - 10:23 AM.