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

هل من الممكن البحث عن جدول أو أعمدة بدلالة البيانات


a5hhk

Recommended Posts

هل من الممكن البحث عن جدول أو عمود في قاعدة البيانات بدلالة البيانات
فمثلا أريد جملة تسترجع أعمدة في الجداول التي تحتوي على قيمة
MATH_COURSE
مثلا

فهل من الممكن ذلك؟

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

سؤالك ممتاز و سوف يفيد الجميع .... هذا هو الحل :-

select TABLE_NAME from USER_TAB_COLUMNS 
where COLUMN_NAME ='MATH_COURSE';



لاحظ كتابة أسم الحقل فى نهاية الكود بالحروف الكبتل .... لأن كل البيانات تكتب بالكبتل فى هذا الجدول و فى معظم الجداول الاخرى الموجودة بال DICTIONARY

للعلم ال DICTIONARY هو جدول ينشىء ذاتياً بداخل اى اسكيمة ، و هو يحتوى على جداول توصف الاسكيمة وصفاً دقيقاً .

و بالتوفيق أن شاء الله

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

السلام عليم و رحمة الله و بركاته

الأخ HANYFREEDOM
أعتقد ان الأخ a5hhk

من الممكن ان يكون يسأل عن شئ اخر
و ان كنت غير متأكد و الذي يمكن ان يفصل في ذلك هو الأخ صاحب السؤال نفسه


فانا فهمت انه ربما يسأل عن امكانية ايجاد الجداول و الأعمدة في جداول مستخدم معين و التي يحتوي اي عمود منها علي قيمة محددة مثل MATH_COURSE

و ذلك لاني اعتقد ان كلمة MATH_COURSE المتخذة كمثال هي اقرب لبيانات و ليست لاسم عمود

كما انه يسأل عن ارتجاع أعمدة اي اكثر من عمود به قيمة
و ان كان ما فهمته صحيحا
فنعم بمكن ذلك و لكنها من الممكن ان تأخذ بعض الوقت اذا كان حجم البيانات لديك كبير
و ذلك عن طريق انشاء الفانكشن الاتية


CREATE OR REPLACE FUNCTION get_col_name (
  i_owner		IN   VARCHAR2,
  i_search_val   IN   VARCHAR2
)
  RETURN CHAR
IS
  CURSOR c1
  IS
  SELECT   c.*
	  FROM dba_tables t, dba_tab_cols c
	 WHERE t.owner = UPPER (i_owner)
	   AND c.table_name = t.table_name
	   AND c.owner = t.owner
  ORDER BY c.table_name, c.column_name;

  v_sql	LONG;
  v_flag   NUMBER		   := 0;
  qt	   CHAR			 := CHR (39);
  v_val	VARCHAR2 (150)   := UPPER (i_search_val);
  v_ret	VARCHAR2 (20000);
BEGIN
  FOR rec IN c1
  LOOP
  v_sql := 'SELECT 1 FROM ' || rec.table_name || ' ';
  v_sql :=
		v_sql
	 || ' WHERE UPPER('
	 || rec.column_name
	 || ') LIKE '
	 || qt
	 || '%'
	 || v_val
	 || '%'
	 || qt;

  BEGIN
	 EXECUTE IMMEDIATE v_sql
				  INTO v_flag;
  EXCEPTION
	 WHEN NO_DATA_FOUND
	 THEN
		NULL;
	 WHEN TOO_MANY_ROWS
	 THEN
		v_flag := 1;
  END;

  IF v_flag = 1
  THEN
	 v_ret :=
			 v_ret || CHR (10) || rec.table_name || '.'
			 || rec.column_name;
  END IF;

  v_flag := 0;
  END LOOP;

  RETURN v_ret;
EXCEPTION
  WHEN OTHERS
  THEN
  RETURN 'ERROR RETURNING  DATA';
END;


و فكرة عمل هذه الفانكشن
هي عمل كيرسور به اسماء الجداول مع اعمدتها
ثم عمل ديناميك سيليكت تقوم باختيار فلاج من الجدول الحالي في اللوب بناء علي شرط ان العمود الحالي في اللوب يحتوي علي قيمة مشابهة للقيمة المراد البحث عنها فاذا تحقق الشرط يتم اضافة اسم الجدول مع اسم العمود الي متغير هو الذي ستقوم الفانكشن بارجاعه في النهاية و هو الذي يحتوي علي اسماء الأعمدة التي تحتوي علي بيانات مشابهة للنص المراد البحث عنه

ارجو ان تكون و اضحة
ملحوظة :
يمن اختيا ر الفانكشن من جملة استعلام عن طريق الاتي

SELECT GET_COL_NAME('SCOTT', 'SCOTT')
FROM  DUAL




و أرجو من صاحب السؤال ان يوضح هل فهمي لسؤاله هو الصحيح ام لا
مع تمنياتي بالتوفيق

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

كود أخى العزيز hanon_OCP هو الصحيح ...... و أعتذر لفهمى الخطأ للسؤال ..... مع تمنياتى بالتوفيق لأخى a5hhk

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

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

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

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

×   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.

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

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

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