بتاريخ: 23 مارس 200718 سنة comment_94772 السلام عليكم و رحمة الله و بركاته الإخوة الكرام إليك هذه الFUNCTION و التي يمكن استخدامها للبحث عن أسماء الجداول و الأعمدة الي تحتوي علي بيانات معينة يتم البحث عنها فمثلا إذا اردت معرفة اي الجداول و الأعمدة التي تحتوي علي كلمة SCOTTيكنك استخدام هذه الFUNCTION و التي ستقوم بارجاع الناتج لك علي شكل اسم الجدول.اسم العمود كلا في سطر منفصل اليكم الكود 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; شرح بسيط:و فكرة عمل هذه الفانكشن هي عمل كيرسور به اسماء الجداول مع اعمدتها ثم عمل ديناميك سيليكت تقوم باختيار فلاج من الجدول الحالي في اللوب بناء علي شرط ان العمود الحالي في اللوب يحتوي علي قيمة مشابهة للقيمة المراد البحث عنها فاذا تحقق الشرط يتم اضافة اسم الجدول مع اسم العمود الي متغير هو الذي ستقوم الفانكشن بارجاعه في النهاية و هو الذي يحتوي علي اسماء الأعمدة التي تحتوي علي بيانات مشابهة للنص المراد البحث عنه مثال علي كيفية استخدامها من الSQL SELECT GET_COL_NAME('SCOTT', 'SCOTT') FROM DUAL ملحوظة :الFunction تعمل علي اصدار قاعدة البيانات بدءا من 8iمع تمنياتي بالتوفيق تقديم بلاغ
بتاريخ: 23 مارس 200718 سنة comment_94804 رائع جدا اخي العزيز hanon_OCP وجاري التجربة ....... تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.