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

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


hanyfreedom

Recommended Posts

من المفروض أن يقوم هذا الاجراء بمسح ال 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 الموجوده بالجدول ؟؟؟؟؟؟؟؟

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


رابط هذا التعليق
شارك

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

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



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

 SELECT *
FROM user_constraints WHERE table_name ='EMPLOYEESS';



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

رابط هذا التعليق
شارك

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

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

SELECT *
FROM user_constraints WHERE table_name ='EMPLOYEESS';



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

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

SELECT *
FROM user_constraints WHERE table_name ='EMPLOYEES';



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

رابط هذا التعليق
شارك

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


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

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;



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

رابط هذا التعليق
شارك

أخى الكريم sky information

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

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

رابط هذا التعليق
شارك

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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