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

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

صورة
- - - - -

الأجراء لا يقوم بمسح ال Constraints الموجوده بالجدول


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

#1 hanyfreedom

hanyfreedom

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

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 27 September 2007 - 02:18 PM

من المفروض أن يقوم هذا الاجراء بمسح ال Constraints الموجود فى الجدول الذى سيكتب أسمه فى ال Parameter

CREATE OR REPLACE PROCEDURE drop_cons (table_n VARCHAR2)
IS
   v_statement   VARCHAR2 (200);
BEGIN
   FOR i IN (SELECT *
			   FROM user_constraints
			  WHERE table_name = UPPER ('table_n'))
   LOOP
	  v_statement :=
		 'alter table ' || table_n || ' drop constraint '
		 || i.constraint_name;

	  EXECUTE IMMEDIATE v_statement;
   END LOOP;
END;
/


و بعد ذلك قمت بأنشاء جدول eee و هو نسخة طبق الأصل من جدول ال Employees بالتالى :-

CREATE TABLE eee AS SELECT*FROM hr.employees;


و هذا تأكيد من وجود Constraints عليه :-

SELECT constraint_name
  FROM user_constraints
 WHERE table_name = UPPER ('eee');


و بعد ذلك - و هنا المشكلة - عندما جئت لأنفذ الكود ... هكذا :-

EXECUTE drop_cons('eee')


فقال :-

PL/SQL procedure successfully completed.

و لكن عند عمل عبارة ال select السابقة للتاكد من خلو الجدول من ال Constraints اللى فيه .... ظهر لى نفس النتائج التى كانت قد ظهرت قبل تنفيذى للأجراء ..... هذه هى النتائج :-

CONSTRAINT_NAME
---------------
SYS_C005891
SYS_C005892
SYS_C005893
SYS_C005894


فأريد أن أعرف أين المشكلة بالظبط التى جعلت الاجراء لا يمسح ال Constraints الموجوده بالجدول ؟؟؟؟؟؟؟؟

و شكراً ........ منتظر الرد




#2 khaledmega

khaledmega

    عضو مميز

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

تاريخ المشاركة 27 September 2007 - 09:45 PM

السلام عليكم
اولا ارى انه خطاء منطقى ؛ وقد تقول ان الكود لم يصدر عنه اى خطاء ولكن الخطاء الذى اقصده ليس فى كتابة الكود ولكن ما يستدعيه الكود ؛ انظر اخي للمثال التالي وسترى بنفس الفرق فى نتائج الكود ؛ ولا تنسي بالطبع تطبيق المثالين الاتيين لترى الفرق بنفسك :

SELECT CONSTRAINT_NAME , CONSTRAINT_TYPE
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES';

وانظر نتيجة الكود السابق ثم انظر لنتيجة الكود الخاص بك الذى كتبته انت هو التالي :

SELECT *
 FROM user_constraints WHERE table_name ='EMPLOYEESS';

اذا لم تفهم مقصدى بعد ان ترى الفرق سوف اقوم بشرحه لك بأذن الله ولكن ابسط شرح ان الكود الخاص بك مرتبط بقيود مشبكة مع صلاحيات النظام وضف الي ذلك ان هناك قيود خاصة ب DBMS و DBA و TABLE SPACE وقيود اخرى كثيرة وانت تريد ان تسقط كل هذه الصلاحيات من جذورها ؛ ارجوا ان اكون قد اوضحت لك مقصدى .
وشكرا
ميجا

من أهـم مواضــيعي :



نفسك تسطب اوراكل 10g وبالصور وتربط بين الداتابيز والديفولبر ؟


للأستفسار عن أى شيء يخص الأوراكل أبس أو اوراكل ديفولبر راسلنى على

e
ng-mega@hotmail.com

 

Oracle Apps Techno-Functional Consultant


Oracle Developer & Instructor

 

Instructor At Next Academy

 

محاضر معتمد لدي نكست أكاديمي

OCA - OCP

م / خالد الشاذلي


#3 hanyfreedom

hanyfreedom

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

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 28 September 2007 - 01:25 AM

أخى العزيز ميجا

شكراً لأهتمامك بموضوعى ....... و لكن أحب ان الفت أنتباهك أنك اخطأت دون أن تقصد فى كودك الثانى الذى كتبته هكذا :-

SELECT *
FROM user_constraints WHERE table_name ='EMPLOYEESS';

حيث و ضعت S أضافية على كلمة Employees مما سيؤدى الى عدم ظهور اى نتائج .

و أعتقد أنك كنت تقصد كتابته هكذا :-

SELECT *
FROM user_constraints WHERE table_name ='EMPLOYEES';


مع جزيل الشكر لأهتمامك ........ و مازلت فى أنتظار تفسير للمشكلة


#4 sky information

sky information

    عضو نشط

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

تاريخ المشاركة 28 September 2007 - 03:09 PM

السلام عليكم الأخ \ هاني


المشكلة تقع في :

FOR i IN (SELECT *
FROM user_constraints
WHERE table_name = UPPER ('table_n'))


هنا يجب إزالة العلامة علامة ' ' من كلمة table_n

هذا الكود بعد التعديل انا جربته ضبط نعي 100%:

create or replace procedure drop_cons(table_n varchar2)
is
v_statement varchar2(200);
begin
for i in(select constraint_name from
user_constraints
where table_name =upper(table_n))
loop
v_statement:= 'alter table '||table_n|| ' drop constraint '||
i.constraint_name;
execute immediate v_statement;
end loop;
end;

تحياتي .............

#5 hanyfreedom

hanyfreedom

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

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 28 September 2007 - 03:51 PM

أخى الكريم sky information

أنا جربت كلامك ، و طلع فعلاً صحيح

شكراً جزيلاً لك