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

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

صورة
- - - - -

ما الخطأ هنا


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

#1 hearthouse

hearthouse

    مشترك

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

تاريخ المشاركة 13 January 2007 - 02:36 PM

declare
e_emp_remain exception;
pragma exception_init(e_emp_remain,-02292);
begin
delete from departments where department_id=10;
exception
when e_emp_remain then
DBMS_OUTPUT.PUT_LINE('Cannot remove dept with employees in');
end;

هذا الكود بع تعريف لـــ Exception
المفروض ان delete from departments where department_id=10;
يقوم بحذف القسم رقم 10 لكن القسم رقم 10 به موظفين فلا يمكن حذفه ... و لكن الكود يعمل تمام و لا كأن في خطأ كان بيتم


و شوفو نتيجة تشغيل الكود , غريبة!!!!!!!! هنا

#2 هانى سند

هانى سند

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 13 January 2007 - 04:13 PM

السلام عليكم

ألاخ الكريم
الكود ليس به اي مشكلة او خطأ و هو سليم

و لكن اذا كنت تنفذ هذا الكود و يقوم فعلا بحذف الإدارة فالسبب إما
1-لا يوجد constraint العلاقة بين جدول department and emp

و ذلك سيكون صحيحا لو تم حذف الادارة و لكن الموظفين مازالوا موجودين

2- السبب الثاني اذا كان الconstraint موجودا هو ان يكون معرف مع وجود قاعدة الحذف
ON DELETE CASCADE

أو قاعدة الحذف
ON DELETE  SET  NULL

و في هذه الحالة اذا كانت الاولي فسيتم حذف الموظفين مع الادارة و يجب عليك إزالة الCONSTRAINT
و عمله مرة اخري بدون اي قواعد للDELETE
و في الحالة الثانية ستجد الموظفين موجودين و لكن رقم الادارة ب NULL
3- السبب الثالث هو انه كل شئ يعمل بالفعل و لكن و انه يوجد CONSTRAINT يمنع حذف الإدارة اذا كان بها موظفين
و لكن الرسالة لا تظهر بسبب عدم تشغيل البارمتر SERVEROUTPUT عن
طريق تشغيل الأمر
SET SERVEROUTPUT ON

في الSQLPLUS

و هذا مثال حتي تتأكد من أن الكود يعمل بشكل صحيح
SQL> declare
  2  e_emp_remain exception;
  3  pragma exception_init(e_emp_remain,-02292);
  4  begin
  5  delete from dept where deptno=20;
  6  exception
  7  when e_emp_remain then
  8  DBMS_OUTPUT.PUT_LINE('Cannot remove dept with employees in');
  9  end;
 10  /
Cannot remove dept with employees in											

تم بنجاح إجراء PL/SQL

SQL> select *  from  dept where  deptno=20;

	DEPTNO DNAME		  LOC												   
---------- -------------- -------------										 
		20 RESEARCH	   DALLAS												

SQL> select *  from  emp where deptno =20;

	 EMPNO ENAME	  JOB			  MGR HIREDATE		  SAL	   COMM	 
---------- ---------- --------- ---------- ---------- ---------- ----------	 
	DEPTNO																	  
----------																	  
	  7369 SMITH	  CLERK		   7902 17-12-1980		800				
		20																	  
																				
	  7566 JONES	  MANAGER		 7839 02-04-1981	   2975				
		20																	  
																				
	  7788 SCOTT	  ANALYST		 7566 19-04-1987	   3000				
		20																	  
																				

	 EMPNO ENAME	  JOB			  MGR HIREDATE		  SAL	   COMM	 
---------- ---------- --------- ---------- ---------- ---------- ----------	 
	DEPTNO																	  
----------																	  
	  7876 ADAMS	  CLERK		   7788 23-05-1987	   1100				
		20																	  
																				
	  7902 FORD	   ANALYST		 7566 03-12-1981	   3000				
		20																	  
																				



أعتقد انه تم توضيح كل الحالات الممكنة :rolleyes:
بالتوفيق

تم التعديل بواسطة hanon_OCP, 13 January 2007 - 04:14 PM.


#3 hearthouse

hearthouse

    مشترك

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

تاريخ المشاركة 13 January 2007 - 08:02 PM

تمام , لقد توصلت الي الحل , شكرا لك صديقى

#4 هانى سند

هانى سند

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 13 January 2007 - 11:29 PM

السلام عليكم
العفو يا باشا
و لكن ارجو توضيح اي حالة من الحالات السابقة التي حدثت معك ليستفيد من يقرا الموضوع لاحقا :rolleyes:
بالتوفيق

#5 hearthouse

hearthouse

    مشترك

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

تاريخ المشاركة 14 January 2007 - 12:43 AM

الخطأ كان فى اضافة جملة
SET SERVEROUTPUT ON