hanyfreedom بتاريخ: 27 سبتمبر 2007 تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2007 من المفروض أن يقوم هذا الاجراء بمسح ال 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 الموجوده بالجدول ؟؟؟؟؟؟؟؟و شكراً ........ منتظر الرد اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaledmega بتاريخ: 27 سبتمبر 2007 تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2007 السلام عليكماولا ارى انه خطاء منطقى ؛ وقد تقول ان الكود لم يصدر عنه اى خطاء ولكن الخطاء الذى اقصده ليس فى كتابة الكود ولكن ما يستدعيه الكود ؛ انظر اخي للمثال التالي وسترى بنفس الفرق فى نتائج الكود ؛ ولا تنسي بالطبع تطبيق المثالين الاتيين لترى الفرق بنفسك : SELECT CONSTRAINT_NAME , CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMPLOYEES'; وانظر نتيجة الكود السابق ثم انظر لنتيجة الكود الخاص بك الذى كتبته انت هو التالي : SELECT * FROM user_constraints WHERE table_name ='EMPLOYEESS'; اذا لم تفهم مقصدى بعد ان ترى الفرق سوف اقوم بشرحه لك بأذن الله ولكن ابسط شرح ان الكود الخاص بك مرتبط بقيود مشبكة مع صلاحيات النظام وضف الي ذلك ان هناك قيود خاصة ب DBMS و DBA و TABLE SPACE وقيود اخرى كثيرة وانت تريد ان تسقط كل هذه الصلاحيات من جذورها ؛ ارجوا ان اكون قد اوضحت لك مقصدى .وشكراميجا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 27 سبتمبر 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2007 أخى العزيز ميجا شكراً لأهتمامك بموضوعى ....... و لكن أحب ان الفت أنتباهك أنك اخطأت دون أن تقصد فى كودك الثانى الذى كتبته هكذا :- SELECT * FROM user_constraints WHERE table_name ='EMPLOYEESS'; حيث و ضعت S أضافية على كلمة Employees مما سيؤدى الى عدم ظهور اى نتائج .و أعتقد أنك كنت تقصد كتابته هكذا :- SELECT * FROM user_constraints WHERE table_name ='EMPLOYEES'; مع جزيل الشكر لأهتمامك ........ و مازلت فى أنتظار تفسير للمشكلة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sky information بتاريخ: 28 سبتمبر 2007 تقديم بلاغ مشاركة بتاريخ: 28 سبتمبر 2007 السلام عليكم الأخ \ هاني المشكلة تقع في : 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; تحياتي ............. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 28 سبتمبر 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 28 سبتمبر 2007 أخى الكريم sky informationأنا جربت كلامك ، و طلع فعلاً صحيح شكراً جزيلاً لك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.