RDBMS

Cursor And Loop

3 ردود في هذا الموضوع

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

لو سمحتم ابغى اتعلم cursor و loop على ايدي اناس فاهمين لاني بصراحة درسته بس الاستاذ ما كان يعرف يوصل المعلومة عدل

ممكن احد يشرحهم النا من البداية ويعطينا دروس وتطبيقات عليها؟؟

جزاكم الله خيرا

مع التحية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ابسم الله الرحمن الرحيم

يعد الكيرسور Cursor من اهم ادوات المبرمج كوسيلة للتعامل مع البيانات ..

فهو كائن له معاملة خاصه جدا و طرق استخدام متعدده و فوائد لا تعد و لا تحصى

هل للكيرسور اصناف معينة .؟

نعم و يصنف الى صنفين رئيسين هما

Implicit Cursor

و هو الكيرسور الذي تنشة قاعدة البيانات نفسها بدون تدخل المبرمج .

Explicit Cursor

و هو الكيرسور الذي يقوم المبرمج بأنشاءه بنفسه بشكل صريح .

ما هو الكيرسور ؟

بشكل بسيط جدا..

يمكن ان نقول ان الكيرسور هو خزان مؤقت للبيانات في ذاكرة الجهاز...

يمكن ان نقول ان الكيرسور هو جدول يحمل حجم كبير من البيانات يُحمل على الذاكرة

يمكن ان نقول ان الكيرسور هو متغير من نوع خاص للتعامل مع بيانات الجدول مرة واحدة

هل للكيرسور مكونات ؟

نعم الكيرسور باعتبارة كائن مثل اي كائن اخر في قاعدة البيانات له خصائص و مكونات و مجموعة من السمات .

كيف يتم التعامل مع الكيرسور .؟

اولا لابد من انشاء كائن يرث صفات الكيرسور و ذلك بتعريفه في منطقة الاعلان عن المتغيرات Declaration Section

SQL كودDeclare

Cursor Emp_Cur is select * from emp;

الان قمنا بأنشاء كيرسور جديد اسمة Emp_Cur مجهز لحمل بيانات جدول الموظفين Emp

انا بفضل ان اسم الكيرسور ينتهي ب _Cur للدلالة على ان هذا الكائن كيرسور او خزان بيانات

يمكن وضع اي شروط لجملة الاستعلام لبناء الكيرسور

الان لا بد من فتح هذا الكيرسور

... يعني ايه فتح الكيرسور يعني ... تحميل البيانات من قاعدة البيانات الى الخزان كأنك بترفع المياه من البئر لخزان المياة .

SQL

Begin

Open Emp_Cur;

..

..

..

بعد هذة المرحلة لابد من الحصول على بيانات من هذه الخزان و نشرب من البيانات اللي احنا عاوزينها .........

SQL

Fetch Emp_cur Into Emp_Rec;

...

...

خلي بالك لازم يكون فيه وعاء مناسب لاستيعاب البيانات من الخزان ... لذلك نعرف متغير مركب

Composite Variable من نفس نوع خزان البيانات

SQL كودEmp_Rec Emp_cur%RowType;

الان يمكن اغلاق الخزان لمنع تسرب المياة ........ و عدم التحميل الزائد على مصلحة المياة عفوا ....... الذاكرة ..

SQL كودClose Emp_Cur;

يمكن الان التعامل مع البيانات الموجوده في Emp_Rec كأي متغير عادي جدا جدا جدا ........

SQL كودv_Ename := Emp_rec.Ename ;

v_Empno := Emp_rec.Empno ;

V_sal := Emp_rec.Sal;

Example

SQL

declare

Cursor Emp_cur is select * from emp;

Emp_rec Emp_cur%RowType;

begin open Emp_cur;

fetch Emp_cur into Emp_rec;

dbms_output.put_line(Emp_rec.Ename || Emp_rec.Sal);

close Emp_cur;

end;

