الانتقال إلى المحتوى
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.

سؤال فى Exception

Featured Replies

بتاريخ:

السلام عليكم ورحمه الله وبركاته
انا عند تريجر بعمل فيه 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

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

بتاريخ:

احذف كلمة
commit

بتاريخ:

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

عندما تستخدم 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;

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

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

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

السلام عليكم ورحمه الله وبركاته
ياجماعه اين اضع جمله
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

بتاريخ:

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

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

بتاريخ:

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

بتاريخ:

السلام عليكم

أخى الكريم وليد حط فى الإعتبار دائماً عندما تستخدم 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

بتاريخ:

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

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
ارجو ان يكون الله وفقنى فى التوضيح وارجو المشاركه من باقى الاخوه رقنى الله وإياكم اتباع السلف الصالح

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

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

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

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

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

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

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.