بتاريخ: 27 يناير 200818 سنة comment_121390 السلام عليكم و رحمة الله و بركاته اخواني ارجو توضيح حول ماهية الكورسر و كيفية عمله و يا ريت بعض الامثلةو رحم الله والديكم دنيا و اخرة تقديم بلاغ
بتاريخ: 27 يناير 200818 سنة comment_121439 الكيرسور يستفاد منه بعمل لووب على البانات وتنفيذ عمليات على السجلات او الاستفادة من قيم الها ولا يمكن حصر فوائده بهذه العجالةمن أبسطها هذا المثالbeginfor rec in(select distict deptnofrom emp) loopif rec.deptno=10 thenupdate emp set sal=sal + 100where deptno=rec.deptno;end loop;commit;end; تقديم بلاغ
بتاريخ: 27 يناير 200818 سنة comment_121440 تصحيح للسابقbeginfor rec in(select distict deptnofrom emp) loopif rec.deptno=10 thenupdate emp set sal:=sal + 100where deptno=rec.deptno;elsif rec.deptno=20 thenupdate emp set sal:=sal + 200where deptno=rec.deptno;end if;end loop;commit; تقديم بلاغ
بتاريخ: 27 يناير 200818 سنة comment_121454 السلام عليكمابسط شرح للكيرسور ؛ هو انه جملة سليكت متطورة فبه تسطيع اختيار اى عامود من اى جدول وعرضه ؛ والسؤال ما دام جملة السليكت العادية تقوم بمنادة العواميد وايضا الكيرسور يقوم بنفس الاداء فما الفرق ؟ الفرق انه فى الفورم يمكن استدعاء الكيرسور فى اكثر من مكان و بالتالي لا تحتاج الى كتابتها اكثر من مرة - اى جملة السليكت - ايضا الفرق الجوهرى ان الكيرسور اقوى فى التعامل مع استدعاء البيانات خاصة فى حالة البيانات المجدولة وهى التى تعود بأكثر من صف كما ذكر الاخ الفاضل فى احد الردود السابقة وهى عند عمل loop فلا يمكن استخدام جملة سليكت ترجع بأكثر من صف الا من خلال الكيرسور ؛ ايضا يمكن تطوير الكيرسور الى الريف كيرسور ref cursor وهو استخدام اكثر من جملة سليكت على اكثر من جدول بأكثر من شرط وهو من الانواع المتقدمة قليلا على المبتدئين .ارجوا ان تكون الصورة قد وضحت ولو بالقليل .والله الموفقوشكرا ميجا تقديم بلاغ
بتاريخ: 18 فبراير 200818 سنة comment_122636 اخى الفاضل ashraf_al_ani الكيرسور هو عبارة عن منظم لكيفية جلب اكثر من سجل من ال active set والتى تاتى من قاعدة البياناتلان ال active set تكون فى الزاكرة , معنى ذلك ان الكيرسور يتعامل مباشرة مع ال active set وليس مع قاعدة البياناتوال active set هذه تتم فى الزاكرة عند جلب السجلات من قاعدة البيانات حتى ولو كانت سجل واحد يتم عمل لها active set ولكن بدون كيرسور , لان الكيرسور يتعامل فقط مع ال السجلات الكثيرة فى الactive set اما فى حالة سجل واحد فيتم اظهاره وغلق ال active set .ملاحظة الكيرسور يتم انشائه عند التعامل مع البيانات سواء بلغة ال SQL او لغة PL/SQL اما فى ال SQL يتم عمل كيرسور ضمنى من جانب ال engin وهو المنظم لاظهار السجلات دون تدخل المطور ,اما فى ال PL/SQL لابد من انشائه لتتعامل مع ال active set لانك تحدد مكان معين لاخراج البيانات من ال active set وفى الغالب تكون المتغيرات التى تكون هى قالب البيانات الاتية من ال active setان شاء الله تكون الامور اتضحت امامك واتمنى الاخوة الى ميعرفش حاجة ياريت ميعطيش معلومات غلط او مبهمة.تحياتى تقديم بلاغ
بتاريخ: 18 فبراير 200818 سنة comment_122679 شكرا لكم على الايضاح لى سؤال اخر ... فيما يتعلق بحجم البيانات والتعامل مع جداول تحتوى سجلات كثيرة خمسمائة الف سجل او مليون سجل السؤال : هل يتم تحميل البيانات من قاعدة البيانات الى الذاكرة مرة واحدة أو يتم تقسيمها على مجموعات ثم تحميلها فى الbuffer area وافراغها ثم تحميل مجموعة اخرى ...وهل توجد امكانية لاجراء هذا التقسيم أو التحكم فى عدد السجلات المسترجعه فى الدفعة الواحدة ام يتم التحميل للبيانات دفعة واحدة فى الذاكرة ... وخاصة عند وجود اكثر من كيرسور يتعامل مع جداول كبيرة اريد ان اعرف مفهوم نقل البيانات من الديسك الى الذاكرة فى حالة الجداول الكبيرة مليون سجل مثلا ومع وجود اكثر من كيرسور نفس السؤال ايضا عند التعامل مع الشاشات المصممه بشكل سجلات تكرارية tabulare >> كيف يتم تحميل البيانات طبعا هذا السؤال له اهمية عند التعامل مع بيئة ال web application شكرا لكم ... وجزاكم الله خيرا تقديم بلاغ
بتاريخ: 18 فبراير 200818 سنة comment_122705 أنا رأيي في هذه الحالة يتم عرض سجل سجل لو كنت تتعامل مع جدول تعريفي ( Declare ) . أما إذا كان هذا الجدول له ربط خارجي ويحتوي علي سجلات كبيبة ففي هذه الحالة لا يجوز إستخدام الـ Cursor بل يتم عرض سجل بيانات الحقل الخارجي الحالي للجدول !!!!بمعني ، نفرض أننا لدينا جدول يدعي Customer أي الزبائن أو الأشخاص ، هذا الجدول يحتوي علي 500،000 سجل كعلي سبيل المثال ، في حالة الرغبة في إنشاء نموذج خاص ( تعريفي ) له من المفضل عرض سجل سجل لهذا الجدول.أما في حالة إرتباطة مع جداول أخري مثل جدول Invoice الخاصة بالفواتير فمن الطبيعي أنك ستعرض في نافذة تعريف الفاتورة إسم ( المورد / العميل ) ، ففي هذه الحالة لا يجوز إستخدام آداة الـ List Item حتي لا تضطر لإستخدام Cursor علي جدول Customer لجلب كافة العملاء أو الموردين . بل أفضل الحلول هو جلب رقم الـ Customer الذي يمثل الـ PK بحيث أن يتم إرتجاع سجل واحد ثم تعرض البيانات علي Display Item !!!أما موضوع التقارير فيختلف عن النماذج ، فحسب القيمة الشرطية المدخلة لجملة الإستعلام وذلك بواسطة المستخدم ، علي سبيل المثال ، أنت ترغب في بناء تقرير يحتوي علي كافة العملاء والموردين بحيث أن يجب إدخال شرط من قبل المستخدم ، ففي حالة إدخال هذا الشرط في هذه الحالة سيتم عرض التقرير سريعاً حسب عدد السجلات المرتجعة . أما في حالة رغبة المستخدم من عرض كافة بيانات التقرير فهذا يختلف في عملية السرعة ، حيث يرتجع كافة السجلات بالجدول .شكراً أخي الكريم وأتمني لك التوفيق تقديم بلاغ
بتاريخ: 18 فبراير 200818 سنة comment_122731 السلام عليكمعند تنفيذ الكيرسور يقوم باسترجاع كل البيانات وحفظها فى منطقى تسمى ACTIVE SET وهي المرحلة التى قبل FETCH وعند عرض البيانات يقوم نقلها من ACTIVE SET الى المستخدم دفعة واحدة .اما عن استرجاع عدد معين من السجلات فهذا يعتمد على جملة الشرط الموجود فى جملة السليكت وشكراميجا تقديم بلاغ
بتاريخ: 18 فبراير 200818 سنة comment_122741 الاخ / MMA شكرا لكالاخ / خالد شكرا لك شكرا على سرعة الاستجابه وعلى المعلومات المفيدة ... من المعروف ان سرعة نقل البيانات فى بيئة الويب ابليكيشين web application تختلف عن سرعة نقل البيانات فى بيئة الخادم والعميل client / server windows application لذلك هناك توصيات او خصائص كانت فى اصدار ديفيلوبر 6 لم تعد موجودة فى ديفيلوبر 10 جي ... وذلك حفاظا على عنصر السرعة فى التعامل مع البيانات ... لكن السؤال الاخر ... بعد ان يتم تحميل كافة السجلات (50000 سجل ) فى ال active set ... من خلال برنامج يستخدمه احد المستخدمين للتعديل فى الراتب الاساسي (علاوه مثلا لجميع العاملين ) على سبيل المثال ... وكان هناك مستخدم اخر يقوم بالتعديل على الراتب للموظف الذى يتعامل معه المستخدم الاول ... فاي راتب الذى سيعدل به بيانات الموظف المحدد ؟؟للحقيقه كنت اعتقد ان حجم البيانات الكبير من السجلات تنتتقل على شكل مجموعات ( حزم ) من خلال مفهوم ال swap حفاظا على سرعة نقل البيانات شكرا ... مرة اخرى تم تعديل 18 فبراير 200818 سنة بواسطة Ahmed_oracle تقديم بلاغ
بتاريخ: 19 فبراير 200818 سنة comment_122806 بسم الله الرحمن الرحيم.تكملة مهمة للكلام عن ال cursor و هى :-1- ال select statement تعتبر implicit cursor أى عند تنفيذها يتم وضعها فى cursor تقوم الأوراكل بعمله ضمنيا و تحجز له مساحة من ذاكرة الجهاز لتسترجع فيه البيانات المطلوبة و تتولى أيضا عملية فتحه open و استرجاع البيانات فيه fetch و إغلاقه close أما إذا قمت بعمله أنت فتكون أنت المسئول عن جميع العمليات السابقة مما يعطيك حرية أكبر فى التعامل مع كل جزئية من تلك العمليات 2- ال cursor يعفيك من عمل ال Exception فى حالة رجوع أكثر من سجل أو عدم رجوع سجلات على الإطلاق.و بالنسبة لسؤالك الأخر و الذى كان : السؤال الاخر ... بعد ان يتم تحميل كافة السجلات (50000 سجل ) فى ال active set ... من خلال برنامج يستخدمه احد المستخدمين للتعديل فى الراتب الاساسي (علاوه مثلا لجميع العاملين ) على سبيل المثال ... وكان هناك مستخدم اخر يقوم بالتعديل على الراتب للموظف الذى يتعامل معه المستخدم الاول ... فاي راتب الذى سيعدل به بيانات الموظف المحدد ؟؟فإنه سيتم التعديل على كل session و صاحب أخر commit هو الذى سيتم تفعيل تعديله. إذا أردت تفادى هذا يمكنك إستخدام قيد SELECT ................ FOR UPDATE و الذى يقوم بحجز السجلات التى قمت باسترجاعها لل session التى تم الاسترجاع منها فقط و بالتالى لن يتم حدوث تعديلات على هذه السجلات الا من خلال تلك ال session حتى إغلاقها أو إغلاق ال cursor المسئول عن استرجاع البيانات. السلام عليكم و رحمة الله و بركاته. تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.