ايه يا عم ده ......... هو انا بعمل كل القصه ديه علشان اجيب مرتب الموظف و اسمة .......... ؟؟؟؟؟؟؟

لا طبعاُ...

انت ممكن تدخل الخزان في دورة مياة ........ عفوا..........دورة بيانات Loop

SQL كودfor I .. 1 .. 1000 loop

Fetch Emp_Cur into Emp_rec;

v_Ename := Emp_rec.Ename;

V_Sal := Emp_rec.Sal;

Exit when Emp_cur%NotFound;

end loo;

iممكن أسأل حضرتك سؤال يا مستر محمد ياسين ...؟؟؟

تفضل...

هو مفيش حاجة اسهل من كده ؟؟؟

فيه طبعا .......

ممكن نلغي الخطوة بتاعت فتح الخزان ............

يا سلام ..........

اه طبعا ُ .....................

اقولك كمان ممكن نلغي كمان ......... تعريف متغير مركب Emp_rec .....

لاء ......... بجد ...............

أه ...طبعاُ .

و ممكن كمان نلغي مرحلة اغلاق الخزان ...........

و ممكن كمان نلغي مرحلة الحصول على البيانات Fetch Into ...........

Exanmple:

SQL

declare

Cursor Emp_cur is select * from emp;

begin

FOR i IN Emp_cur

loop

dbms_output.put_line(i.Ename ||' ' ||i.Sal);

end loop;

end;

و كده اختصرنا العملية

صدقتني يا عم ..........

كمان حاجة جميلة شوية ممكن كمان نلغي مرحلة الاعلان عن الكيرسور ................ بجد ..

SQL

begin

FOR i IN (select * from emp) loop

dbms_output.put_line(i.Ename ||' ' ||i.Sal);

end loop;

end;

----------------------------------------------------------

%IsOpen to Check If Cursor Is Open or Not

%RowCount to Determine Number or Record in Cursor

%Found if Cursor Contain Data

%NotFound to Determine if Cursor Not contain data

Example

SQL

begin

delete emp where deptno=10;

dbms_output.put_line(SQL%rowCount || 'Row Deleted');

end;

هذا المثال لاظهار رسالة بعدد الصفوف التي تم حذفها ..

و هذا المثال يمثل الكيرسور من نوع Implicit لان قاعدة البيانات هي التي انشأت الكيرسور و ليس االمبرمج

يعني لو عملت اي جمل تتعامل مع الجداول

في قاعدة البيانات سواء اضافة او حذف او تعديل سوف تقوم اوراكل بانشاء كيرسور للتعامل مع البيانات بشكل ضمني

و عمل الدوران السابق دون ان تشعر بأي ألم او صداع .........

كيف اتعامل مع الكيرسور من نوع Implicit ?؟

للتعامل معه نستخدم SQL%

كودSQL%RowCount

SQL%Found

...

...

و لا ننسي ان الامثلة الاولى تمثل Explicit Cursor لاننا نحن الذين عرفنا الكيرسور ...........

اما المثال الاخير كمتا قلنا هو Implicit Cursor

'طبعا هناك المزيد في الكيرسور سوف اتحدث علية لاحقاُ ان شاء الله تعالى ...........

وعلى فكرة قبلا ما انسي بالنسبة احنا فقط تحدثنا عن الكيرسور الثابت بس ..............!!

مثال

declare

v_id number;

v_name varchar2(60);

cursor emp_tmp is

select employee_id,first_name

from employees

where department_id=60;

begin

open emp_tmp;

featch emp_tmp into v_id,v_name;

dbms_output.put_line('name='||v_name);

featch emp_tmp into v_id,v_name;

dbms_output.put_line('name='||v_name);

featch emp_tmp into v_id,v_name;

dbms_output.put_line('name='||v_name);

close emp_tmp;

featch emp_tmp into v_id,v_name;

dbms_output.put_line('name='||v_name);

end;

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

يعطيك العافية انا طالب هندسة ومعنا مقرر لل pl/sql ممكن يكون دروس فيها ومشكور جداا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .