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

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

Featured Replies

بتاريخ:

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

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

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

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

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

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

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

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

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.