miash80 بتاريخ: 16 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 16 ديسمبر 2009 اخواني واخواتي مشرفين وأعضاء السلام عليكم ورحمة الله وبركاته وانا اسف للأنقطاع عن المنتدى مدة طويلة بسبب ظروف الحياة .وشكر خاص لكل من سئل عنيوالله يسعدكم جميعااليوم والحمدلله بدءت بكتابة بعض الدروس التي تشمل قسم PL/SQL من الألف الى الياء واليوم سأضع اول درس وإن شاء الله ان اكون قد وفقت في كتابة هذه الدروس ولن اضع الدرس التالي الا في حالة أستعياب الدرس الاول للجميع لذلك اطلب من اي عضو او مشترك طرح اي سؤال اول باول في اي درس سيتم طرحه مع رجاء خاص ان تكون الاسئلة طمن الدرس لكي لا يتشتت تفكير اي مشترك.وبسم الله بندء .....مقدمة صغيرة لغة PL/SQL تعتبر لغة البرمجة الخاصة بنظام اوراكل وهي اداة برمجية قوية جدا وكلمة PL/SQL اختصاراً لـ (Procedure Language/Structure Query Language ) وتستخدم هذه اللغة لتجهيز نظام Oracle عن طريقة معالجة التسجيلات وتستخدم أيضاً في أدوات التطوير المنتجة من قبل شركة Oracle وهي تعتبر أساس برنامج بناء النماذج Oracle Forms و Oracle Reports وتستخدم هذه اللغة أيضاً لتعريف نموذج ما ، والقيام ببعض الحسابات الخاصة في تقرير ما ، ومن أجل التسجيلات الدرس الاول في ال Pl/Sql هو كتابة البرنامج البسيط وشرح مكونات البرنامج بالتفصيل Declare (Optional) هذا الجزء اختياري بس اذا كان هنالك متغيرات يكون أجباري Variables Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها begin (Mandatory) بداية البرنامج وهذا الجزء أجباري Eexcutable Section هنا يكتب كود البرمجة الخاص بالبرنامج Pl/Sql Code Exception (Optional)هذا الجزء خاص بمعالجة أخطاء البرنامج وهو أختياري ولكن انا بنظري هذا الجزء يجب ان يكون اجباري Error Hanling Section Error Type انواع الاخطاء 1) Syntax Error (Compilaion) 2)Run Time (Logical Error) end; (Mandatory) نهاية البرنامج وهذا الجزء أجباري قبل البدء في اعطاء امثلة يجب التذكير بانواع البيانات (Data Types) Varibale Data Type 1) V1 Number عدد صحيح 2) V2 Number(,) عدد حقيقي 3) V3 Varchar2( ) متغير نصي 4) V4 Boolean المتغير المنطقي ويأخذ خيارين a)True b)False 5) V5 Table-Name.Column-Name%Type; يأخذ نفس مواصفات حقل معين في احد الجداول Example : V5 Emp.Empno%type; Emp في جدول الـــEmpno أخذت نفس نوع الحقل V5 6) V6 Table-name%Rowtype; يأخذ نفس مواصفات جدول معين ونتعامل مع هذا المتغير كما نتعامل مع جدول Example : V6 Emp%rowtype; ويستخدم بهذه الطريقة V6.Empno Or V6.Ename Or V6.sal ....Ext 7) V7 Cursor وهذا المتغير له درس مستقل في الدروس القادمة أنشاء الله 8) V8 Cursor-Name%Rowtype; أنشاء الله Cursor وهذا تابع في درس ال كما احب ان اذكربــــ جمــــــل If Statment وأنواعها 1)If Condition then Code .....; end If; 2)If Condition then Code .....; elsif Code....; end If; 3)If Condition then Code .....; elsif Code....; elsif Code....; else Code...; end If; 4)If Condition1 then Code .....; If Condition2 then Code....; If Condition3 then Code....; End If; ---Condition3 End If; ---Condition2 End If; ---Condition1 هنا سنشرح الحلقات او حلقة التكرار وانواعها طبعا يجب وضع شرط للخروج من الحلقة 1) For Loop Example1 : اريد ان اطبع من رقم واحد الى رقم عشرة For i in 1..10 loop طبعا اجباري من الصغير للكبير دائما end loop; Example2 : اريد ان اطبع من رقم واحد الى رقم عشرة بالعكس For i in reverse 1..10 loop أنتبه اجباري من الصغير للكبير دائما end loop; 2) While Loop While Condition Loop يجب وضع شرط لايقاف الحلقة Code .....; end Loop; Example :اريد طباعة الراتب لغاية ما يصير الراتب يساوي 1000 دينار While sal = 1000 loop Code .....; sal:=sa+10; end loop; 3)loop Loop Code ....; Exit When Condition; end loop; Example : أريد ان يعمل اضافة على الراتب لغاية ما يصير الراتب اقل أو يساوي500 دينار Loop Code ....; Exit When sal <= 500; end loop; أتمنى ان اكون اوصلت معلومة بشكل صحيح ومناسب فإن أصبت فمن الله وإن أخطأت فمن الشيطان ،،إن شاء الله في المرة القادمة بعد الأخذ برأيكم وأسئلتكم سأبدء بكتابة الامثلة إن شاء اللهأدعو لي بالتوفيق 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 17 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 17 ديسمبر 2009 السلام عليكم ورحمة الله وبركاتهاخواني واخواتي الاعزاءلا ادري الموضوع من ثلاث ايام و71 قراءة ولا رد واحدلا ادري هل اكمل الدروس اما لا ..... 3 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 17 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 17 ديسمبر 2009 السلام عليكم ورحمة الله الأخ / miash80منذ فترة طويلة لمن نرى لك مشاركات معنا بالمنتدى ... والعودة قويه ... جهد متميز فى العرض وطريقة الشرح استمر وستجد الكثير من الأعضاء... يتابعون شرحك جزاك الله خيرا 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المحب لله بتاريخ: 18 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 18 ديسمبر 2009 السلام عليكم ورحمة الله وبركاته توكل على اللهاكمل بقيت الشرحاسلوب رائع فى الشرح ومبسطعلى بركة الله والله المستعان 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 19 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 وعليكم السلام ورحمة الله وبركاته اهلا وسهلا بالاخ والاستاذ الكبير مهندس أمجدانا أسف للأنقطاع عن المنتدى بسبب مشاغل الحياةولكن ان شاء الله سأستمر في التواجد في المنتدى 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 19 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 (معدل) السلام عليكم ورحمة الله وبركاته توكل على اللهاكمل بقيت الشرحاسلوب رائع فى الشرح ومبسطعلى بركة الله والله المستعان وعليكم السلام ورحمة الله وبركاته اهلا بأخي الفاضل المحب للهاليوم أخي العزيز سأكتب الامثلة وارجوا ان تكون كافية للشرح الدرس تم تعديل 19 ديسمبر 2009 بواسطة miash80 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 19 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 اليوم سنبدء ببعض الامثلة البسيطة .ولكن قبل ذلك يجب معرفة بعض الامور بالنسبة للغة الــــــPL/SQL 1) يجب قبل كتابة اي برنامج في هذه اللغة كتابة هذه الجملة set serveroutput onلكي تظهر نتيجة اي برناج على الشاشة وبدون هذه الجملة لن تظهر اي نتيجة على الشاشة وبالامكان تجربة البرنامج مع او بدون هذه الجملة .طبعا تكتب هذه الجملة مرة واحدة في كل مرة نفتح فيها شاشة ال Oracle SQL*Plus2) يجب ان ينهتي أي امر في هذه اللغة بـــ ; و بعد كل تعريف موجود في البرنامج تنتهي بــــ ;3) لأدخال اي قيمة في البرنامج يوضع & بعد كتابة المتغير مع اشارة := على سبيل المثال عندي متغير واسمه x واريد ان ادخل قيمة x اكتب التالي x:=&x طبعا بعد & ممكن اكتب اي شي انا اريده يعني ممكن ان اكتب x:=&sal; 4) dbms_output.put_line(' '); هذه الجملة لاخراج النتائج على الشاشة5) لاعادة تنفيذ البرنامج نكتب / ثم Enterطبعا هذه الامور ليست كل شيئ وعند اللزوم يمكن ان نحتاج للأوامر أخرى توضح في وقتها .نبدء في اول مثال .اريد كتابة برنامج يقسم رقمين ويعطيني الناتج ((( برنامج سهل جداااا))) SQL> set serveroutput on SQL> declare 2 a number; 3 b number; 4 c number; 5 begin 6 a:=&a; 7 b:=&b; 8 c:=a/b; 9 dbms_output.put_line('Result Is '||c); 10 end; 11 / Enter value for a: 49 old 6: a:=&a; new 6: a:=49; Enter value for b: 7 old 7: b:=&b; new 7: b:=7; Result Is 7 PL/SQL procedure successfully completed. الحمدلله البرناج يعمل صحيح ولكن انا لا اريد ان تظهر كلمة old وكلمة new في كل مرة الموضوع مزعج لذلك اقوم بكتابة هذا الامر لتخلص من وجود هذه الكلمات وهو SQL> set verify offطبعا بكتب هذا الامر في اي مكان ولكن يستحسن ان يكتب بعد الامر SQL> set serveroutput onوهذه هي النتيجة SQL> set verify off SQL> / Enter value for a: 49 Enter value for b: 7 Result Is 7 PL/SQL procedure successfully completed. طيب في حالة اني قسمت على الرقم صفر ما هي النتيجة ...؟ SQL> / Enter value for a: 15 Enter value for b: 0 declare * ERROR at line 1: ORA-01476: divisor is equal to zero ORA-06512: at line 8 عند القسمة على صفر طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي SQL> declare 2 a number; 3 b number; 4 c number; 5 begin 6 a:=&a; 7 b:=&b; 8 c:=a/b; 9 dbms_output.put_line('Result Is '||c); 10 exception 11 when zero_divide then 12 dbms_output.put_line('You Can Not Divide By Zero ..'); 13 end; 14 / Enter value for a: 15 Enter value for b: 0 You Can Not Divide By Zero .. PL/SQL procedure successfully completed. كتبنا في ال Exception رسالة للمستخدم انه لا يستطيع أدخال الرقم صفر في القسمة .طيب في حالة غلط المستخدم وادخل بدل الرقم حرف ماذا يحصل ...؟ SQL> / Enter value for a: 15 Enter value for b: 'm' declare * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 7 عند أستخدام حرف بدل رقم طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي SQL> ed 1 declare 2 a number; 3 b number; 4 c number; 5 begin 6 a:=&a; 7 b:=&b; 8 c:=a/b; 9 dbms_output.put_line('Result Is '||c); 10 exception 11 when zero_divide then 12 dbms_output.put_line('You Can Not Divide By Zero ..'); 13 when value_error then 14* dbms_output.put_line('Pleas Enter Number ..'); 15 end; 16 / Enter value for a: 15 Enter value for b: 'm' Please Enter Number ... PL/SQL procedure successfully completed. كتبنا في ال Exception رسالة للمستخدم انه لا يستطيع أدخال الا رقم ولا يستطيع أدخال حرف في القسمة .طبعا كل سخص يصيغ الرسالة باسلوبه وبطريقة التي يراها مناسبة .طبعا يوجد انواع اخرى من الـــError وحلولها وإن شاء الله في الدروس القادمة سنوضحها .طبعا انا اسف لأني بطيئ في الشرح ولكن انا اريد ان أمشي خطوة خطوة والتاكد من وضوح كل خطوة .اتمنى ان يكون اسلوبي سهل وسلس. 3 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmed_diab1983 بتاريخ: 19 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 اخى العزيز انا افضل لو هتنزل كتاب لتعليم PL/SQL من الالف للياء يفضل يكون كتاب فى صورة doc او pdf ولا اية رأيكم ياخونا وممكن تضع علية اسمك وتجعله للقراءة فقط للحفاظ على حقوق الناشر وعندها تكون قمت بعمل عمل يحتذى به وبالتوفيق ان شاء الله 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 19 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 اخى العزيز انا افضل لو هتنزل كتاب لتعليم PL/SQL من الالف للياء يفضل يكون كتاب فى صورة doc او pdf ولا اية رأيكم ياخونا وممكن تضع علية اسمك وتجعله للقراءة فقط للحفاظ على حقوق الناشر وعندها تكون قمت بعمل عمل يحتذى به وبالتوفيق ان شاء الله اهلا وسهلا بأخي الفاضل احمداقتراحك على العين والراسأخي العزيز بأمكانك عمل بحث على الانترنت وسترى الالف من الملفات التعليمة من الالف الى الياء بأمكانك تنزيلها والاستفادة منهااخي العزيز انا فكرتي تكمن في وضع درس درس والتطرق لكل كبيرة وصغيرة في كل درس بأسلوب بسيط جداااا مع وضع الامثلة التوضيحية ولن انتقل لدرس التالي الا اذا الدرس الاول أستوعيب بالكامل ...أخي العزيز فكرة انا اضع اسم على كتاب غير واردة ابدا هذه الدروس لوجه الله تعالى بل اتمنى اذا كان هذا الكتاب في النهاية يستحق النشر ان يقوم اي واحد بنقله ونشره فإن شاء الله تكون صدقة جارية لكل واحد يعمل على نقله أو نشره .اتمنى ان تفهم فكرتي 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
@nana@ بتاريخ: 19 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 19 ديسمبر 2009 جزااااااااااااااك الله خيرااااااااااااااااااااااااااااا 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 20 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 20 ديسمبر 2009 جزااااااااااااااك الله خيرااااااااااااااااااااااااااااا الله يبارك فيك اختي الفاضلةومشكورة على مرورك 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 20 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 20 ديسمبر 2009 السلام عليكم ورحمة الله وبركاتهاليوم عنا مثال جديد ...أريد كتابة برنامج اعطيه رقم الموظف ويعطيني أسمه وعنوانهبسم الله نبدء SQL> set serveroutput on SQL> set verify off SQL> declare 2 v_ename emp.ename%type; 3 v_sal emp.sal%type; 4 begin 5 select ename,sal 6 into v_ename,v_sal 7 from emp 8 where empno=&empno; 9 dbms_output.put_line('Name '||v_ename||' Salary '||v_sal); 10 end; 11 / Enter value for empno: 7900 Name JAMES Salary 950 PL/SQL procedure successfully completed. الحمدلله البرنامج شغال صح الصح طيب لو على فرض المستخدم العادي قام بادخال رقم خطأ ماذا يحصل لنرى SQL> / Enter value for empno: 7903 declare * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 5 طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي SQL> ed Wrote file afiedt.buf 1 declare 2 v_ename emp.ename%type; 3 v_sal emp.sal%type; 4 begin 5 select ename,sal 6 into v_ename,v_sal 7 from emp 8 where empno=&empno; 9 dbms_output.put_line('Name '||v_ename||' Salary '||v_sal); 10 exception 11 when no_data_found then 12 dbms_output.put_line('Employee Number Is Wrong Please Enter Correctt Number ...'); 13* end; 14 / Enter value for empno: 7966 Employee Number Is Wrong Please Enter Coreect Number ... طيب لو انا حبيت اجيب اسماء ورواتب موظفين لدائرة ماذا افعل ...؟؟؟الموضوع بسيط نعدل شوية في الكود .... SQL> ed Wrote file afiedt.buf 1 declare 2 v_ename emp.ename%type; 3 v_sal emp.sal%type; 4 begin 5 select ename,sal 6 into v_ename,v_sal 7 from emp 8 where deptno=&deptno; 9 dbms_output.put_line('Name '||v_ename||' Salary '||v_sal); 10* end; SQL> / Enter value for deptno: 10 declare * ERROR at line 1: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 5 طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي SQL> ed Wrote file afiedt.buf 1 declare 2 v_ename emp.ename%type; 3 v_sal emp.sal%type; 4 begin 5 select ename,sal 6 into v_ename,v_sal 7 from emp 8 where deptno=&deptno; 9 dbms_output.put_line('Name '||v_ename||' Salary '||v_sal); 10 exception 11 when too_many_rows then 12 dbms_output.put_line('Resulat Too Many Rows ....'); 13* end; SQL> / Enter value for deptno: 10 Result Too Many Rows .... PL/SQL procedure successfully completed. طيب احنا حلينا مشكلة الـــError بس فعليا احنا ما حلنا المشكلة الاصلية وهي اريد ان ارجع اكثر من صف او سطر جملة ال الــــ Select ترجع فقط صف او سطر واحد ولا تساعدني في حل هذه المشكلة .أذا لحل هذه المشكلة احتاج للمتغير جديد يقوم بارجاع اكثر من صف او سطر .والمتغير هذا هو الــــــ Cursor وهو موضوع بسيط جداااا جداااااسأبدء فيه أنشاء الله الدرس القادم اذا لم يكن هنالك اسئلة على ما سبق . 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sara gamal بتاريخ: 20 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 20 ديسمبر 2009 جزاك الله خيرا 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 20 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 20 ديسمبر 2009 السلام عليكم ورحمة اللهجهد متميز ,,, شكرا لك ... مرة اخرى عودة قوية بارك الله فيك وجزاك خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 21 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2009 جزاك الله خيرا الله يبارك فيكي اختي الفاضلة سارةمشكورة على مرورك الطيب 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 21 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2009 السلام عليكم ورحمة اللهجهد متميز ,,, شكرا لك ... مرة اخرى عودة قوية بارك الله فيك وجزاك خيرا وعليكم السلام ورحمة الله وبركاتهشكر وعرفان للأستاذ الكبير أمجد للتثبيت الموضوع الله يبارك فيك أستاذنا الفاضلاتمنى ان اكون عند حسن ظنك أستاذي الفاضلوأرجوا منك أستاذ أمجد متابعة الدروس للتصحيحي ان أخطأتجلّ من لا يسهو اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 22 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 22 ديسمبر 2009 (معدل) اليوم أنشاء الله سنشرح الــــــ Cursor الــــــــ Cursor هو عبارة عن جملة Select نستطيع من خلالها نرجع اكثر من صف او سطر بعكس جملة الـــــ Select العادية التي لا نستطيع من خلالها الا أرجاع سطر او صف واحدكيف نكتب الــــــ Cursor ....؟الموضوع بسيط جدااااااااااا كالتاليبسم الله نبدء Cursor Cursor-Name is Cursor اجياري ان تكتب بعد أسم الــ is طبعا Cursor هنا عرفنا الـــ select columns name Cursor هنا حددنا الحقول التي اريدها ان تظهر من خلال الـــ From Table-Name; Cursor تحديد أسم الجدول صاحب الحقول التي ستظهر من خلال الــ Open Cursor-Name; Cursor هنا قمنا بفتح الــ Fetch Cursor-Name بسحب البيانات صف صف Cursor هنا يقوم الــ Into Variables Name; بوضع البيانات التي سحبها في المتغيرات صف صف Cursor هنا يقوم الــ Close Cursor-Name; Cursor هنا قمنا بأغلاق الـــــ طبعا الــــــــــــــــ Cursor يعرف كأي متغير في مرحلة Declarationفي الدرس السابق كان السؤال أريد ان اكتب برنامج اعطيه رقم القسم ويعطيني اسماء ورواتب الموظفين في هذا القسم وجربنا جملة الــــ Select العادية ولكنها لم تفلح لأن جملة الـــ Select العادية لا تسطيع ان تعطي الا سطر واحد ولحل هذه المشكلة سنقوم بأستخدام الـــــ Cursor الذي يستطيع ان يعطي سطر او اكثر من سطر .والحل كما يلي . SQL>Set serveroutput on SQL>Set verify off SQL> declare 2 cursor cur_emp is select ename,sal 3 from emp 4 where deptno=&deptno; 5 v_ename varchar2(50); 6 v_sal number; 7 begin 8 open cur_emp; 9 fetch cur_emp 10 into v_ename,v_sal; 11 close cur_emp; 12 dbms_output.put_line('Name '||v_ename||' Salary '||v_sal); 13* end; 14 / Enter value for deptno: 10 Name CLARK salary 2450 PL/SQL procedure successfully completed. الحمدلله البرنامج شغال صح الصح بس هنا مشكلة بسيطة الـــCursor قام بعرض فقط اول صف من البيانات ولم يكمل ...لماذا...؟المشكلة ليست بالـــــCursor لانه قام بوظيفته على اكمل وجه لانه قام بسحب اول صف من الجدول وقام بعرضهوتوقف عند هذه النقطة لانه لا يوجدامر يخبره انه يجب عليه الانتقال لصف التالي .اذا عرفنا وين المشكلة نريد امر يجبر الــــ Cursor الانتقال لصف التالي هل تعرفون ما هو هذا الامر ....!!!أنه بسيط جداااا نحن بحاجة للحلقة يبقى الـــ Cursor يعمل فيها لنهاية أخر سطرومن الشرح السابق للحلقات الحلقة المناسبة لهذه الحالة هي الـــــ Loopسنقوم بالتعديل على الكود وأستخدام حلقة الـــ Loop SQL> ed Wrote file afiedt.buf 1 declare 2 cursor cur_emp is select ename,sal 3 from emp 4 where deptno=&deptno; 5 v_ename varchar2(50); 6 v_sal number; 7 begin 8 open cur_emp; 9 loop 10 fetch cur_emp 11 into v_ename,v_sal; 12 exit when cur_emp%notfound; 13 dbms_output.put_line('Name '||v_ename||' salary '||v_sal); 14 end loop; 15 close cur_emp; 16* end; SQL> / Enter value for deptno: 10 Name CLARK salary 2450 Name KING salary 5000 Name MILLER salary 1300 PL/SQL procedure successfully completed. الحمدلله البرنامج شغال صح الصح طيب لو على فرضنا اريد اكثر من حقل رقم واسم وراتب وتاريخ ميلاد الموظف او حتى على فرض اريد جميع الحقول الخاصة بالموظففي هذه الحالة يجب ان اعرف لكل حقل متغير خاص به فلذلك الامر متعب و مزعج جدااا حل هذه المشكلة بسيط جدااااااااااأستخدم متغير يأخذ جميع مواصفات الحقول الموجودة داخل الـــ Cursor ويستطيع التعامل مع جميع البيانات الموجودة داخل الــ Cursorواعرف هذا المتغير داخل الـــDeclaration واحدد نوع البيانات فيه بأسم الـــCursor سنقوم بالتعديل على الكود وأستخدام هذا المتغير كتالي . SQL> ed Wrote file afiedt.buf 1 declare 2 cursor cur_emp is select ename,sal 3 from emp 4 where deptno=&deptno; 5 v_cur cur_emp%rowtype; 6 begin 7 open cur_emp; 8 loop 9 fetch cur_emp 10 into v_cur; 11 exit when cur_emp%notfound; 12 dbms_output.put_line('Name '||v_cur.ename||' salary '||v_cur.sal); 13 end loop; 14 close cur_emp; 15* end; SQL> / Enter value for deptno: 10 Name CLARK salary 2450 Name KING salary 5000 Name MILLER salary 1300 PL/SQL procedure successfully completed. مثال اخر اريد ان اكتب برنامج اعطيه رقم القسم ويعطيني اسماء ورواتب الموظفين مع اسماء الوظائف في هذا القسم سنقوم بتعديل على الكود كالتالي . SQL> ed Wrote file afiedt.buf 1 declare 2 cursor cur_emp is select * هنا اخبرته اريد جميع الحقول 3 from emp 4 where deptno=&deptno; 5 v_cur cur_emp%rowtype; 6 begin 7 open cur_emp; 8 loop 9 fetch cur_emp 10 into v_cur; 11 exit when cur_emp%notfound; 12 dbms_output.put_line('Name '||v_cur.ename||' salary '||v_cur.sal||' Job '||v_cur.job); هنا طلبت منه فقط اسم وراتب الموظف مع اسم وظيفته 13 end loop; 14 close cur_emp; 15* end; SQL> / Enter value for deptno: 10 Name CLARK salary 2450 Job MANAGER Name KING salary 5000 Job PRESIDENT Name MILLER salary 1300 Job CLERK PL/SQL procedure successfully completed. هذا المتغير سهل علي كثير من الامور واستخدامه سهل وضروري جدااااا .الحمدلله البرنامج شغال صح الصح بس عندي مشكلة ومشكلة كبيرةهو انا كل ما بدي اطلع بيانات موظف او بيانات دائرة ما بدي اكتب برنامج الامر متعب ومزعج جدااااااااا وخصوصا اذا كان عندي جداول كبيرة كيف احل هذه المشكلة الكبيرة .........؟الحل سهل وبسيط جدااااااااااا.اكتب برنامج بس من نوع تانيبرنامج له اسم ويخزن في قاعدة البيانات ويمرر له بارميتر ويرجع لي قيمة معينة ويقوم بأكثر من عملية في البرنامج الواحدوأستطيع استدعائه في اي وقت انا بحاجته واقوم بتنفيذههذا البرنامج الجديد صاحب هذه المواصفات العالية هو الــــــــــــــــــ Procedureوسنقوم بشرحه في الدرس القادم أنشاء الله . تم تعديل 22 ديسمبر 2009 بواسطة miash80 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 28 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 28 ديسمبر 2009 السلام عليكم ورحمة الله وبركاته أسف اخواني عن الانقطاع عن تكملة اعطاء الدروسغدا إن شاء الله سأبدء في شرح Procedure :angry: :angry: 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
deamon بتاريخ: 31 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 31 ديسمبر 2009 الأخ الفاضل miash80 أششكرك كثيرا على هذا المجهود الرائع وأتمن منك المتابعة بسرعة طبعا أنا عضو جديد وأيضا جديد على pl/sql وعندي بعض الأسئلة لكن أرحو الآن أن تكمل ال procedure. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
deamon بتاريخ: 2 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 2 يناير 2010 السلام عليكم ورحمة الله وبركاته أسف اخواني عن الانقطاع عن تكملة اعطاء الدروسغدا إن شاء الله سأبدء في شرح Procedure شكرا لك الأخ الفاضل miash80 لكن متى بالضبط أرجو ان تستجيب اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 3 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 3 يناير 2010 الأخ الفاضل miash80 أششكرك كثيرا على هذا المجهود الرائع وأتمن منك المتابعة بسرعة طبعا أنا عضو جديد وأيضا جديد على pl/sql وعندي بعض الأسئلة لكن أرحو الآن أن تكمل ال procedure. اهلا وسهلا بك أخي العزيز وانا اسف على التأخيروبالتوفيق أخي العزيز 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 3 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 3 يناير 2010 (معدل) اليوم إن شاء الله سأبدء في شرح Procedureبسم الله نبدء Create [Or Replace] Procedure Procedure-Name هنا نقوم بأنشاء الاجراء (P1 in Number,P2 out Varchar2,P3 in out date....) هنا نقوم بتعريف البراميتر Is كلمة اجبارية Variables Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها Begin (Mandatory) بداية الاجراء وهذا الجزء أجباري Eexcutable Section هنا يكتب كود البرمجة الخاص بالبرنامج Pl/Sql Code . . . [Exception] (Optional)هذا الجزء خاص بمعالجة أخطاء الاجراء وهو أختياري . . . End [Procedure-Name]; (Mandatory) نهاية البرنامج وهذا الجزء أجباري الكلمات بين [ ] اختيارية الكتابة[Or Replace] تكتب لكي نستطيع التعديل على الاجراء في المستقبل وبدونها لا نستطيع التعديل على الاجراء[Procedure-Name] كتابة اسم الاجراء عند نهاية الاجراء اختياريةP1,P2,P3 هذه عبارة عن براميتر نمررها عبر الاجراء وهي عبارة عن ثلاث انواع كما يلي Prameter Type: Name Mode data Type P1 In Number,Varchar2,Date ....Ext P2 Out Number,Varchar2,Date ....Ext P3 In Out Number,Varchar2,Date ....Ext البراميتر من In يقوم هذا البراميتر بأدخال قيمة للـــ Procedureالبرامتير من Out يقوم هذا البراميتربالاحتفاظ بقيمة معينة من ال Procedure وأخراجهاالبراميتر من In Out يقوم هذا البراميتر بأدخال قيمة معينة على الــ Procedure ويقوم الــ Procedure بتنفيذ الاوامر الموجودة داخله وأخراج قيمة جديدة للبراميتر الذي قمنا بأدخالهبعض الملاحظات على البراميترطبعا من المهم جداااا عدم تحديد حجم انواع البيانات في البراميتر يحدد فقط نوع البياناتاذا ما حددنا نوع Mode ياخذ نوع الــ MOde مباشرة Inلا نستطيع عمل لي تعديل على البراميتر من نوع In داخل الـــ Procedure ونستطيع التعديل على البراميتر من نوع الـــ out ومن نوع In Outعند أخراج قيمة مباشرة من الـــ Procedure على الشاشة ليس بحاجة للبراميتر من نوع Out فأمر الطباعة يكفي في هذه الحالةسنبدء في مثال صغير للكتابة الــــــــــProcedureاريد ان اكتب Procedure يقوم بوظيفة Printبدل من كتابة dbms_output.put_line();في كل مرة اريد ان استخدم فيها الطباعةبسم الله نبدء SQL> set serveroutput on SQL> set verify off SQL> create or replace procedure print(p_text in varchar2) 2 is 3 begin 4 dbms_output.put_line(p_text); 5* end; SQL> / Procedure created. وهنالك نوعين من الاستدعاء طريقة Pl/Sql begin print(' '); end; طريقة Sql execute print(' '); طبعا نستخدم طريقة الــSql فقط في حالة اذا كان البراميتر من نوع Inمثال جديد اريد ان أستخدم فيه براميتر من نوع In .اريد ان اكتب Procedure اعطيه رقم القسم يعطيني أيم الموظف مع راتبه . SQL> create or replace procedure get_info(p_deptno in number) 2 is 3 cursor cur_emp is 4 select * 5 from emp 6 where deptno=p_deptno; 7 v_cur cur_emp%rowtype; 8 begin 9 open cur_emp; 10 loop 11 fetch cur_emp 12 into v_cur; 13 exit when cur_emp%notfound; 14 print('Name '||v_cur.ename||' Salary '||v_cur.sal); 15 end loop; 16 close cur_emp; 17* end; SQL> / Procedure created. طريقة أستدعاء Procedure فيه براميتر من نوع In . SQL> begin 2 get_info(&p_deptno); 3 end; 4 / Enter value for p_deptno: 10 Name CLARK Salary 2450 Name KING Salary 5000 Name MILLER Salary 1300 PL/SQL procedure successfully completed. مثال جديد أريد ان أستخدم فيه براميتر من نوع Out.اريد ان اكتب Procedure اعطيه رقم الموظف ويعطيني اسم الموظف مع أسم قسمه واريد ان احتفظ بأسم الموظف مع اسم القسم في متغير SQL> create or replace procedure get_name(p_empno in number,p_ename out varchar2,p_dname out varchar 2) 2 is 3 cursor cur_emp is 4 select ename,dname 5 from emp e ,dept d 6 where e.deptno=d.deptno 7 and e.empno=p_empno; 8 begin 9 open cur_emp; 10 fetch cur_emp 11 into p_ename,p_dname; 12 if cur_emp%notfound then 13 p_ename:='No Name'; 14 p_dname:='No Dname'; 15 end if; 16 close cur_emp; 17 end; 18 / Procedure created. طريقة أستدعاء Procedure فيه براميتر من نوع Out .يجب يجب يجب ان نعرف لكل براميتر من نوع Out متغير نضع فيه قيمة البراميتر SQL> declare 2 v_ename varchar2(100); 3 v_dname varchar2(100); 4 begin 5 get_cur(&p_empno,v_ename,v_dname); 6 print('Name '||v_ename||' Dname '||v_dname); 7 end; 8 / Enter value for p_empno: 7900 Name JAMES Dname SALES PL/SQL procedure successfully completed. مثال جديد اريد ان أستخدم فيه براميتر من نوع In Outأريد ان اعطيه رقم معين واريد ان يخرج هذا الرقم بفورمات معينة . SQL> create or replace procedure phone(p_num in out varchar2) 2 is 3 begin 4 p_num:='('||substr(p_num,1,3)||').'||substr(p_num,4); 5 end; 6 / Procedure created. طريقة أستدعاء Procedure فيه براميتر من نوع In Out . SQL> declare 2 v_num varchar2(100); 3 begin 4 v_num:=&v_num; 5 print(v_num); 6 end; 7 / Enter value for v_num: 796690462 (796).690462 PL/SQL procedure successfully completed. مثال جديد اريد ان أستخدم فيه خاصية الاضافةاريد ان اكتب Procedure يقوم باضافة أسم وموقع القسم في جدول الاقسام QL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type) 2 is 3 v_deptno number; 4 begin 5 select max(deptno) 6 into v_deptno 7 from dept; 8 v_deptno:=v_deptno+10; 9 insert into dept 10 values(v_deptno,p_dname,p_loc); 11 commit; 12* end; SQL> / Procedure created. طريقة الاستدعاء SQL> begin 2 insert_dept('Finance','Amman'); 3 end; 4 / PL/SQL procedure successfully completed. ولتأكد من انه اضاف البيانات الجديدة SQL> select * 2 from dept; DEPTNO DNAME LOC --------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 Finance Amman طيب في حالة اريد ان اضيف اسماء اقسام جديدة وكلها موجودة في موقع واحد ولا اريد ان اكرر في كل مرة اسم الموقعالموضوع بسيط جدا جدا جدا في الدرس القادم مع تكلمة الشرح لموضوع الـــ Procedure تم تعديل 3 يناير 2010 بواسطة miash80 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 3 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 3 يناير 2010 السلام عليكم ورحمة الله شرح مبسط وواضح .... شكرا لك على الجهد ارجوا كتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ... وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها استمر ... وبارك الله فيك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 3 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 3 يناير 2010 السلام عليكم ورحمة الله شرح مبسط وواضح .... شكرا لك على الجهد ارجوا كتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ... وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها استمر ... وبارك الله فيك وعليكم السلام ورحمة الله وبركاتهالله يبارك فيك أستاذ أمجدمشكور على المتابعةأستاذ امجد انا لم أنهي درس الـــــــProcedure في الدرس القادم أنشاء الله سأخذ بكل ما طلبت مني سواءكتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ... وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها وأتمنى ان تتابع هذه الدروس للتقويمي اذا أخطأتواكرر شكري لك أستاذ امجد للمتابعة هذه الدروس المتواضعة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
@nana@ بتاريخ: 3 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 3 يناير 2010 جزااااااااااااااااااااااااااك الله خيرااااااااااااااااااابجد شرح رائع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.