المبرمجة المبتدئة بتاريخ: 10 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 10 يناير 2010 أخي miash80 جزاك الله عنا كل خير وارجو الاستمرار في الدروس بهذا الاسلوب كونه اسلوب واضح وبسيط مع الشكر الجزيل لك ولجهودك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 11 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 يناير 2010 جزاك الله كل خير يا اخى عمل رائع ومشكور ومقبول باذن اللهالى جانب طريقة الشرح سهلة مبسطة للغاية الله يبارك فيك اخي الفاضلوالحمدلله انوا اسلوب الشرح سهل اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 11 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 يناير 2010 اخي العزيز miash80 ارجوا ان تكون بخير وفي احوال جيدة نحن بانتظارك لاكمال الدروس بهذا الاسلوب الذي تعودنا علية منك وجزاك الله خير ودوام الصحة والعافية اهلا بأخي العزيزاخي انا اسمي موسىوإن شاء الله اليوم سأكمل موضوع الـــــــــ Prcedure اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 11 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 يناير 2010 أخي miash80 جزاك الله عنا كل خير وارجو الاستمرار في الدروس بهذا الاسلوب كونه اسلوب واضح وبسيط مع الشكر الجزيل لك ولجهودك اهلا وسهلا بأختي الفاضلة المبرمجة المبتدئةوالله يبارك فيكيوعقبال ما ناديكي بالمبرمجة الاولى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المبرمجة المبتدئة بتاريخ: 12 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2010 أخي الفاضل جزاك الله كل خيرررررررررر اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 13 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 يناير 2010 السلام عليكم ورحمة الله وبركاته أسف اخواني الاعزاء على هذا التأخير في تكملة الدروس بسبب ضغوط الشغل هذه الايامإن شاء الله يوم السبت سأكمل بقية الدروساكرر أسفي اخواني الاعزاء اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
masmas1001 بتاريخ: 14 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 14 يناير 2010 عزيزي الاخ موسى لعل ان تكون بخير ونشكرك على الاهتمام اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 16 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 يناير 2010 السلام عليكم ورحمة الله وبركاتهاكرر أسفي اخواني الاعزاء للتأخري في تكملة كتابة الدروساليوم أنشاء الله سنكمل الدروستوقفنا في الدرس السابق عند هذا المثال مثال جديد اريد ان أستخدم فيه خاصية الاضافةاريد ان اكتب 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الحل بسيط جدااا نكتب بعد تعريف الحقل =: ونكتب بعدها القيمة التي نريد او نكتب كلمة Default كالتالي QL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type:='Amman') 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. أو بأستخدام كلمة Default SQL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type Default 'Amman') 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('Tax'); 3 end; 4 / PL/SQL procedure successfully completed. قمنا فقط بأدخال اسم القسم ولم ندخل اسم الموقع لانه يوجد قيمة له وهي Ammanولتأكد من انه اضاف البيانات الجديدة SQL> select * 2 from dept; DEPTNO DNAME LOC --------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 Finance Amman 60 Tax Amman طيب اذا اردنا ان نثبت اسم القسم في اكثر من منطقة ماذا العمل .على سبيل المثال اربد ان اضع قسم الضريبة في اكثر من منطقة .والحل كالأتي . SQL> create or replace procedure insert_dept (p_dname in dept.dname%type :='Tax' ,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 وطريقة الاستدعاء في هذه الحالة تختلف شيئ بسيط كالتالي عند استدعاء الـــ Procedure القيمة الاولى معروفة وموجودة وهي اسم القسم ولا داعي لوضع قيمة لها اما القيمة الثانية وهي اسم الموقع غير موجودة لذلك نضع القيمة لهاطيب كيف تعرف هذه القيمة للأسم القسم ام للأسم الموقع بسيطة نعمل عملية قفز للبياناتوتتم عملية القفز بوضع أشارة <= قبل القيمة التي نريد أدخالها كالتالي . SQL> begin 2 insert_dept(P_Loc=>'Irbid'); 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 60 Tax Amman 70 Tax Irbid سأكرر العملية اكثر من مرة وسأقوم كل مرة بأضافة جديدة SQL> begin 2 insert_dept(P_Loc=>'Salt'); 3 end; 4 / PL/SQL procedure successfully completed. ومرة اخرى أقوم بأضافة SQL> begin 2 insert_dept(P_Loc=>'Zarqa'); 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 60 Tax Amman 70 Tax Irbid 80 Tax Salt 90 Tax Zarqa طيب اريد ان اعمل اضافة مرة اخرى لنرى ماذا يحصل SQL> begin 2 insert_dept(P_Loc=>'Mafraq'); 3 end; 4 / begin * ERROR at line 1: ORA-01438: value larger than specified precision allows for this column ORA-06512: at "SCOTT.INSERT_DEPT", line 9 ORA-06512: at line 2 ما هذا الخطأ ...!!! طيب انا عندي سؤالين ...!!!لماذا هذا الـــError ...؟هل المستخدم العادي سيفهم هذا الخطأ ...؟سأجيب على السؤالين بنفسي.احابة السؤال الاول هذا الخطأ ظهر بسب رقم القسم وصل لغاية الرقم 90واذا اضافنا كمان قسم سيصبح الرقم 100 وهذا لا يجوز لانه عند تعريف رقم القسمعرفناه number(2) لنرى مواصفات هذه الجدول . SQL> Desc Dept; Name Null? Type ------------------------------- -------- ---- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) والاجابة على السؤال الثاني هي لأ طبعا المستخدم العادي لا يعرف معنى هذا الــ Error طيب ما العمل بسيطة اقوم بالتعديل على الــ Procedure بحيث اذا قام المستخدم العاديبأضافة اقسام اكثر من الرقم المحدد نخرج من الـــ Procedure ونعطيه رسالةواضحة بانه لا يصح اضافة اقسام جديدة كالتالي . SQL> ed Wrote file afiedt.buf 1 create or replace procedure insert_dept (p_dname in dept.dname%type :='Tax' ,p_loc in dept.loc% 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 if v_deptno > 90 then 10 raise_application_error(-20100,'You Can Not Insert More Department ...'); 11 else 12 insert into dept 13 values(v_deptno,p_dname,p_loc); 14 end if; 15 commit; 16* end; SQL> / لنحاول الاضافة مرة أخرى SQL> begin 2 insert_dept(P_Loc=>'Mafraq'); 3 end; 4 / begin * ERROR at line 1: ORA-20100: You Can Not Insert More Department ... ORA-06512: at "SCOTT.INSERT_DEPT", line 10 ORA-06512: at line 2line 2 طيب يوجد لدينا امر جديد وهو raise_application_error(-20100,'Write Message Reason Exit ...'); هذا الامر يتعبر من الــ Exception اذا يقوم بالخروج من البرنامج مع اعطاء رسالة بسبب الخروجهذا الامر جاهز من اوراكل يكتب بطريقة السابقة مع تغير صيغة الرسالة بحيث تناسب كل حالةاذا raise_application_error جاهزة لا يغير فيها اي شي-20100 وهذا الرقم نكتب بمدى معين وهو -20000 الى 29999ونكتب بين هذا الرمز ' ' الرسالة التي نريدطيب في حالة اريد ان ارى الــProcedure التي قمت بأنشائها من قبل والعمل على التعديل عليهااو القيام بحذفها ما هي الاوامر التي استطيع من خلالها القيام بهذه الامور .الموضوع بسيط جداً جداً جداً في الدرس القادم 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 16 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 يناير 2010 السلام عليكم ورحمة الله وبركاتهفي الدرس السابق تكلمنا عن الاوامر الخاصة بالـــProcedureهذه الجمل نستخدمها لاخراج أسماء الــTable والــProcedure والـــFunction والــTrigger والــPackageوهي هذه الجمل SELECT * FROM all_errors; SELECT * FROM all_source; SELECT * FROM user_objects; SELECT * FROM dba_errors; SELECT * FROM dba_object_size; SELECT * FROM dba_source; SELECT FROM user_errors; SELECT * FROM user_source; SELECT * FROM user_object_size; ومن خلال هذه الجمل نستطيع وضع شروط لاخراج بيانات معينة مثل تحديد نوع البيانات مثل اريد اسماء الــProcedure فقط كالتالي SELECT * FROM user_source where type='PROCEDURE'; او اسماء الــFunction SELECT * FROM user_source where type='FUNCTION'; بنفس الطريقة الــTrigger و الــــPackageواستطيع ان اضع شرط اسم الــProcedure SELECT * FROM user_source where type='PROCEDURE' and name='insert_dept'; واستطيع ان اضع شرط اسم اليوزر اذا دخلت من خلال يوزر الــSystem SELECT * FROM dba_source WHERE OWNER='SCOTT'; وهكذا ومن خلال هذه الجمل استطيع التعديل على الــProcedureمن خلال الحقل Text بحيث اخذ نسخة من الــProcedure وأقوم بالتعديل عليهوهذا الحقل موجود في معظم الجداول السابقةوالجداول هي all_errors; all_source; dba_errors; dba_source; user_errors; user_source; اما الامر الخاص بعملية حذف الـــProcedure هو DROP PROCEDURE PROCEDURE_NAME; مثال SQL> DROP PROCEDURE INSERT_DEPT; Procedure dropped. في الدرس القادم إن شاء الله اذا لم يكن هنالك اسئلة سنتحدث عن ابن عم الــــProcedure اتعرفون من هو ابن عم الــProcedure أنه الــFunction لهم صفات مشتركة ولهم صفات مختلفة لنرى في الدرس القادم هذه الصفات إن شاء الله 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
a12345 بتاريخ: 17 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 17 يناير 2010 بارك الله فيك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaledhere بتاريخ: 19 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 19 يناير 2010 جزاك الله خيرا على الدروس القيمه اللى استفدت منها شخصيا بس فة حلقه مفقوده عندى ياريت توضها ليا انا دلوقتى اتعلمت sql واتعلمت pl/sql من فترة ودلوقتى بفهمها اكتر من دروس حضرتك طيب الحاجات ده كلها ليه بنطبقها على sql*plus يعنى ايه وجه الاستفاده اننا بنطبقها على sql*plus انا فاهم ان بنطيق sql على sql*plus عشان نفهم الاوامر طيب ودلوقتى ليه بنطبق pl/sql على برنامج sql*plus عشان بردو نفهم الاوامر ولا عشان حاجه تانيه ياريت من فضلك طلب تعمل مثال على دروسك حضرتك وكيفيه يمكن الاستفادخ به فى forms عشان الواحد يكون فهم بالظبط بناءا على وضع مثال بسيط لان ده هيوضح حاجت كتير ان شاءالله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المبرمجة المبتدئة بتاريخ: 20 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 20 يناير 2010 بارك الله فيك يا اخي وارجو منك الاستمرار كوننا نستفيد منك بشكل ممتاز واعانك الله على فعل الخير دائما اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
3oraby بتاريخ: 20 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 20 يناير 2010 ما شاء الله جزاك الله خيرا اخي الكريم على هذا المجهود اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 20 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 20 يناير 2010 جزاك الله خيرا على الدروس القيمه اللى استفدت منها شخصيا بس فة حلقه مفقوده عندى ياريت توضها ليا انا دلوقتى اتعلمت sql واتعلمت pl/sql من فترة ودلوقتى بفهمها اكتر من دروس حضرتك طيب الحاجات ده كلها ليه بنطبقها على sql*plus يعنى ايه وجه الاستفاده اننا بنطبقها على sql*plus انا فاهم ان بنطيق sql على sql*plus عشان نفهم الاوامر طيب ودلوقتى ليه بنطبق pl/sql على برنامج sql*plus عشان بردو نفهم الاوامر ولا عشان حاجه تانيه ياريت من فضلك طلب تعمل مثال على دروسك حضرتك وكيفيه يمكن الاستفادخ به فى forms عشان الواحد يكون فهم بالظبط بناءا على وضع مثال بسيط لان ده هيوضح حاجت كتير ان شاءالله الله يبارك فيك أخي الفاضل خالدكلامك افرحني اخي العزيز لانك أستفدت من هذه الدروسوبالنسبة للحلقة المفقودةاحنا بنطبق الSQL والــPL/SQl على sql*plus لانه هذه بيئة التطبيق الخاصة بهاوكذلك نقدر ان نطبق جمل الــSQl والــPL/SQL على الـــFormوانا أن شاء الله سأقوم بكتابة بعض الامثلة على الــProcedure والــFunction وتطبيقها على الــFormولكن بعد ما انتهي من شرح الــFunction وانا جاهز لأي أستفساء ان شاء الله 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 20 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 20 يناير 2010 بارك الله فيك يا اخي وارجو منك الاستمرار كوننا نستفيد منك بشكل ممتاز واعانك الله على فعل الخير دائما الله يبارك فيكي اختي الفاضلةانا اسف للتأخري في كتابة الدروساليوم أن شاء الله سأشرح الــFunctionوانا جاهز لأي أستفسار اختي الفاضلة 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 25 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 25 يناير 2010 السلام عليكم ورحمة الله وبركاتهاسف اخواني الاعزاء في التأخر في تكملة الدروساليوم سنقوم بشرح للـــFunction ابن عم الـــــــProcedure ولكن لنعمل مراجعة بسيطة للــتعريف الـــ Procedureقلنا انا الــProcedure هو عبارة عن برنامج له اسم ويخزن في قاعدة البيانات ويمرر له براميترويرجع لي قيمة معينة ويقوم بأكثر من عملية في البرنامج الواحد وأستطيع استدعائه في أي وقت انا بحاجتهواقوم بتنفيذه .عندي أضافة في التعريف الــ Procedure ممكن يرجع قيمة وحدة وممكن ان يرجع اكثر من قيمةلاكثر من نوع من البيانات او يرجع اكثر من قيمة من نفس النوع وممكن ان لا يرجع أي قيمة .(((كلام جميل )))الان سنبدء في الشرح عن ابن عم الــــ Procedure وهو ابن العم الــFunction .بسم الله نبدءاولا سنقوم بتعريف الــFunction .تعريف رقم (((1)))هو عبارة عن برنامج له اسم ويخزن في قاعدة البيانات ويمرر له براميترويرجع لي دائما قيمة واحدة فقط ويجب ان يرجع قيمة (((احد الفروق مع الــ Procedure))) ويقوم بأكثر من عملية في البرنامج الواحد وأستطيع استدعائه في أي وقت انا بحاجتهتعريف رقم (((2))) هو عبارة عن برنامج بخيل جداًاًاًاًاً بحيث لا يقوم الا بأرجاع قيمة واحدة فقط تعريف رقم (((3)))هو عبارة عن برنامج شايف حاله لا يقوم الا بنقل كبار الزوار ((( الطبقة المخملية))) وكما نعرف اصحاب هذه الطبقة لهم بروتوكول خاص بهم اذ لا يجوز ارجاع اكثر من واحدفي كل مرة يقوم البرنامج بعمله .والان سنقوم بشرح كيفية كتابة الـــ Function Create [Or Replace] Function Function-Name هنا نقوم بأنشاء الاقتران (P1 in Number,P2 out Varchar2,P3 in out date....) هنا نقوم بتعريف البراميتر Return Data Type هنا بوضع نوع البيانات التي سيقوم الــFunction بأرجاعها Is كلمة اجبارية Variables Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها Begin (Mandatory) بداية الاجراء وهذا الجزء أجباري Eexcutable Section هنا يكتب كود البرمجة الخاص بالبرنامج Pl/Sql Code . . . Return Value; هنا نضع القيمة التي يريد الــFunction أرجاعها [Exception] (Optional)هذا الجزء خاص بمعالجة أخطاء الاجراء وهو أختياري . . . Return Value; هنا نضع القيمة التي يريد الــFunction أرجاعها في حالة حدوث Error End [Function-Name]; (Mandatory) نهاية البرنامج وهذا الجزء أجباري سنبدء في مثال صغير للكتابة الــــFunction أريد ان اكتب برنامج صغير يقوم بجمع رقمين وأخراج الناتجبسم الله نبدء SQL> set serveroutput on SQL> set verify off SQL> create or replace function Tot(X in number,Y in number) 2 Return Number 3 is 4 Begin 5 Return X+Y; 6 end; 7 / Function created. الان سنقوم بأستدعاء الـــFunction كألاتي .يجب تعريف متغير من نفس نوع القيمة التي سيقوم الــ Function بأسترجاعهالوضع قيمة الـــ Function فيها كألاتي . PL/SQL procedure successfully completed. SQL> Declare 2 Z number; 3 begin 4 Z:=Tot(8,9); 5 Print('Total = '||Z); 6 end; 7 / Total = 17 PL/SQL procedure successfully completed. او أستخدام هذه الطريقة لادخال ارقام مختلفة في كل مرة . SQL> Declare 2 Z number; 3 Begin 4 Z:=Tot(&N1,&n2); 5 Print('Total = '||Z); 6 end; 7 / Enter value for n1: 7 Enter value for n2: 5 Total = 12 PL/SQL procedure successfully completed. SQL> / Enter value for n1: 90 Enter value for n2: 77 Total = 167 PL/SQL procedure successfully completed. SQL> / Enter value for n1: 50 Enter value for n2: 80 Total = 130 PL/SQL procedure successfully completed. مثال جديد .أريد ان اكتب Function يحسب الراتب السنوي .بسم الله نبدء SQL> Create or replace Function Ann_Sal(P_sal in number,P_Comm in number) 2 Return Number 3 is 4 Begin 5 Return P_sal*12+nvl(p_Comm,0); 6 end; 7 / Function created. وطريقة الاستدعاء هي . SQL> Declare 2 V_Sal Number; 3 Begin 4 V_Sal:=Ann_Sal(100,10); 5 Print('Salary Year = '||V_Sal); 6 end; 7 / Salary Year = 1210 PL/SQL procedure successfully completed. مثال جديد .أريد ان اكتب نفس المثال السابق ولكن اريد ان اعطيه رقم الموظف ويحسب الراتب السنوي SQL> ed Wrote file afiedt.buf 1 Create or replace Function Ann_Sal(P_Empno in number) 2 Return Number 3 is 4 V_Ann number; 5 Begin 6 Select sal*12+nvl(Comm,0) 7 into V_Ann 8 From Emp 9 Where Empno=P_Empno; 10 Return V_Ann; 11 Exception 12 When Others Then 13 Return 0; 14* end; 15 / Function created. وطريقة الاستدعاء . SQL> Declare 2 V_sal Number; 3 Begin 4 v_sal:=Ann_Sal(&P_Empno); 5 Print('Salary Year = '||V_sal); 6 end; 7 / Enter value for p_empno: 7900 Salary Year = 11400 PL/SQL procedure successfully completed. SQL> / Enter value for p_empno: 7782 Salary Year = 29400 PL/SQL procedure successfully completed. SQL> / Enter value for p_empno: 7876 Salary Year = 13200 PL/SQL procedure successfully completed. أما في حالة ادخلنا رقم خطأ ما هي النتيجة لنرى . SQL> / Enter value for p_empno: 5444 Salary Year = 0 PL/SQL procedure successfully completed. لقد قام بأرجاع القيمة صفر الموجودة داخل الــ Exceptionمثال جديد .أريد ان اكتب Function اعطيه رقم الموظف يعطيني رقم مديره . create or replace function Manger(P_Empno in number) Return Varchar2 is Cursor C_Manger is select m.ename from emp e,emp m where e.mgr=m.empno and e.empno=p_empno; V_Manger C_Manger%rowtype; begin open C_Manger; fetch C_Manger into V_Manger; If C_Manger%Notfound then Return 'Big Bossss'; else Return V_Manger.Ename; end if; Close C_Manger; end; SQL> / Function created. وطريقة الاستدعاء SQL> Declare 2 V_Manager Varchar2(100); 3 Begin 4 V_Manager:=Manger(&P_Empno); 5 Print('Manger Name : '||V_Manager); 6 end; 7 / Enter value for p_empno: 7369 Manger Name : FORD PL/SQL procedure successfully completed. SQL> / Enter value for p_empno: 7698 Manger Name : KING PL/SQL procedure successfully completed. SQL> / Enter value for p_empno: 7934 Manger Name : CLARK PL/SQL procedure successfully completed. طيب على فرض أدخلنا رقم موظف ليس له رقم مدير ماذا يحصل SQL> / Enter value for p_empno: 7839 Manger Name : Big Bossss PL/SQL procedure successfully completed. الموظف الذي ليس له مدير هو المدير الرئيسيكلام جميل الان بعد هذا الشرح للكل من الـــProcdeure والـــFunction هل لاحظتم ما هي الفروق بينهمفي الدرس القادم سأعطي شرح بسيط للمقارنة بين الــProcedure والــ Function في حالة عدم وجود اسئلة . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaledhere بتاريخ: 30 يناير 2010 تقديم بلاغ مشاركة بتاريخ: 30 يناير 2010 منتظر بقيه الدروس ان شاء الله جزاك الله خيرا ومنتظر الامثله داخل الفورمز ان شاء لله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 31 يناير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 31 يناير 2010 منتظر بقيه الدروس ان شاء الله جزاك الله خيرا ومنتظر الامثله داخل الفورمز ان شاء لله الله يبارك فيك اخي خالدوانا اسف على التأخير أن شاء الله سأتابع الدروس اليوم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 2 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2010 السلام عليكم ورحمة الله وبركاتهاخواني الاعزاء سأتابع الدروس ....في الدرس السابق شرحنا الــــFunction وقلنا سنكتب مقارنة بسيطة بين الـــProcedure والـــFunction اولاد العم .بسم الله نبدءمن خلال الدروس السابقة للــــProcedure والــــFunction نستنتج بعض الفروق كالتالي . function procedure Parametrs Mode In In , In Out , Out Return Value Always Return One Value Or More Value Or No Value Calling SQL AND PL/SQL PL/SQL USE Calculation Mult Task وفي الدرس القادم سنكتب بعض الامثلة على تطبيق الـــProcedure والـــFunction على الـــForm اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 2 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2010 السلام عليكم ورحمة الله وبركاتهأخواني الاعزاء سنبدء اليوم بكتابة بعض الامثلة على الـــــ Function والـــــProcedure وتطبيقها على الفورم .بسم الله نبدء ...مثال على أستخدام الـــProcedure في الفورم .على سبيل المثال عندي شاشة الخاصة بمواعيد مراجعين الاطباءومن ضمن هذه الشاشة يوجد بيانات المراجعين وتأتي هذه البياناتعند وضع رقم المريض .طيب في حالة مريض جديد لا اريد الخروج من شاشة المواعيدوالذهاب الى الشاشة الخاصة بالمراجعين واضافة مريضاريد ان اضيف بيانات المريض في شاشة المواعيد وبعد ان اعملتخزين لشاشة المواعيد يعمل اضافة مباشرة للبيانات المريضفي جدول الخاص بالمراجعين .نبدء في كتابة الـــProcedure طبعا نذهب الى Program Unit ونقوم بأنشاء Procedure وأسمه Insert_Pat ثم نكبس OKفيطلع الناتج كالتالي PROCEDURE Insert_Pat IS BEGIN END; ثم تقوم بعملية التعديل والاضافة على الــ Procedure للقيام بالوظيفة المطلوبة منه كالتالي ..... Peocedure Insert_Pat(P_Pat_Id In Out Number,P_Pat_Name In Varchar2,P_Address In Varchar2,P_Mobil In number) Is V_Pat_Id number; Begin Select Nvl(Max(Pat_id),0,)+1 Into V_Pat_Id From Patient; Insert Into Patient(P_Id,P_Name,Address,Mobil) Values(P_Pat_Id,P_Pat_Name,P_Address,P_Mobil); Commit; End; الان نعمل Button جديد وننشأ Trigger جديد وهو When_Button_Preessedونستدعي داخله الــProcedure كالتالي . Insert_Pat(:Trysts.Pat_Id,:Trysts.Name,:Trysts.Add,:Trysts.Mobil); هنا عملنا اضافة لمرض جديد من شاشة المواعيد .طبعا نعمل اضافة للبيانات التي نريد وبعدها نرجع للشاشة المراجعين ونعمل على تعديل البيانات .مثال جديد على أستخدام الــــــــــــProcedure .عندي شاشة فواتير ماستر وديتل .اول شي اعمل جدولين خاصين بشاشة فواتير SQL> Create Table Inv 2 ( 3 inv_no number, 4 inv_year number, 5 total_inv number 6 ); Table created. SQL> alter table inv 2 add constraint inv_pk primary key (inv_no,inv_year); Table altered. SQL> Create Table Inv_det 2 ( 3 inv_no number, 4 inv_year number, 5 item_no number, 6 Serail_Id number, 7 qty number, 8 sale_price number, 9 sum_sale number 10 ); Table created. SQL> alter table inv_det 2 add constraint inv_det_pk primary key (INV_NO,INV_YEAR,ITEM_NO,SERAIL_ID); Table altered. SQL> alter table inv_det 2 add constraint inv_det_fk foreign key(inv_no,inv_year) 3 references inv(inv_no,inv_year); Table altered. وبعد الربط بين الجدولين وتنسيق الفورم سنكتب Procedure يحسب ناتج ضرب الكمية والسعرواخراج قيمة الفاتورة عن طريق جمع ناتج الضرب لكل المواد .طبعا نذهب الى Program Unit ونقوم بأنشاء Procedure وأسمه Total_Inv ثم نكبس OKفيطلع الناتج كالتالي .... PROCEDURE Total_Inv IS BEGIN END; ثم تقوم بعملية التعديل والاضافة على الــ Procedure للقيام بالوظيفة المطلوبة منه كالتالي . PROCEDURE Total_Inv IS V_qty_sale number; v_tot number; BEGIN GO_BLOCK('INV_DET'); FIRST_RECORD; loop V_qty_sale:=nvl(:inv_det.qty,0)*nvl(:inv_det.sale_price,0); :inv_det.sum_sale:= V_qty_sale; v_tot:=nvl(v_tot,0)+V_qty_sale; :inv.TOTAL_INV:= v_tot; exit when :system.last_record='TRUE'; NEXT_RECORD; END LOOP; END; الان نعمل Button جديد وننشأ Trigger جديد وهو When_Button_Preessedونستدعي داخله الــProcedure كالتالي .فقط تكتب اسم الــProcedure Total_Inv ;وعند عمل Run للفــورم وكتابة القيم نكبس على الــ Button ويعطينا ناتج ضرب الكميةمع السعر ويعطينا المجموع الكـلـي للفاتورة بأذن الله . ألان اريد اريد ان اكتب مثال على الـــFunction وتطبيقه على الفورم .اريد ان اكتب Function يمنعني من التعديل على الفاتورة بحيث اذا كانت الفاتورة مخزنة يخرج مسج يخبرني غير مسموح التعديل على الفاتورةاما اذا كانت الفاتورة خير مخزنة يسمح لي بالتعديل عليها كالتالي .نذهب الى Program Units ونقوم بأنشاء الــFunction بأسم Check_Invفيطلع الناتج كالتالي .... FUNCTION check_inv RETURN _ IS BEGIN END; ثم تقوم بعملية التعديل والاضافة على الــ Function للقيام بالوظيفة المطلوبة منه كالتالي ..... FUNCTION check_inv RETURN boolean IS v_inv_no number; BEGIN select inv_no into v_inv_no from inv where inv_no=:inv.inv_no; message('Can Not Update The Invoice...'); message(' '); return false; exception when no_data_found then return true; when others then message('Can Not Update The Invoice...'); message(' '); return false; END; نستدعي هذا الـــFunctionنكتب في الــButton الخاص بالــProcedure الذي يقوم بالحساباتوأسمه Total_Inv.ونستدعي بهذا الشكل . if check_inv then Total_Inv; end if; يعني اذا الــ Function الخاص بالتأكد من الفاتورة قام بوظفته بشكل صحيحأذهب ونفذ الـــProcedure الخاص بعملية الحسابات. في الدرس القادم في حالة عدم وجود اسئلة سنتحدث عن علاقة اولاد العم وصلة القرابة وكيف يرتبط اولاد العم تحت اسم عائلة واحدة وحقوق وواجبات كل فرد في هذه العائلات ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sajahs بتاريخ: 8 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 8 فبراير 2010 اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمتهاللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين خيو انا لسه جديده وعم بتعلم منك ومرسي كتير لانو اسلوبك سهل ومفهوم انا لسه باديه درس درس بس ما عم بعرف وين بدي طبئ الكودات وشو البرنامج اللي اكتب فيو هاي الكودات؟؟؟مرسي كتير غلبتك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 8 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 8 فبراير 2010 اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمتهاللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين خيو انا لسه جديده وعم بتعلم منك ومرسي كتير لانو اسلوبك سهل ومفهوم انا لسه باديه درس درس بس ما عم بعرف وين بدي طبئ الكودات وشو البرنامج اللي اكتب فيو هاي الكودات؟؟؟مرسي كتير غلبتك اهلا وسهلا بالاخت الفاضلة ....مشكورة اختي على دعائكاول اتمنى لكي بداية مشرقة بأذن الله في عالم اوراكلثاني شي اختي الفاضلة هل انتي على دراية ما هي لغة اوراكل وما هي خصائصهاثالث شي هذه الاكود تتطبق على برنامج SQL Plus الخاص بقاعدة البيانات اوراكلاو بأستطاعتك العمل على احد البرناج المساعدة مثل Benthic او غيرها من البرامجوانا على الاستعداد اختي الفاضلة لأي استفسار . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
miash80 بتاريخ: 10 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 فبراير 2010 السلام عليكم ورحمة الله وبركاتهأخواني وأخواتي الاعزاء قلنا في الدرس السابق سنتحدث عن علاقة اولاد العمومة ((( العائلة ))) علاقة اولاد العم الـــــProcedure والـــــFunction .بسم الله نبدء ......مقدمة بسيطة....بعد تعرفنا على اولاد العم يجب هنالك تنظيم لاولاد العم ومعرفة كل واحد لأي عائلة ينتمي .مثال بسيط للتوضيح :عندي مجموعة من الاسماء كالتالي :1) احمد الوزني 2) فيصل عصفور 3) ايمن الوزني4)محمد البشيتي 5)محمود الوزني 6) احمد البشيتي7) حمزة عصفور 8) عمر البشيتي 9)عبدالله عصفور10) زاهد عصفور 11)حسن البشيتيكما لاحظنا الاسماء مختلفة ولكن اسماء العائلات مكررة .لنقوم بعملية تنظيم نفرز هذه الاسماء من خلال أسماء العائلات .اولا عندي اسماء 3 عائلات وهي الوزني والبشيتي و عصفور .والتنظيم كالتالي .1) الوزني (احمد , أيمن , محمود ) .2) البشيتي (عمر, احمد , محمد ,حسين).3 ) عصفور (فيصل,حمزة ,عبدالله , زاهد).اذا الموضوع بسيط رتبنا الاسماء بالترتيب حسب اسم العائلة .مثال بسيط أخر : عندي عدد معين من الافراد وكل فرد من عائلة وأريد ان أوزع مهام لكل فرد حسب العائلةلانه كل عائلة مشهورة بشيئ معين فمثلا العائلة ص مشهورة بالحسابات والعائلة س مشهورة بجمع المالوالعائلة ك مشهورة بحمل الاثقال والعائلة م مشهورة بالبناء ....وهكذاوبالنفس المفهوم عندنا في الـــProcedure والـــFunction اذا يوجد مجموعة كبيرة من العائلاتومن هذه العائلات على سبيل المثال .1 ) المالية .ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function ))) أ ) حسابات الموردين.ب ) حسابات العملاء . ج ) الاصول الثابتة . د ) دليل الحسابات . ه ) الاوراق البنكية .وغيرهم من الــــProcedure والــFunction .2 ) الموارد البشرية HR .ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function ))) أ ) التدريب . ب ) احتسابات الرواتب . ج ) احتسابات الاجازات والمغادرات . د ) احتساب الدوام الاضافي . ه ) الحضور والانصراف .وغيرهم من الــــProcedure والــFunction .3 ) ادارة سلسلة الامدادات.ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function )))أ ) SCM المخزون . ب ) متابعة الموردين . ج ) ادخال الاوامر . د ) المشتريات . وغيرهم من الــــProcedure والــFunction .ويوجد الكثير من العائلات ( المخازن , الحسابات , الموارد البشرية ....الخ)اذا انا بأختصار شديد يجب ان اضع كل الــFunction والـــProcedure الخاصة بمهام معينة في عائلة واحدة بأسم مميز.يعني عائلة المحاسبة يوجد فيها فقط الــFunction والــProcedure الخاصة بالمحاسبة فقط .وعائلة المبيعات يوجد فيها فقط الــFunction والــProcedure الخاصة بالمبيعات فقط .وعائلة المشتريات يوجد فيها فقط الــFunction والــProcedure الخاصة المشتريات فقط .وهكذا ....طيب في النهاية اكيد اوراكل عرفت هذه العائلة بتعريف معين .اتدرون بماذا تعرف هذه العائلة في اوراكل .انه الـــــــــــــPackage وفي السابق عرفنا الــPackage .وهنالك تعريف اخر للـــPackage وهو عبارة عن عملية تنظيمية ينظم عمل الــProcedure والــFunction . الان سنشرح كيفك كتابة الــPackage .بسم الله نبدء .اول شي يجب معرفته الـــPackage يكتب على خطوتين .الخطوة الاولى وهي الـــCreate Specification وتحتوي على الــHeder .الخطوة الثانية وهي الـــCreate Body .كيفية كتابة الخطوة الاولى .........كتابة اسماء الــProcedure والـــFunction مع تمرير البراميتر في حالة وجود البراميتر . Create Or Replace Package Package_Name Is Procedure_Name(P1 In Number,P2 Out Number,.......); Procedure_Name(P1 In Out Varchar2); Function_Name(P1 In Varchar2) Return Varchar2; End; كيفية كتابة الخطوة الثانية .........كتابة اسماء الــProcedure والـــFunction مع كتابة محتوى الــProcedure والــFunction كاملا . Create Or Replace Package Body Package_Name Is Procedure_Name(P1 In Number,P2 Out Number,.......) هنا نكتب محتوى الــProcedure كاملا . . . End Procedure_Name; Procedure_Name(P1 In Out Varchar2) هنا نكتب محتوى الــProcedure كاملا . . . End Procedure_Name; Function_Name(P1 In Varchar2) Return Varchar2 is هنا نكتب محتوى الـــFunction كاملا . . . End Function_Name; End . نهايـــة الـــــــPackage الان سنكتب مثال على الــPackage .بسم الله نبدء .اريد ان اكتب باكج يحتوي على Procedure يحسب ناتج جمع رقمين وProcedure اعطيه رقم موظف ويعطيني اسمه مع راتبه واريد ان اكتب Function اعطيه رقم القسم ويعطيني اسم القسم .الجزء الاولى . SQL> SET SERVEROUTPUT ON SQL> SET VERIFY OFF SQL> CREATE OR REPLACE PACKAGE MY_PACK IS 2 PROCEDURE CAL(P_NO1 IN NUMBER,P_NO2 IN NUMBER); 3 procedure p_emp(p_empno in number); 4 FUNCTION F_DEPT(p_deptno in number) 5 RETURN VARCHAR2; 6 END; 7 / Package created. الخطوة الثانية . SQL> CREATE OR REPLACE PACKAGE BODY MY_PACK IS 2 PROCEDURE CAL(P_NO1 IN NUMBER,P_NO2 IN NUMBER) 3 IS 4 V NUMBER; 5 BEGIN 6 V:=P_NO1+P_NO2; 7 DBMS_OUTPUT.PUT_LINE('SUM ='||V); 8 END CAL; 9 procedure p_emp(p_empno in number) 10 is 11 cursor c is 12 select * 13 from emp 14 where empno=p_empno; 15 x c%rowtype; 16 begin 17 open c; 18 fetch c 19 into x; 20 if c%notfound then 21 dbms_output.put_line('No Data found ....'); 22 end if; 23 dbms_output.put_line('Name '||x.ename||' Salary '||x.sal); 24 close c; 25 END P_EMP; 26 FUNCTION F_DEPT(p_deptno in number) 27 return varchar2 28 is 29 v_name varchar2(50); 30 begin 31 select dname 32 into v_name 33 from dept 34 where deptno=p_deptno; 35 dbms_output.put_line('Name Dpet '||v_name); 36 exception 37 when no_data_found then 38 dbms_output.put_line('No Data found ....'); 39 return v_name; 40 END F_DEPT; 41 END; 42 / Package body created. الان نقوم بأستدعاء الــProcedure والـــFunction عن طريق الـــــــPackage .كالتالي ..............سنقوم بأستدعاء الـــProcedure الخاص بــعملية جمع رقمين . SQL> BEGIN 2 MY_PACK.CAL(&P_NO1,&P_NO2); 3 END; 4 / Enter value for p_no1: 50 Enter value for p_no2: 80 SUM =130 PL/SQL procedure successfully completed. سنقوم بأستدعاء الـــProcedure الخاص بأسم وراتب الموظف . SQL> BEGIN 2 MY_PACK.P_EMP(&P_EMP); 3 END; 4 / Enter value for p_emp: 7900 Name JAMES Salary 950 PL/SQL procedure successfully completed. سنقوم بأستدعاء الـــFunction الخاص بأسم القسم . SQL> DECLARE 2 V_DNAME VARCHAR2(100); 3 BEGIN 4 V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO); 5 END; 6 / Enter value for p_deptno: 10 Name Dpet ACCOUNTING كلام جميل جدااااااااااااااا وجميع الــProcedure والــFunction اشتغلت عن طريق الــPackage .طيب في حالة ما عرفنا الــProcedure او الــFunction في مرحلة الثانية الــBody وما عرفناه في المرحلة الاولى Specification هل نستطيع استخدام هذا الــProcedure او الــFunction من خلال الــPackage .لنر هذا المثال . SQL> SET SERVEROUTPUT ON SQL> SET VERIFY OFF SQL> CREATE OR REPLACE PACKAGE MY_PACK IS 2 PROCEDURE CAL(P_NO1 IN NUMBER,P_NO2 IN NUMBER); 3 procedure p_emp(p_empno in number); 4 FUNCTION F_DEPT(p_deptno in number) 5 RETURN VARCHAR2; 6 END; 7 / Package created. SQL> CREATE OR REPLACE PACKAGE BODY MY_PACK IS 2 PROCEDURE PRINT(P_TEXT IN VARCHAR2) 3 IS 4 BEGIN 5 DBMS_OUTPUT.PUT_LINE(P_TEXT); 6 END; 7 PROCEDURE CAL(P_NO1 IN NUMBER,P_NO2 IN NUMBER) 8 IS 9 V NUMBER; 10 BEGIN 11 V:=P_NO1+P_NO2; 12 DBMS_OUTPUT.PUT_LINE('SUM ='||V); 13 END CAL; 14 procedure p_emp(p_empno in number) 15 is 16 cursor c is 17 select * 18 from emp 19 where empno=p_empno; 20 x c%rowtype; 21 begin 22 open c; 23 fetch c 24 into x; 25 if c%notfound then 26 dbms_output.put_line('No Data found ....'); 27 end if; 28 dbms_output.put_line('Name '||x.ename||' Salary '||x.sal); 29 close c; 30 END P_EMP; 31 FUNCTION F_DEPT(p_deptno in number) 32 return varchar2 33 is 34 v_name varchar2(50); 35 begin 36 select dname 37 into v_name 38 from dept 39 where deptno=p_deptno; 40 dbms_output.put_line('Name Dpet '||v_name); 41 exception 42 when no_data_found then 43 dbms_output.put_line('No Data found ....'); 44 return v_name; 45 END F_DEPT; 46* END; 47 / ackage body created. سنجرب كتابة نفس الامثلة السابقة كالتالي . SQL> BEGIN 2 MY_PACK.P_EMP(&P_EMP); 3 END; 4 / Enter value for p_emp: 7900 Name JAMES Salary 950 PL/SQL procedure successfully completed. ------------------------------------- SQL> DECLARE 2 V_DNAME VARCHAR2(100); 3 BEGIN 4 V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO); 5 END; 6 / Enter value for p_deptno: 10 Name Dpet ACCOUNTING PL/SQL procedure successfully completed. -------------------------------- SQL> BEGIN 2 MY_PACK.CAL(&P_NO1,&P_NO2); 3 END; 4 / Enter value for p_no1: 50 Enter value for p_no2: 80 SUM =130 PL/SQL procedure successfully completed. كلام جميل جداااااااااا اعطاني النتيجة المطلوبة .طيب الان لنجرب الــProcedure الجديد الذي عرفناه فقط في الـــBody .اول مرة سأجرب تطبيق هذا الــProcedure لوحده لاني بالاصل كاتبه قبل الــPackage .لنرى ........... SQL> BEGIN 2 PRINT('HOW ARE YOU ...?'); 3 END; 4 / HOW ARE YOU ...? PL/SQL procedure successfully completed. تم المطلوب بشكل صحيح .الان اريد استدعاء الــProcedure عن طريق الــPackage لنرى النتيجة . SQL> BEGIN 2 MY_PACK .PRINT('HOW ARE YOU ...?'); 3 END; 4 / BEGIN * ERROR at line 1: ORA-06550: line 2, column 4: PLS-00302: component 'PRINT' must be declared ORA-06550: line 2, column 1: PL/SQL: Statement ignored طلع لنا Erorr وهذا كلام صحيح في حالة كتابة الــProcedure او الــFunction في الــBody وعدم تعريفه في الــSpicifcation لا نستطيع التعامل معه الا داخل الــPackage فقط .والان سأقوم بالتعامل مع الـــProcedure الخاص بعملية الــPrint داخل الـ Package كالتالي . SQL> ed Wrote file afiedt.buf 1 CREATE OR REPLACE PACKAGE BODY MY_PACK IS 2 PROCEDURE PRINT(P_TEXT IN VARCHAR2) 3 IS 4 BEGIN 5 DBMS_OUTPUT.PUT_LINE(P_TEXT); 6 END; 7 PROCEDURE CAL(P_NO1 IN NUMBER,P_NO2 IN NUMBER) 8 IS 9 V NUMBER; 10 BEGIN 11 V:=P_NO1+P_NO2; 12 print('SUM ='||V); 13 END CAL; 14 procedure p_emp(p_empno in number) 15 is 16 cursor c is 17 select * 18 from emp 19 where empno=p_empno; 20 x c%rowtype; 21 begin 22 open c; 23 fetch c 24 into x; 25 if c%notfound then 26 print('No Data found ....'); 27 end if; 28 print('Name '||x.ename||' Salary '||x.sal); 29 close c; 30 END P_EMP; 31 FUNCTION F_DEPT(p_deptno in number) 32 return varchar2 33 is 34 v_name varchar2(50); 35 begin 36 select dname 37 into v_name 38 from dept 39 where deptno=p_deptno; 40 print('Name Dpet '||v_name); 41 exception 42 when no_data_found then 43 print('No Data found ....'); 44 return v_name; 45 END F_DEPT; 46* END; SQL> / Package body created. سنقوم بعملية استدعاء الــProcedure والــFunction مرة اخرى لنرى هل الــPrint اشتغلت ام لا . SQL> BEGIN 2 MY_PACK.P_EMP(&P_EMP); 3 END; 4 / Enter value for p_emp: 7900 Name JAMES Salary 950 PL/SQL procedure successfully completed. ------------------------------------- SQL> DECLARE 2 V_DNAME VARCHAR2(100); 3 BEGIN 4 V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO); 5 END; 6 / Enter value for p_deptno: 10 Name Dpet ACCOUNTING PL/SQL procedure successfully completed. -------------------------------- SQL> BEGIN 2 MY_PACK.CAL(&P_NO1,&P_NO2); 3 END; 4 / Enter value for p_no1: 50 Enter value for p_no2: 80 SUM =130 PL/SQL procedure successfully completed. الحمدلله اشتغلت الــPrint .إن شاء الله اذا لم يكن هنالك اسئلة سنكمل بأذن الله اخر درس في دروس الـــPL/SQL .أتمنى ان اكون قد اوصلت معلومة صحيحة وبشكل سهل .نلتقي في الدرس القادم بأذن الله . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ASALLAM بتاريخ: 14 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 14 فبراير 2010 شكرآ لك وبارك الله لك وزادك علماً ينتفع به اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 14 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 14 فبراير 2010 السلام عليكم ورحمة الله اخى الفاضل جهد متميز ... من عضو متميز شكرا لك على الاسلوب المبسط فى الشرح شكرا لك على الجهد المبذول شكرا لك على الاستمرار وحب العطاء جزاك الله خيرا اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمتهاللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.