صفحة 10 من 12 الأولىالأولى ... 56789101112 الأخيرةالأخيرة
النتائج 136 إلى 150 من 169

الموضوع: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

  1. #136
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    ملاحظات برمجية :

    انواع الاخطاء البرمجية :
    اولا اريدك ان تعرف مصطلحين برمجيين ... اعرف انك تريد قتلي .. ولكن افهم يا اخي .... وسوف يسهل عليك كل شيء .. .

    المفسر , والمترجم .. لا ادري .. ايهما
    Compiler وايهما Interpreter ...

    لكن .... اعتقد ان المترجم
    Compiler

    لا عليك من الترجمة ... لان ترجمة
    Compiler هي المجمع ...

    وعلى اسمه ... يأخذ الكود البرمجي كله .... ويحاول اصطياد الاخطاء ضربة واحدة , ويظهر لك الاخطاء مجمعة ...

    المفسر لا ..... يأخذ الكود سطر سطر ... ويرى هل السطر الاول صحيح ... اذن اكمل الكتابة ..

    تأتي السطر الثاني .. ويقول هل هذا السطر صحيح ... وهكذا ... طبعا عملية المفسر عملية بطيئة بالمرة ..

    و اغلبية اللغات تعتمد على المترجم ... او المجمع
    Compiler

    هل استطعت ان تستنتج عمل هذين ؟ وما هما بالضبط ؟؟

    عملهما هو اصطياد الاخطاء .. اذا لم يوجد اخطاء ... فسوف يترجمان كودك البرمجي .. الى لغة الالة .. وهي اللغة التي يفهمها الحاسب ... وهي لغة الصفر والواحد ....

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

    اقصد بالكود البرمجي ...
    program code او الكود المصدر Source Code وهو الشفرة البرمجية ...

    وهو البرنامج نفسه ... المكتوب باحد لغات البرمجة .... هذا ما اقصده بالكود ...


    الان الاخطاء هي :
    الاخطاء التركيبية
    Syntax Errors

    الاخطاء وقت التنفيذ
    Runtime Errors

    الاخطاء المنطقية
    Logic Errors

    هذه الثلاث انواع المشهورة , ولا اعتقد انه يوجد رابع ,,

    سوف اتحدث بشيء من التفصيل فيها ,, لذا تنبه لهذه الانواع التي من الممكن ان تقع وانت تبرمج , فرصتك اذا ما بتعرف تبرمج , انا الان احاول ان اجعلك حريف برمجة ...

    الاخطاء التركيبية
    Syntax Errors

    هل نسيت فاصلة , هل قد غلطت وكتبت اسم متغير مو موجود , هل قد نسيت حرف ..

    هذه الاخطاء الشائعة هي الاخطاء التركيبية , يعني لغة الـ
    PLSQL شكلها محدد , وتركيبتها محددة ....لو خالفتها او اخطأت فيها , فسوف يظهر لك رسالة خطأ ...

    هي صراحة مزعجة جدا جدا جدا ... لكنها مفيدة جدا جدا جدا .... ولا تتشائم منها ... بل يجب عليك ان تفضل هذه الميزة .... لماذا ؟؟

    انا لما كنت ابرمج في لغة ما .. وتدعى
    C++ (من لا يعرفها ؟؟) كنت اسب واشتم والعن حينما تأتي هذه الاخطاء , فيما بعد .. برمجت في مايسمى بلغات الاسكربت ... هذه اللغات (اقصد لغات الاسكربت)حينما لا تعرف متغيرات ... هي من وحدها تعرفه ...

    بالله عليك لو قلت :

    V1 number :=10 ;

    Begin

    Dbms_output.put_line(V11);

    هل هذا خطأ ؟؟ طبعا خطأ !! .... انا مثلا اخطأت ... غلطت ... لا ادري كيف غلطت ... زلة كيبورد ... سرحت في وجبة عشاء .. المهم انني لا اعرف كيف اخطأت !!

    وكتبت البرنامج السابق ... الـ
    PLSQL واللغات الاخرى سوف تقول لي خطأ !! لا يوجد متغير V11

    تأتي انت مثلي .. تسب وتلعن وتشتم ..... وتعدل خطأك وانت متلهف تريد ان ترى برنامجك .. وظهر خطأ ثاني ... و يرجع امبير الضغط الى الاتش في رأسك ...

    في لغات الاسكربت ... سوف تعرف هي اوتوماتيكي المتغير
    V11 يعني يصير متغيرين موجودين ...

    تأتي انت ... وترى الناتج
    NULL .... تقول انا بنفسي وضعت قيمة 10 في هذا المتغير (وانت لا تدري انك اخطأت !! )

    هذا طبعا خطأ بسيط ... لكن حينما يكون امامك 30 او 60 متغير (مثل ما حصل معي !!) فسوف تتمنى ميزة الاخطاء هذه ان ترجع ...


    هي طبعا الاخطاء ليست في تعريف المتغيرات !! بل في نسيانك لحرف من دالة ما ... او نسيانك لفاصلة منقوطة ...
    كود:
    declare
    
    v1 number :=0;
    
    v2 number :=10;
    
    begn
    
    dbms_output.put_line('??');
    
    end;
    
    /
    
    
    
    ERROR at line 6:
    
    ORA-06550: line 6, column 1:
    
    PLS-00103: Encountered the symbol "END" when expecting one of the following:
    
    begin function package pragma procedure subtype type use
    
    <an identifier> <a double-quoted delimited-identifier> form
    
    current cursor
    أين الخطأ يا ترى ؟؟

    انه في كلمة
    begin ...... انا اخطأت وكتبتها begn ...

    شباب ... تعودوا ان تقرأو الاخطاء ... ما اغباني ....

    جلست فترة طويلة ... ابحث عن الاخطاء في برامج كثيرة .... واتأخر في اصطياده !! .... وبعض الاحيان لا اصطاده ... ينتابني اليأس ... ولما اقرأ الخطأ بتمعن ... تأتي كالصاعقة !! .... اذ بالخطأ واضح جدا جدا ... ولم انتبه له !!

    لذا ... تعودوا ان تقرأوا الاخطاء ... ترجموها للعربي .. حاولوا ان تفكروا فيها .....

    الاخطاء وقت التنفيذ
    Runtime Errors

    الان ... عدلنا الاخطاء ... ويا سلام .. لا يوجد خطأ في برنامجنا ...

    شغلناه ... نظرنا اليه ....

    يا سلام .. البرنامج يشتغل مئة بالمئة .. لم يكتشف مترجم الأوراكل أي خطأ ... وها هو يشتغل ... نذهب نعمل شاي ... نرجع نلاقي البرنامج طلع لنا مئتين سطر ... اخطاء !!!!

    لماذا ؟؟ الم نتخلص من الاخطاء التركيبية ؟؟ يأتينا خطأ "وقت التنفيذ" ؟؟؟

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

    اعطيك اشهر مثال .... وهو القسمة على صفر ... قلي صفر تقسيم عشرة تساوي كم ؟؟ تساوي صفر .

    طيب عشرة تقسيم صفر ؟؟ كم تساوي ؟؟ يا اصحاب الرياضيات ... وينكم ؟؟

    النتيجة هي "غير معروفة "....

    حاسبات الدنيا لا تعرف نتيجة قسمة أي رقم على الصفر ....

    اليك مثال حي عليها :
    كود:
    SQL> declare
    
    2 v1 number :=0;
    
    3 v2 number :=10;
    
    4 begin
    
    5 dbms_output.put_line('??');
    
    6 dbms_output.put_line(v2/v1);
    
    7 end;
    
    8 /
    
    ??
    
    declare
    
    *
    
    ERROR at line 1:
    
    ORA-01476: divisor is equal to zero
    
    ORA-06512: at line 6

    في السطر الثاني عرفنا متغير به القيمة صفر ..

    في السطر الثالث عرفنا متغير به القيمة 10

    في السطر الخامس قلنا اعرض أي جملة على الشاشة ولتكن "؟؟"

    في السطر السادس قلنا اعرض ناتج قسمة المتغير الثاني على المتغير الاول ....

    كان المتغير الثاني 10 وكان المتغير الاول 0 ...

    يعني 10 تقسيم 0 .... النتيجة غير معروفة ....

    يأتي البرنامج ويقرأ هالكود البرمجي ..

    يقرأ السطور جميعها ولا يجد اخطاء تركيبية ..

    ثم يرجع ويقرأ لكي ينفذ ... بعد ان ضمن انه لا يوجد خطأ ...

    يأتي في السطر الاول .. الثاني .. الثالث .... الرابع .. ينفذ ....

    ثم يأتي السطر الخامس .... ويلاقي امر عرض القيمة "؟؟"

    يعرضها ومافيه أي مشاكل .. حلوين وطيبين ولا يوجد خلافات عائلية ..

    يأتي الى السطر السادس ... ويقول اعرض المتغير الثاني/ المتغير الاول ..

    يحسبها في راسه ... وتطلع نتيجة غير معروفة ...

    طبعا النتيجة الغير معروفة عنده ... يعني خطأ .... ليست كمثل الـ
    NULL !!

    فرق بينهما ....

    يأتي ... ويخبرك انه خطأ !! لا يجوز القسمة على الصفر !!

    هل فهمت !! ...

  2. #137
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    مثال اخر ....

    كود:
    SQL> declare
    
    2 v1 number :=10**10;
    
    3 v2 number :=v1**2;
    
    4 begin 
    
    5 dbms_output.put_line(v1);
    
    6 dbms_output.put_line(v2);
    
    7 v2:=v1**2;
    
    8 end;
    
    9 /
    
    10000000000
    
    100000000000000000000
    معنى ** أي اس ..

    عرفنا متغير
    v1 وهو يساوي 10 اس 10 ....

    المتغير
    v2 يساوي v1 اس اثنين ...

    البرنامج صحيح ومافيه مشاكل ... وعرض لنا القيمتين ... يا سلام ....

    انظر الى البرنامج التالي .. نفس البرنامج السابق ... ولكن فيه مشكلة :

    كود:
    SQL> declare
    
    2 v1 number :=10**100;
    
    3 v2 number;
    
    4 begin 
    
    5 dbms_output.put_line(v1);
    
    6 v2:=v1**2;
    
    7 dbms_output.put_line(v2);
    
    8 end;
    
    9 /
    
    1.000000000000000000000000000000000000000000000000000000000000000000000000000000
    
    000000000000000E+100
    
    declare
    
    *
    
    ERROR at line 1:
    
    ORA-06502: PL/SQL: numeric or value error
    
    ORA-06512: at line 6
    عرفنا المتغير
    v1 ويساوي 10 اس 100 !!!

    عدد كبير جدا ....

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

    ثم قلنا في السطر السادس ... المتغير
    v2 اجله تربيع المتغير v1 !!!

    سوف ينتج لدينا عدد كبير جدا جدا جدا ... ما زلنا في السطر السادس ..

    يقول أوراكل .."اخي ..... كسرت ظهري !! لماذا تريد ان تذبحني ؟ هذا عدد اكبر من سعة المتغير
    v2 !!!"

    طبعا صار طفح !! ... صار زيادة وطفرة هائلة في المتغير !!

    المتغير نوعه ماذا ؟
    number ..... وهو لا يتحمل عدد مكون من مئة صفر ... ونأتي بتربيعه !! يعني مئتين صفر !!

    هو تحمل مئة صفر ... لكن في النهاية .. لم يتحمل المئتين صفر !!

    أي صار خطأ وقت التنفيذ ... لانه كان شغال مئة بالمئة ... والدليل عرض لنا المتغير
    v1 .... ثم وهو يفكر ويفحط وينفذ اوامرنا البلهاء ... طفح الكيل به لكي يعطينا خطأ وقت التنفيذ ... ارجو ان يكون ذلك مفهوم .... ولا يقتصر فهمك في عرض نتيجة ثم يظهر خطأ !! يمكن بعض الكمبيوترات تبقى ايام تخدم مجموعة هائلة من البشر ... وبعد هذه الايام صادف ان هنالك طفح في احد المتغيرات ... وياااااحبيبي ... تطلع رسالة خطأ تفيد بايقاف البرنامج ...

    سوف نتعلم فيما بعد .. كيف نجعل برنامج ما ... مستقر ... أي اذا ظهرت مثل هذه الاخطاء ... يكون شغال لا يغلق ابدا !! .. سوف نتعلم هذا الاستقرار ...

    اليك تحدي من نوع خاص !! .. وهو التحدي الاول !!

    اريدك ان تعمل برنامج يعطيني خطأ وقت التنفيذ .. ليس لاعداد !! بل لمتغيرات نصية !!

    الاخطاء المنطقية
    Logic Errors

    العن وابشع الاخطاء .. والتي من الممكن تودينا في داهية ...

    المصيبة انها خفية .. والمصيبة الاعظم اننا حتى لو اصلحناها .... فلا نعرف بعض الاحيان هل اصلحنا هذا الخطأ او وقعنا في خطأ منطقي اخر !!

    هو لا يظهر رسالة خطأ قبل التنفيذ !! ولا يظهر رسالة خطأ اثناء التنفيذ !!

    هو يسكت !! .. ويهز رأسه ويقول لك "مم .. مم .. صح صح ... انت صحيح !
    !"

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

    فكرته هي كالتالي .. تأتي انت وتعمل احصائية مثلا ... والاحصائيات فيها الجمع والقسمة والطرح والضرب والقتل والصلب ... واخرى لا تعلمها !! ...

    وتأتي انت وتخطئ في مسئلة ما !! ... نسيت ان تضع الجذر مثلا !!

    واذا بالبرنامج يصفق لك ... ويقول "انظر الناتج النهائي" !!

    تأتي انت وتنطنط على الكرسي ... وتقول هذا هو الناتج النهائي ... تقدم البحث وانت تعتقد ان النتيجة صحيحة ..

    بعد التدقيق من قبل الدكاترة ... واذ النتيجة خطأ !!

    لا تعرف .. كيف .. فين .. أين ... لماذا الخطأ !!

    هل من البرنامج ؟ هل من قواعد الاحصاء ؟ هل من النظريات ؟ هل وهل وهل ؟؟ والحقيقة انك نسيت ذلك الجذر اللعين !!

    تبا لهذا الخطأ !! المصيبة انه غير معروف المصدر !! .. والمصيبة الاعظم ان امثلته ليست كثيرة فحسب .. انما لا نهائية الاحتمالات !!.. انا شخصيا اكرهه ....ويحدث معي بشكل متكرر ... وهو اكثر الاخطاء شناعة ..

    اذ انني ابحث وابحث وابحث ... واتتبع البرنامج ولا اعرف أين الخطأ !!

    طبعا انا اتكلم في برنامج مكون من
    1000 سطر او 10000 سطر .... ليس في خمسين سطر فقط !!

    اليك مثال ... ويا مكثر الامثلة في هذا الخطأ اللعين .. مثال يوضح المعدل لثلاث قيم ..
    :

    كود:
    SQL> declare
    
    2 v1 number :=10;
    
    3 v2 number :=20;
    
    4 v3 number :=60;
    
    5 v_avg number ;
    
    6 begin
    
    7 v_avg := (v1 + v2 + v3)/3;
    
    8 dbms_output.put_line('the averge is:'||v_avg);
    
    9 end;
    
    10 /
    
    the averge is:30
    
    
    
    PL/SQL procedure successfully completed.
    طبعا هذا البرنامج صحيح مئة بالمئة ..

    تأتي انت .... مثلا وتخطئ في السطر السابع ....فبدلا من ان تكتب عدد المتغيرات وهو ثلاث قيم .. كتبت اثنين ...

    وتظهر المعدل ... وانت تعتقد انه صحيح :
    كود:
    SQL> declare
    
    2 v1 number :=10;
    
    3 v2 number :=20;
    
    4 v3 number :=60;
    
    5 v_avg number ;
    
    6 begin
    
    7 v_avg := (v1 + v2 + v3)/2;
    
    8 dbms_output.put_line('the averge is:'||v_avg);
    
    9 end;
    
    10 /
    
    the averge is:45
    
    
    
    PL/SQL procedure successfully completed.
    صدقني ...

    انت ترى المثال السابق .. سهل ويمكن اكتشاف الخطأ !!

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



    مالذي يحصل بداخل أوراكل ؟
    عادة في المترجمات الخاصة باللغات الاخرى ....

    يأخذ المترجم الكود المصدر ... ثم يحوله الى لغة الالة .... أي اصفار واحاد ..

    يعني بالفصيح ..... يحوله الى ملف تنفيذي .. من نوع
    exe ...

    الملفات بداخل الجهاز في الحقيقة نوعين ..

    ملف تنفيذي ... وملف مقروء
    ....

    مثال على الملف المقروء ... ملفات الوورد ... ملفات الاكسس .. ملفات النوت باد .... ملفات قواعد البيانات ..

    ولا تنسى ان المجلدات
    folder ليست الا ملف ... ملف عادي جدا , صراحة نستطيع بطريقة ما ان نقرأ الملف هذا ...

    مثال على الملف التنفيذي .... هو ملفات
    exe , مثل البرامج , الفيروسات ......

    هي ملفات عادة لا نستطيع ان نقرأها ..

    هي اوامر ... يا حاسب اعمل .. يا حاسب افعل ...

    الكمبيوتر حينما يقرأها ... يعرف انها اوامر ... فيبدأ بتنفيذها عند تشغيلها ....

    نستطيع القول الان .. ان الملف الذي به الكود المصدر ... ملف مقروء ... وسوف يتحول الى ملف تنفيذي ...

    بواسطة ماذا ؟ بواسطة المترجمات ...

    يأخذ المترجم الخاص بالأوراكل الكود البرمجي ويقرأه ثم يتأكد من الاخطاء , وبعدها يحوله الى ملف

    يدعى بـ
    P-CODE .. معلوماتنا عن هذا الملف ... قليلة ..... ان شاء الله اعمل فيه بحث ..

    وساتكلم عنه ان شاء الله في الدروس القادمة ..


    اريد ان انوه ... انني سأتبع اسلوب غريب ...

    سوف لن اشرح بالعناوين , بل سأشرح بالامثلة ....

    سوف اكثر من الامثلة ..... واخترع الامثلة .... لكي يتسنى لكم الفهم ....

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


  3. #138
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    الدرس الثالث عشر
    اسم الدرس
    :لغة PLSQL والتفاعل مع سيرفر أوراكل بواسطة جمل الاستعلام .

    نوع الدرس
    : تطبيقي

    صعوبة الدرس
    : **** من *****

    الوقت المتوقع منك لفهم الدرس
    : اربع ساعات .

    المتوقع منك في هذا الدرس
    :

    - ان تخلط ... وتمزج لغتي
    SQL و PLSQL

    - الجمل الشرطية ...

    هيا لنؤركل ^^

    السلام عليكم ,,

    قبل البدء في درس اليوم ... اتوقع انك حللت تحديات الدرس السابق ..

    كان تحدي واحد وهو :
    اريدك ان تعمل برنامج يعطيني خطأ وقت التنفيذ .. ليس لاعداد !! بل لمتغيرات نصية !!
    قبل ان تشاهد الحل .. فكر فيه .. اقرأ الدرس السابق ....

    الحل هو

    درسنا لهذا اليوم هو التفاعل مع سيرفر أوراكل ...

    وش هو سيرفر أوراكل ؟ يعني برنامج أوراكل الي يجيب لنا المصادر ويعدل لنا المصادر , و يتعامل مع المصادر
    resources , وش هي هالمصادر ؟

    هي قواعد البيانات ... هي البيانات ... هي الملفات المخزنة لديه , هي الجداول وما الى ذلك

    وطبعا لا نصل الى هذه الموارد الا عبر ماذا ؟ عبر لغة الـ
    SQL

    يعني بالعربي . . درس اليوم هو خلط
    PLSQL مع SQL

    لترى جمل الـ
    SQL في برنامج الـ PLSQL


  4. #139
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    استخدام جمل الاستعلام :
    هيا لنعرض اسم صاحب الرقم 7839
    , ببرنامج PLSQL ... اتوقع كم شخص يحمل الرقم 7839 ؟؟ طبعا واحد شخص .. واحد موظف ليس الا .... لماذا ؟؟ سوال غبي ... لانه مفتاح أساسي !! ولا يملك الرقم 7839 الا موظف واحد ,, لذا ... فان ناتج جملة الاستعلام كم صف ؟ صف واحد ... اكرر سجل واحد .




    كود:
    declare 
    
    v_name varchar(15);
    
    begin
    
    select ename into v_name from emp where empno=7839;
    
    dbms_output.put_line(v_name);
    
    end;
    
    /
    انظر الى البرنامج ....

    في السطر الثاني عرفنا متغير من نوع ماذا ؟؟؟ من نوع نص وحده 15 حرف ....

    في السطر الرابع جملة استعلام غريبة قليلا , فيها زيادة
    into v_name .... ما معناها ؟

    يعني ... يا أوراكل ... احضر لي اسم الموظف وضعه في المتغير
    v_name ..... خزنه في هذا المتغير ..

    أي موظف ؟؟ أي الموظف رقمه 7839 .... وطبعا لا يوجد الا موظف واحد ... وهو
    KING ...

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

    الان المتغير
    v_name .... مالموجود به ؟ اسم الموظف الذي يحمل الرقم 7839 ...

    في السطر الخامس قلنا اطبعه على الشاشة ...

    ستكون المخرجات هي :

    كود:
    KING

    وهو صاحب الرقم ..... 7839

    لاحظ ان جملة الاستعلام هنا ليست للعرض ... بل لجلب البيانات من قاعدة البيانات ...

    يعني .... لو قلنا :
    كود:
    select ename from emp where empno=7839 ;
    فان أوراكل يفهم انه لغة
    SQL فقط ...

    وسوف يعرضها ..

    لكن نحن بداخل برنامج .... أي ان معنى جملة
    select ..... في برنامجنا ليست "اعرض"

    بل معناها "اجلب" .... هات .... احضر يا أوراكل .....

    احضر البيانات من قاعدة البيانات .. وأتي بها الى برنامجنا ..


    لاحظ جملة الاستعلام في نهايتها فاصلة منقوطة ..

    لاحظ انها تحتوي على عمود
    ename .... وهو عمود واحد , ونوعه نص واعتقد ان حده 15 حرفا ....

    ولاحظ انني عرفت متغير من نفس نوع عمود
    ename .... لاننا وضعنا قيمة من العمود الى المتغير المفترض ان يكون نوعه نفس نوع العمود !


    لنعقد الامور .... ونخترع مشاكل ... اليك برنامج فيه خطأ
    ....

    كود:
    declare 
    
    v_name varchar(5);
    
    begin
    
    select ename into v_name from emp where empno=7654 ;
    
    dbms_output.put_line(v_name);
    
    end;
    
    /
    تتوقع ما هو الخطأ ... مع العلم ان الموظف الذي رقمه 7654 هو الموظف
    Martin

    فكر قليلا ....

    من الممكن ان لا يكون خطأ .... ويمكن يكون .... ما رأيك ؟؟

    انا اخبرك ...

    يوجد خطأ .....

    وهو ان حجم المتغير
    v_name .... كم حرف ؟ 5 حروف ..

    في السطر الرابع .... نفذ الأوراكل جملة الاستعلام , ثم وجد ان الناتج سجل واحد , وقيمة واحدة ...

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

    المهم وجد ان القيمة هي "
    MARTIN" ... يا سلام .. سوف يضعه في المتغير الذي اسمه v_name

    يأتي .. وهو مبسوط , ويضع الاسم مارتن المكون من ست حروف .. ويجد ان المتغير لا يحمل الا خمس حروف ..!!

    يصيح باعلى صوته ويقول :
    كود:
    ERROR at line 1:
    
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    
    ORA-06512: at line 4
    يضع فيك عيوب البشر كلها , ويفضحك بين العرب ويقول لك ..... ان المتغير صغير جدا جدا جدا ....

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

    مالعمل ؟؟؟ مشكلة .. لو كنت تتعامل مع جدول به ستة وعشرون الف مليار سجل , والفين عمود ... ونحن نريد ان نعرف متغير يشبه العمود
    X في هذا الجدول الضخم الذي يدعى بـ Z .... بالله عليك كيف نعرف حجم هذا العمود ؟؟ نروح ... ونكتب ما يلي :

    كود:
    Desc Z ;
    وسوف يعرض لنا الفين سطر لاعمدته الالفين وانواعها , ... ندور على العمود الي اسمه
    x وبعد عناء ... نجده من نوع رقم وسعته 4 ارقام ...

    X number(4)
    متعبة هاه ؟

    ماذا ؟ ليست متعبة ؟ طيب طيب ..
    .

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

    هذه مشكلة اذن ... ونحتاج لحل سريع وسهل ... ماذا ؟ ليست مشكلة لديك ؟؟

    طيب طيب .. انظر الى المثال البسيط التالي :

    كود:
    declare 
    
    v_name varchar(15);
    
    begin
    
    select ename into v_name from emp where empno=7654 ;
    
    dbms_output.put_line(v_name);
    
    end;
    
    /
    نفس المثال السابق ولكن حينما اكتشفنا ان العمود
    ename من نوع نص , وسعته 15 حرف ...

    وضعنا المتغير 15 حرف ....

    الان البرنامج يشتغل ... ويا سلام ... سوف تحفظه في ملف .. لكي يشتغل على طول ....

    وسوف نتعلم كيف نحفظ هذه البرامج ...

    بعد اسبوع .. اتى نذل يريد الحاق العار بك .... و غير العمود
    ename وجعله 16 خانة .. وادخل اسم موظف مكون من 16 حرف ....

    تأتي انت مبسوط ... وتشغل امام المدير برنامجك ... واذا .... بنفاق أوراكل واتهامه وافترائاته تتجه نحوك ..

    لن يفصلك المدير ولكن .. سوف يمترك بنظره من فوق لتحت .. ويمشي ... تأتي انت وترى مالمشكلة ... و .......






    لن اكمل ولكن ... هي صراحة ليست مشكلة .... بل مصيبة !!

    يعني بدل ما احفظ برنامج للابد يشتغل صح .... مهما صارت التغييرات , يعني شغل احترافي ...

    اطلت عليك ولكن اريدك ان تعيييييييييش المصائب الان , لكي لا تعيشها فيما بعد ...

    هنا ميزة في هذه اللغة رائعة جدا ... انظر الى المثال ....
    كود:
    declare
    
    v_name emp.ename%type ;
    
    begin
    
    select ename into v_name from emp where empno=7654 ;
    
    dbms_output.put_line(v_name);
    
    end;
    
    /

    ركز جيدا في السطر الثاني .. يوجد كلام كثير ....
    v_name emp.ename%type;
    عرفنا متغير من نوع ماذا ؟ من نوع حرف ؟ رقم ؟ تاريخ ؟ نصوص ؟ جغرافيا ؟

    بل من نفس نوع العمود
    ename الذي يقطن في الجدول emp ..... اكرر نفس نوع العمود ename !!

    يعني لو حرف ... يكون المتغير
    v_name حرف ... لو العمود رقم مكون من ست عشر خانة ... حيكون المتغير مثله تماما ... لو اليوم نص 5 حروف ... وبكرة 20 حرف ..... سيكون المتغير اليوم 5 حروف .. وبكرة 20 حرف ..

    مثله ..شبهه تماما ...

    والله رائعة هالنقطة ...

    انظر المخرجات :

    كود:
    MARTIN

    لاحظ للمرة المليون ... ان جملة الاستعلام ترجع لنا كم سجل ؟؟؟ سجل واحد ...

    انظر الى مثال ثاني ... سوف يعرض صاحب الرقم 7654 و اسم القسم الذي يعمل به ..


    كود:
    declare
    
    v_ename emp.ename%type;
    
    v_dname dept.dname%type;
    
    begin
    
    select e.ename , d.dname into v_ename , v_dname
    
    from emp e, dept d
    
    where e.deptno=d.deptno 
    
    and e.empno=7654 ;
    
    dbms_output.put_line('the name is :'||v_ename||' and his dept name is:'||v_dname);
    
    end;
    
    /
    برنامج دسم قليلا ....

    السطر الثاني .. عرفنا متغير اسمه
    v_ename ونوعه هو نفس نوع العمود ename في جدول emp

    السطر الثالث .. عرفنا متغير اخر اسمه
    v_dname ونوعه هو نفس نوع العمود dname في جدول dept

    السطور الخامس السادس السابع والثامن ... به جملة استعلام تحضر لنا اسم الموظف و اسم القسم الذي يعمل فيه ... ثم سيضع الاسم واسم القسم فين ؟ في المتغيرين التاليين
    v_ename , v_dname ....

    لاحظ الترتيب ....
    v_ename سوف يكون فيها اسم الموظف e.ename ...

    وايضا
    v_dname سيكون فيها اسم القسم d.dname

    الان اسألك .. ما بداخل المتغير
    v_dname ؟؟؟

    اخي اذا لم تعرف ... خليك ذكي .. وخذ جملة الاستعلام .. وشوف وش يطلع لك ...

    كود:
    SQL> select e.ename , d.dname from emp e, dept d
    
    2 where e.deptno=d.deptno
    
    3 and e.empno=7654 ;
    
    
    
    ENAME DNAME
    
    ---------- --------------
    
    MARTIN SALES
    يعني في داخل المتغير
    v_dname ... ماذا ؟ بداخله طبعا القيمة SALES

    الان في السطر التاسع .... سوف يعرض لنا اسم الموظف واسم قسمه ... لكل موظف يحمل الرقم 7654 ....

    ارجو ان يكون مفهوما وانظر الى الناتج كيف اصبح ... فكر فيه كيف صار الناتج هيك :
    كود:
    the name is :MARTIN and his dept name is:SALES
    الان اليك تحدي ....

    وتحدي من الطراز الاول , واعتقد انك لن تحله في هذه المرحلة ... ان حللته فانا اضمن لك مستقبل مشرق في البرمجة ... وان لم تحله فلا تيأس .. انا صعبت عليك الامر لتفكر ... فكر لنصف ساعة .. فكر لساعة ... ليست مضيعة وقت ... بل ان فكرت وفشلت ... فانت فشلت في برنامج صعب للغاية في هذه المرحلة .. صدقني ..


    في برنامجنا السابق يطبع اسم الموظف واسم قسمه .. للموظف الذي رقمه 7654 .... بجملة استعلام واحدة ...

    وكما تلاحظ اننا ربطنا جدولين ...

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

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


  5. #140
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    ,,
    الان ...

    هل تذكر اننا قلنا انه لا نستطيع استخدام نوعين من دوال الـ
    SQL في داخل هذه الدالة ؟

    ما هما ؟

    Decode
    و دوال المتعددة الصفوف مثل count , min , max ...

    ماذا كنت انا اقصد ؟

    هل صحيح لا نستطيع استخدامها ؟؟ طيب انظر المثال التالي ... يعرض لنا عدد الموظفين في الجدول
    emp

    كود:
    declare
    
    v_count number ;
    
    begin
    
    select count(*) into v_count from emp ;
    
    dbms_output.put_line(v_count);
    
    end;
    
    /
    سوف يطبع 14 .... كما هو موضح عندي .. لا ادري كم الموظفين عندك .

    المهم ....

    استطعنا استخدام الدالة !! ..... كيف ؟

    هو صحيح انها محرم استخدامها داخل لغة
    PLSQL .... ولكنها في مثالنا هذا .. داخل لغة SQL !!

    هل فهمت الفكرة !! ...

    انظر الى هذا المثال الذي سوف يطبع راتب الموظف الذي رقمه 7654 بهذه الصيغة :
    $01,234.00



    كود:
    declare 
    
    v_sal scott.emp.sal%type;
    
    begin
    
    select scott.emp.sal into v_sal from scott.emp
    
    where scott.emp.empno=7654;
    
    dbms_output.put_line( to_char(v_sal , '$00,000.00'));
    
    end;
    
    /
    اردت توضيح الدالة
    to_char شوف كيف استخدمناها في لغة الـ PLSQL ....

    وهي اخذت المتغير
    v_empno .. وهو رقم طبعا .. وحولته الى نص ... بهذه الهيئة $00,000.00 .... اعتقد انك تذكر عمل هذه الدالة , وتكلمنا حتى طفشنا فيها .. المهم المخرجات هي كما يلي :

    $01,250.00

    الان ... اتضحت فكرة استخدام دوال
    SQL داخل لغة الـ PLSQL ؟؟؟

    طيب .. انظر الى البرنامج مرة ثانية ....

    ستجد شيء زيادة .... في السطر الثاني ... والسطر الرابع والخامس ... ماهو ؟

    Scott.emp.sal%type

    Scott.emp.sal

    Scott.emp

    Scott.emp.empno

    ....
    اعتقد انك عرفت لماذا انا وضعتها ..

    تخيل انني المستخدم
    Silver ...

    هل لو كتبت البرنامج التالي :
    كود:
    declare 
    
    v_sal emp.sal%type;
    
    begin
    
    select
    
    emp.sal into v_sal from emp 
    
    where emp.empno=7654;
    
    dbms_output.put_line( to_char(v_sal , '$00,000.00'));
    
    end;
    
    /
    حيشتغل ؟؟

    لن يشتغل !!

    ليش ؟ وش السبب ؟ وش بيقول الأوراكل ؟

    بيقول "لا يوجد جدول اسمه
    emp ... يا سلفر !!"

    وهو صادق ... اذن ... مالحل ؟ مالعمل ؟

    تكتب البرنامج السابق الذي مفاده :

    كود:
    declare 
    
    v_sal scott.emp.sal%type;
    
    begin
    
    select scott.emp.sal into v_sal from scott.emp
    
    where scott.emp.empno=7654;
    
    dbms_output.put_line( to_char(v_sal , '$00,000.00'));
    
    end;
    
    /
    هل فهمت ؟

    من الان وصاعد .. تعود ان تكتب برامجك بهذه الصورة .. ياريت والله تفتكر هالنقطة ..

    انا سوف اتجاهلها كثيرا لاني اشرح وغارق في الشرح ...

    ارجو ان تتعود حتى في حل التحديات ان تكتب بهذه الصورة ... ارجوا ذلك ...

    طيب ...

    الان اليك برنامج يطبع كل بيانات الموظف الذي رقمه 7654 ,, هيا انظر الى البرنامج

    طيب ... ماهي الاعمدة في جدول الموظفين ؟؟

    ممممم ... رقم الموظف .. اسمه .. راتبه .. رقم القسم ... ممممم ... نسيت .....

    اها ... رقم مديره ... ممممم ...... نسيت البقية >< ...

    اذن سوف اراها بجملة الاستعلام :
    Desc emp;
    لكي اشاهد الاعمدة ...

    ممممم ثماني اعمدة ....
    كود:
    declare
    
    v_empno scott.emp.empno%type;
    
    v_ename scott.emp.ename%type;
    
    v_job scott.emp.job%type;
    
    v_mgr scott.emp.mgr%type;
    
    v_hiredate scott.emp.hiredate%type;
    
    v_sal scott.emp.sal%type;
    
    v_comm scott.emp.comm%type;
    
    v_deptno scott.emp.deptno%type;
    
    begin
    
    select scott.emp.empno , scott.emp.ename , scott.emp.job
    
    ,scott.emp.mgr , scott.emp.hiredate ,scott.emp.sal
    
    ,scott.emp.comm , scott.emp.deptno
    
    into v_empno , v_ename , v_job , v_mgr , v_hiredate
    
    ,v_sal , v_comm , v_deptno 
    
    from scott.emp where scott.emp.empno=7654;
    
    dbms_output.put_line('the name:'||v_ename);
    
    dbms_output.put_line('the number:'||v_empno);
    
    dbms_output.put_line('the job:'||v_job);
    
    dbms_output.put_line('the mgr:'||v_mgr);
    
    dbms_output.put_line('the hire date :'||v_hiredate);
    
    dbms_output.put_line('the salary:'||v_sal);
    
    dbms_output.put_line('the comm:'||v_comm);
    
    dbms_output.put_line('the deptno:'||v_deptno);
    
    end;
    
    /
    كحححححح كحححححححححح كححححححححح ..... افففففففف

    تعبت ....

    كأنني مشيت الف ميل ....
    ( دنا احوليت يارقالة !!)

    26 سطر ... هالبرنامج ... ولا تجعلني اخبرك كم خطأ سوف يظهر ..

    ولا تجعلني اخبرك انه مجرد 8 اعمدة فما بالك 100 عمود ....

    سوف انقلهم واحد تلو الاخر .. يعني حتكثر التعريفات ... وتتلخبط علينا ....

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

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

    تمعن وانظر كيف جملة الاستعلام ضخمة ... فما بالك بربط ثلاث جداول مثلا ...

    تمعن وانظر .... كم تعريف ..

    انظر الى المخرجات
    Output :


    كود:
    the name:MARTIN
    
    the number:7654
    
    the job:SALESMAN
    
    the mgr:7698
    
    the hire date :28/09/81
    
    the salary:1250
    
    the comm:1400
    
    the deptno:30

    خلينا واقعيين وعمليين وانتاجيين .... نريد حل يا
    PLSQL الله يرضى عليك ....

    هاه ؟ ماذا قلت ؟ متغيرات من نوع سجلات ؟؟؟ وما هذه المتغيرات ؟

    انظر الى البرنامج التالي .. اختصر علينا بعض التعب بس ... بالله لاحظ ان البرنامج صغر الى 1
    4 سطر !

    صراحة انجاز عظيم .... من 26 الى 1
    4 سطر !! والله اعتبره قمة العبقرية !!

    صدقني انه شيء رائع جدا في نظري
    .....

    كود:
    declare
    
    r_emp scott.emp%rowtype;
    
    begin
    
    select * into r_emp from scott.emp where scott.emp.empno=7654;
    
    dbms_output.put_line('the name:'||r_emp.ename);
    
    dbms_output.put_line('the number:'||r_emp.empno);
    
    dbms_output.put_line('the job:'||r_emp.job);
    
    dbms_output.put_line('the mgr:'||r_emp.mgr);
    
    dbms_output.put_line('the hire date :'||r_emp.hiredate);
    
    dbms_output.put_line('the salary:'||r_emp.sal);
    
    dbms_output.put_line('the comm:'||r_emp.comm);
    
    dbms_output.put_line('the deptno:'||r_emp.deptno);
    
    end;
    
    /

    ... ولو ركزت ... تلاقي البرنامج الثاني اكثر سهولة بكثييييييييييير

    ومقروء اكثر (قابل للقرائة وسهل القرائة)

    نفس المخرجات ...

    طيب ...

    مالذي حصل بالفعل ....

    في السطر الثاني ...عرفنا متغير
    r_emp ... نوعه ماذا ؟

    نوعه
    scott.emp%rowtype

    ما معنى هذا الكلام .. ركز ..

    يعني ... اجعل نوع المتغير
    e_emp سجل ... ( row type تعني نوع سجل )

    نوعه ماذا ؟ نوعه سجل ... سجل من ؟ سجل احمد ؟؟ محمد ؟؟

    لا لا ... بل سجل جدول ... يعني صف جدول ...

    أي جدول ؟ جدول الموظفين الخاص بالمستخدم
    scott

    ماذا يعني "اجعل المتغير
    r_emp نوعه مثل سجل الجدول emp" ؟؟؟؟ ماذا نقصد بها اصلا ؟

    انظر كيف يفكر الأوراكل ...

    يأتي الى جدول
    emp ... ويرى كم عمود فيه ... يجده ثمانية ....

    ماهي ؟
    ename , empno , sal ........

    الان سوف يجعل المتغير
    r_emp ... به ثماني متغيرات !!

    يعني المتغير
    r_emp .... هو ليس الا مجموعة متغيرات !! أي انه متغير كبيــــــــــر ...

    ماهي هذه المتغيرات الثمانية ؟ ما اسمائها ؟ اسماءها نفس اسماء اعمدة الجدول
    emp !!

    بدأت الامور تتشربك ... اعد قرائة السطور السابقة .. فكر في عقلك ... متغير كبير ..... مقسم الى عدد من المتغيرات !!

    دعنا نرسم شكل في مخيلتنا .... انا تخيلت الشكل التالي .. للمتغير الصورة 1500
    :


  6. #141
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    سوري .. الصورة 1500


    طيب طيب .... هل انتهى كل شي ؟؟ لا لا ..

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

    كيف ؟ كيف يعرف ان
    empno للمتغير r_emp ؟؟؟؟

    بسيطة ... اليك حل :

    r_emp.empno
    سيكون المتغير
    empno ... الموجود في المتغير r_emp .... بس ... هذه الفكرة ...


    ستجد في السطر الرابع جملة استعلام بسيطة جدا .... انظر ماذا تقول ...
    Select * into r_emp from scott.emp where scott.emp.empno=7654 ;
    سيضع كل الحقول .. بنفس الترتيب .... في المتغير
    r_emp ..... والذي نوعه ماذا ؟ نوعه سجل .. سجل ماذا ؟ سجل جدول الموظفين .. emp

    طبعا في هذا السطر الرابع ... سوف تكون ناتج الاستعلام :
    Select * from scott.emp where scott.emp.empno=7654 ;

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

    7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
    لاحظ للمرة المليونين ونصف المليون .... اننا حتى الان ... نجد ان الناتج سجل واحد ...

    طيب ... ماذا يعني في السطر الرابع ذلك الامر ؟

    سوف يقوم بوضع القيمة التي في العمود
    empno الذي في الجدول emp ... فين ؟ في المتغير r_emp.empno ...

    أي بمعنى اخر ... سيضع 7654 في المتغير
    r_emp.empno

    ثم يضع
    MARTIN في المتغير r_emp.ename ....

    وهكذا ...

    ارجو ان يكون ذلك واضح ..

    السطور من السطر الخامس الى السطر 12 ..... مخرجات ...

    لاحظ كيف استخدمنا المتغير الجميل
    r_emp والذي نوعه سجل !!

    ياسلام على هالنوع الجديد ...

    استخدمنا في السابق متغيرات من نوع اعمدة ..

    الان متغيرات من نوع سجلات !!

    والله مرونة عالية , واختصار للوقت والجهد ...

    طبعا اذا بتستخدم عدد قليل من الاعمدة .. لا تستخدم سجل كامل .. استخدم متغيرات من نوع الاعمدة التي تريدها , حتى لا تحجز من الذاكرة ... اكثر من حاجتك , انظر الى مثال يقتصد في

    كود:
    declare
    
    r_emp scott.emp%rowtype;
    
    begin
    
    select scott.emp.ename , scott.emp.empno into r_emp.ename ,r_emp.empno
    
    from scott.emp where scott.emp.empno=7654;
    
    dbms_output.put_line('the name:'||r_emp.ename);
    
    dbms_output.put_line('the number:'||r_emp.empno);
    
    end;
    
    /
    تتبع البرنامج ... تدرب ان تقرأ برامج وتتبعها , وتحاول فهمها ...

    اعرف ان هذا ممل ... لكن ... تحمل

    اريدك ان تستنتج ماذا يعمل هذا البرنامج وما فائدته , فهو سهل جدا
    ... لا تطبقه في الحاسب الا بعد ان تفكر فيه .

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


    الان اريدك ان تذكر شيء ... وهو
    data type ... أي انواع البيانات ..

    مثل
    varchar و char و number و X%type و date و X%rowtype

    هذه تسمى ماذا ؟ تسمى انواع البيانات
    data type ....

    سوف نرجع لها قريبا ... فلا تنسى ...

    مشاكل جمل
    الاستعلام مع لغة PLSQL

    مشكلتين ...

    ارجاع اكثر من سجل ...

    او ارجاع صفر سجل ...

    انظر الى المثال التالي :
    كود:
    declare
    
    v_name scott.emp.ename%type;
    
    begin
    
    select ename into v_name from scott.emp;
    
    dbms_output.put_line(v_name);
    
    end;
    
    /
    شوف النتيجة الي تفشل :


    كود:
    ERROR at line 1:
    
    ORA-01422: exact fetch returns more than requested number of rows
    
    ORA-06512: at line 4
    اقرأ الخطأ .... (وهو خطأ وقت التنفيذ
    Runtime Error)

    انظر اليه بتمعن ....

    يقول ان جملة الاستعلام ترجع كم سجل ؟ كم صف ؟ اكثر من صف واحد .
    .

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

    طيب ... لما شفنا الان انها ترجع اكثر من صف اعتبرها خطأ ... بالله عليك وش نسوي ؟

    الا يوجد طريقة لتساعدنا ؟

    يوجد طريقة وتدعى بـالمؤشر ....
    Cursor .... وهو الكابوس الاعظم في هذه اللغة , كل من ارادني ان اشرح له هذه اللغة .. كان يريدني ان اشرح له المؤشرات .... هي سهلة وصعبة في نفس الوقت

    قريبا سنشرحه ...

    الان مشكلة السجلات المتعددة حللناها ان شاء الله

    وتبقى مشكلة عدم ارجاع أي سجل قائمة والتي تعتبر
    Runtime Error , وحتى اشعار اخر ...


    المنطق (جمل
    if الشرطية):

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

    يوجد حل اخر في رأسي اعتقد انه يصلح قليلا ... وسنحاول ان نوجده معا ....

    ماهي هذه الجملة ؟
    if الشرطية ؟؟

    وما قصدي بالمنطق ؟

    انا اخبرك ...

    لو صار كذا وكذا اعمل كذا .... ولو ماصار كذا وكذا لا تعمل كذا بل اعمل كذا ....

    احتمالات .... مسارات للاحداث ...

    يا احمد ... لو اتى اخوك ... اذهب معه , واذا لم يأتي , اذهب لوحدك ..

    ويا خالد اذا لم تكن مشغول ساعدني , واذا كنت مشغول فاذهب ....

    اذا و اذا ... اذا لم ..

    كلها هذه شروط .. اذا تحققت ... تصير بعض الامور ... واذا لم تتحقق تصير امور اخرى ..

    هنا تكمن قوة البرمجة ... هنا يكمن المنطق الرقمي ... من هنا نستطيع عمل الذكاء الاصطناعي ..

    من هنا نستطيع جعل البرامج ذكية .. ونجعلها نفكر تفكير سليم كما نفكر نحن ..

    ندخل على الامثلة وبسرعة .... ونرى ما يمكننا فعله حيال هذه اللغة ....

    برنامج يخبرنا اذا كان المتغير
    v يساوي عشرة ... سيقول "هذا المتغير يساوي عشرة" :


    كود:
    declare
    
    v number :=10 ;
    
    begin
    
    if v=10 then
    
    dbms_output.put_line('it is 10');
    
    end if;
    
    end;
    
    /
    انظر الى المخرجات :

    كود:
    it is 10
    طيب طيب ...

    السطر الثاني عرفنا متغير وقيمته 10 .....

    في السطر الرابع قلنا "اذا
    v يساوي عشرة .... فانه " (معنى if أي "اذا" )

    في السطر الخامس سوف يخرج الرسالة
    it is 10

    في السطر السادس نهاية الشرط .....

    ما معنى هذا الكلام ؟

    لاحظ انه في السطر الرابع ... عملية اليساوي ... وليست اسناد !!

    فرق بينهما !! = يعني مساواه ... =: ... يعني اسناد ووضع قيمة ....

    الان في السطر الرابع سوف يتأكد هل ما بداخل
    v يساوي 10 او لا ...

    سؤال .. ما بداخل المتغير
    v ؟؟ عشرة ..

    طيب ... يقول اذا تحقق الشرط .. ما معنى اذا تحقق شرط ؟ واي شرط يتحدث عنه ؟

    الشرط هو كما قلنا
    v=10 .. اذا نعم ... نفذ الأوامر من بعد سطر الشرط ... الى end if ....

    اذا لم يتحقق أين يذهب ؟ في هذه الحالة ... سوف يذهب الى
    end if .... على طول ....

    بعدها ينتهي البرنامج
    ...



    انا اريد ان اضع قيمة اخرى .... دعنا نرى ذلك ....
    كود:
    declare
    
    v number :=9;
    
    begin
    
    if v=10 then 
    
    dbms_output.put_line('it is 10');
    
    end if;
    
    end;
    
    /
    النتيجة .... لم يعرض شيء !!

    لماذا لم يعرض شيء ؟

    انظر الى البرنامج مرة ثانية ...

    يقول اذا
    v=10 اطبع it is 10 ....

    اذا لم يساوي
    v العشرة .... انتهى الشرط ... خلاص ...(لاحظ then هي كلمة زائدة ولكنها مهمة ... ومعناها "فإنه ")

    هل انتهينا الى هذا الحد ؟ الا يوجد تعقيدات ؟


    اريد ان يرى ... اذا كان عشرة .. يطبع لي 10 ... اذا كان تسعة .. يطبع لي 9
    كود:
    declare
    
    v number :=9;
    
    begin
    
    if v=10 then 
    
    dbms_output.put_line('it is 10');
    
    end if ;
    
    if v=9 then 
    
    dbms_output.put_line('it is 9');
    
    end if ;
    
    end;
    
    /
    السطر الرابع .. اذا كان عشرة ... طبق السطور حتى اول
    end if تجده ...

    طبعا ينفذ الامر الذي في السطر الخامس ... (عرض انه 10) ,,, في السطر السادس انتهى الشرط ...

    في السطر السابع .. يقول اذا
    v=9 نفذ السطر الثامن .... (عرض انه 9) ....

    في السطر التاسع انتهى الشرط ...

    الان .. عرفت معناها ولم تفهم متى وكيف واين نستخدمها ....


    انظر الى المثال ... نفسه ولكن يجعلك انت تدخل القيمة .. هل تذكر ادخال القيم ؟؟؟
    كود:
    declare
    
    v number :=&Enter_Any_Number ;
    
    begin
    
    if v=10 then 
    
    dbms_output.put_line('it is 10');
    
    end if ;
    
    if v=9 then 
    
    dbms_output.put_line('it is 9');
    
    end if ;
    
    end;
    
    /
    جعلنا المتغير يساوي مدخل من عندنا ...

    ماذا يعني مدخل من عندنا ؟ يعني نحن ندخل رقم وسوف يتخزن في هذا المتغير .. اعتقد تكلمنا فيها كثيرا ...

    وطبعا علامة المدخل ... هي
    & .........

    سوف يسألك ... ويطلب منك ادخال قيمة :



    كود:
    Enter value for enter_any_number: 10
    
    
    
    it is 10
    انا ادخلت 10 ....

    قال لي
    it is 10

    لو ادخلنا 9 ... سيقول لنا
    it is 9

    طيب لو ادخلنا 8 ؟؟؟ لن يقول شيء ..... فكر فيها ..

    ولكن لاحظ ان لكل شرط .. تقفيلة خاصة ... أي
    end if ....


  7. #142
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    انظر الى المثال البسيط ... اذا يساوي 10 .... اضرب العدد في اثنين ... واقسمه على اربع ... واعرضه :
    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v=10 then
    
    v:=v*2;
    
    v:=v/4;
    
    dbms_output.put_line(v);
    
    end if ;
    
    end ;
    
    /
    كل هذه الأوامر ينفذها .. اذا تحقق الشرط !! ...

    يعني السطور 5 و 6 و 7 ... سوف تنفذ اذا كان العدد يساوي 10 ... هل فهمت ؟ بامكانك ان تضع ما شئت من الأوامر .... حتى لو كانت جمل استعلام او أي شيء اخر ....

    لنشربك الموضوع ولنعقده اكثر واكثر ... ولنمارس فن التعذيب .....
    اليك مثال يوضح اذا كان اكبر من الصفر معناه ماذا ؟ معناه موجب .. اذا اصغر من الصفر معناه سالب ...

    اذا يساوي الصفر ... فاعرض صفرا ....




    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v<0 then
    
    dbms_output.put_line('-');
    
    end if ;
    
    if v>0 then 
    
    dbms_output.put_line('+');
    
    end if ;
    
    if v=0 then
    
    dbms_output.put_line('0');
    
    end if ;
    
    end;
    
    /

    كود:
    Enter value for v: 1
    
    
    
    +

    كود:
    Enter value for v: -1000
    
    
    
    -

    كود:
    Enter value for v: 0
    
    
    
    0
    لا تعليق ...

    الان ... سوف نعقد اكثر واكثر ....

    وسأعدك بان ارفع امبير الضغط عندك الى ما بعد الاتش ..

    اريد برنامج يرى اذا كان المتغير اكبر من 10 ... يعرض "هو اكبر من 10 "....

    اذا لم يكن اكبر من عشرة .. وكان اكبر من خمسة ... يعرض "هو اكبر من 5 وليس اكبر من 10"

    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v>10 then
    
    dbms_output.put_line('it is > 10 ');
    
    end if ;
    
    if v>5 then
    
    dbms_output.put_line('it is not >10 but is >5 ');
    
    end if ;
    
    end;
    
    /
    في السطر الرابع .. اذا كان اكبر من 10 .... نفذ السطور التي بالاسفل (السطر الخامس) حتى جملة
    end if

    في السطر السابع .. اذا كان اكبر من خمسة ... فنفذ السطور التي بالاسفل وحتى سطر
    end if .... (الذي بالسطر التاسع ) ... نجرب برنامجنا .. هل هو ذكي ... هل سيكتشف ذلك حقا ؟؟ لنرى :

    كود:
    Enter value for v: 1
    جربنا الواحد .. ولله الحمد لم يطبع شيء .. لانه ليس اكبر من العشرة .... وليس اكبر من الخمسة .. فسوف لن ينفذ شيء ... يا سلام ...
    كود:
    Enter value for v: 6
    
    
    
    it is not >10 but is >5
    رائع ... الستة ايضا .... ليست اكبر من العشرة ... ولكنها اكبر من الخمسة

    فطبع "انها ليست اكبر من 10 ولكنها اكبر من 5" ... رائع جميل ...
    كود:
    Enter value for v: 11
    
    
    
    it is > 10
    
    it is not >10 but is >5
    جربنا 11 ... ياسلام .. يقول "انها اكبر من العشرة " .. صحيح .. جميل ..

    يقول ايضا "انها ليست اكبر من العشرة .. ولكنها اكبر من الخمسة" ؟؟؟!$#؟#@؟$@$%@#$%

    يوجد خطأ منطقي !! .... هذا هو الخطأ المنطقي !!

    فكر قليلا ... ما هو السؤال ؟؟ ما هو المفترض ان يكون ؟؟ انا قلت ...

    اريد برنامج يرى اذا كان المتغير اكبر من 10 ... يعرض "هو اكبر من 10 "....

    اذا لم يكن اكبر من عشرة .. وكان اكبر من خمسة ... يعرض "هو اكبر من 5 وليس اكبر من 10"

    انا لم اقل

    اريد برنامج يرى اذا كان المتغير اكبر من 10 ... يعرض "هو اكبر من 10 "....

    واذا كان اكبر من خمسة ... يعرض "هو اكبر من 5 وليس اكبر من 10"



    فرق بين الحالتين .. اذا كان اكبر من 10 .. اعمل واعمل .. اذا لم يكن !! وكان اكبر من خمسة اعمل وافعل ...

    بالله عليك قبل ان ترى الحل فكر ... فكر ولو قليلا ..

    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v>10 then
    
    dbms_output.put_line('it is > 10 ');
    
    end if ;
    
    if not(v>10) and v>5 then 
    
    dbms_output.put_line('it is not >10 but is >5 ');
    
    end if ;
    
    end;
    
    /
    ببساطة الحل في السطر السابع ...

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

    منطقك الان يشتغل ... ورأيك يفكر ... وها انت تقترب من المنطق الصحيح ... والتفكير السليم ...

    الحل السابق جميل ... ولكن ليس عملي ... لماذا ؟ انا اخبرك ..

    لو كان اكبر من عشرة ... قل اكبر من عشرة ...

    وإلا ..... اذا كان اكبر من خمسة ... قل اكبر من خمسة وليس اكبر من عشرة ...

    وإلا اذا كان اكبر من ثلاثة قل اكبر من ثلاثة وليس اكبر من خمسة وعشرة ...
    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v>10 then
    
    dbms_output.put_line('it is > 10 ');
    
    end if ;
    
    if not(v>10) and v>5 then 
    
    dbms_output.put_line('it is not >10 but is >5 ');
    
    end if ;
    
    if not(v>10) and not(v>5) and v>3 then
    
    dbms_output.put_line('it is not >10 and not >5 but is >3');
    
    end if ;
    
    end;
    
    /
    البرنامج صحيح ... جرب ان تضع القيم 2 و 4 و 6 و 11 ...

    لكن ... انظر الى السطر الثالث .... والسابع ... و العاشر .... الشرط يكبر ويكبر ويكبر .....

    هذا وانا قلت لك ..... 3 احتمالات فقط .. سوف تتعرض لبرامج بها العشرات والعشرات من الشروط والاحتمالات ...

    سوف تتلخبط... سوف تكره حياتك ....

    سوف تغلط .... سوف تكره برنامجك ..

    الحل ؟ مالحل ؟ انها
    else .... و else if ....

    Else ....
    تعني بالعربي وإلا ....

    مثلا ... "حل الواجب وإلا قتلتك " يعني اذا لم يتنفذ شرط عملية حل الواجب ... سوف تنفذ فيك عملية القتل

    اليك مثال جميل عليها .. مع العلم انهم اختصروها بدلا من
    else if قالو elsif

    برنامج يرى المتغير ..لو اكبر من او يساوي الصفر يطبع + ... وإلا .... يطبع -

    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v>0 then
    
    dbms_output.put_line('it is +');
    
    else 
    
    dbms_output.put_line('it is -');
    
    end if ;
    
    end ;
    
    /
    اولا ... انه شرطين ولهم تفقيلة واحدة
    end if ....

    هل لاحظت ؟؟

    يقول في السطر الرابع ... اذا اكبر من 0 اعمل كيت و كيت ...

    في السطر السادس ... وإلا ... اعمل كيت وكيت ...

    والله جميلة ... جميلة جدا ...

    لو ادخلنا -3 .. مالذي سيحصل .. في السطر الرابع سوف يقول "هل اكبر من الصفر ؟" اذا نعم اعرض انه موجب ..

    طيب
    3 ليس اكبر من الصفر ... أين يذهب ؟؟ الى أي سطر ؟

    الى السطر
    else .... أي السطر السادس مباشرة ... ويطبق ما فيها ....

    اذا ادخلنا 5 ... يأتي في السطر الرابع ... ويرى هل اكبر من الصفر ؟ نعم اكبر من الصفر .. اذن اعرض +

    ثم اذا شاهد
    else ..... يقفز وينط الى السطر الثامن end if ...



    الان مثالنا السابق الذي ينص على :

    لو كان اكبر من عشرة ... قل اكبر من عشرة ...

    وإلا ..... اذا كان اكبر من خمسة ... قل اكبر من خمسة وليس اكبر من عشرة ...

    وإلا اذا كان اكبر من ثلاثة قل اكبر من ثلاثة وليس اكبر من خمسة وعشرة ...

    انظر اليه الان كيف ستكون سهولته :

    كود:
    declare
    
    v number :=&V;
    
    begin
    
    if v>10 then
    
    dbms_output.put_line('it is > 10 ');
    
    elsif v>5 then
    
    dbms_output.put_line('it is not >10 but is >5 ');
    
    elsif v>3 then
    
    dbms_output.put_line('it is not >10 and not >5 but is >3');
    
    end if ;
    
    end;
    
    /
    Elsif ......
    هي السر ..

    يعني اذا لم يكن كذلك وكان ....

    في السطر السادس ...
    elsif v>5 then

    يعني لو ما كان اكبر من 10 .... وكان اكبر من خمسة ... فـ ـ ـ ـ ـ

    وفي السطر الثامن
    elsif v>3 then

    يقول لو ما كان اكبر من 10 ولا كان اكبر من 5 .... وكان اكبر من الثلاثة ... فـــــ .....

    السطر العاشر ... تقفيلة الكل ......

  8. #143
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    ارجوا ان تستنتج الفكرة ... وارجوا ان تفهمها جيدا ...

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

    لان مبدأها في جميع لغات البرمجة ... سوف تلاحظ ذلك .

    نفس فكرة المثال .. لكن لمتغيرين ولجملتين شرطيتين مختلفتين ... انظر :

    كود:
    declare
    
    v number :=&V;
    
    v2 number:=&V2;
    
    begin
    
    if v>10 then
    
    dbms_output.put_line('V is > 10 ');
    
    elsif v>5 then
    
    dbms_output.put_line('V is not >10 but is >5 ');
    
    end if ;
    
    if v2>10 then 
    
    dbms_output.put_line('V2 is > 10 ');
    
    elsif v2>5 then
    
    dbms_output.put_line('V2 is not >10 but is >5 ');
    
    end if ;
    
    end ;
    
    /
    في السطر الخامس . بدأ بجملة شرطية ...

    في السطر السابع ...
    elsif خاصة بالجملة الشرطية التي في السطر الخامس ...

    في السطر التاسع ...
    end if ... وهي تقفيلة السطر الخامس ... تقفيلة الجملة الشرطية التي في السطر الخامس ..

    في السطر العاشر .. بدأ بجملة شرطية ثانية ...

    في السطر الثاني عشر ..
    elsif ... خاصة بالجملة الشرطية التي في السطر كم ؟ في السطر العاشر ..

    في السطر الرابع عشر ... نهاية الجملة الشرطية التي في السطر العاشر ...

    انظر الى المخرجات .... انا ادخلت 10 و 20
    :

    كود:
    Enter value for v: 10
    
    
    
    Enter value for v2: 20
    
    
    
    V is not >10 but is >5
    
    V2 is > 10

    ارسمها على ورق ... تصرف ... حاول فهمها .. اخترع امثلة مشابهة ...

    هذه ليست صعبة ... الصعوبة حينما نرى الجمل الشرطية المتداخلة !!
    Nested Loop ...

    معقدة بعض الشيء ... وتحتاج الى تركيز ....

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

    قبل كل شيء .. انظر المثال هذا .... وفيه ان تدخل رقم موظف والبرنامج يرى هل هو موجود في الجدول او لا ..

    كود:
    declare 
    
    v_ename emp.ename%type;
    
    v_empno emp.empno%type :=&v_empno;
    
    begin
    
    select ename into v_ename from emp
    
    where empno=v_empno;
    
    dbms_output.put_line(v_ename||' is the employee who his empno is :'||v_empno);
    
    end;
    
    /
    انظر الى البرنامج السابق ....

    في السطر الثالث .. عرفنا متغير ... وعلينا ان ندخل قيمة فيه ..

    فأول ما ننفذ البرنامج , سوف يخبرنا الأوراكل ... ماهي القيمة التي تود ان تضعها في المتغير
    v_empno ؟؟

    في السطر الخامس والسادس ... نستعلم عن اسم الموظف الذي رقمه =
    v_empno وكما قلت ... هو الرقم الذي ادخلناه سابقا ....

    في السطر السابع ... اعرض اسم الموظف الذي رقمه يساوي الرقم المدخل ..

    اعرف ان شرحي سريع وغير مفهوم هذه المرة , ولكن .. اتوقع انك قرأت البرامج السابقة ففيها الشرح الكافي لها ان شاء الله .
    ..

    طبعا اذا لم تفهم .. اقرأ الدرس من البداية .. وحاول ان تعمل برنامج يعرض لنا اسم الموظف الذي رقمه يساوي الرقم الذي ندخله ....

    الان اليك المخرجات ... انا وضعت الرقم 7654 ... وهو رقم
    الأخ مارتن ....

    كود:
    Enter value for v_empno: 7654
    
    old 3: v_empno emp.empno%type :=&v_empno;
    
    new 3: v_empno emp.empno%type :=7654;
    
    
    
    MARTIN is the employee who his empno is :7654
    لا عليك من السطور الاولى ... انظر الى السطر الاخير من المدخل ... يقول ان مارتن هو صاحب الرقم 7654

    طيب ... نجرب ننفذ البرنامج مرة ثانية ... اقصد بتنفيذ البرنامج أي .. كتابته ومن ثم ضغط
    Enter ..... وسوف يتنفذ اوتوماتيكيا ... يعني انسخ البرنامج السابق .. والصقه فر الـ SQL PLUS... فسوف يتنفذ معك ....

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

    يعني ما ترجع لنا سجلات .. وهو خطأ وقت التنفيذ .. وصراحة مشكلة عويصة .. وهي احد المشكلتين التي قد تواجهنا في جمل الاستعلام في لغة الـ
    PLSQL

    انظر اليها :
    كود:
    Enter value for v_empno: 10
    
    old 3: v_empno emp.empno%type :=&v_empno;
    
    new 3: v_empno emp.empno%type :=10;
    
    declare
    
    *
    
    ERROR at line 1:
    
    ORA-01403: no data found
    
    ORA-06512: at line 5
    انا الان سوف اشرح الخطأ الذي ظهر ....

    ارجوا ان تتعودوا قرائة الاخطاء !! اقسم اننا نجلس وقت طويل لا نعرف ما هو الخطأ ... وحينما نقرأ الخطأ نكتشف انه خطأ غبي وابله ... وتافه ... فأقرأوا جزيتم الف خير ...

    اقرأ السطر الاول ... قال ادخل قيمة ... قلت له 10 .... في السطرين الثاني والثالث فقط ليخبرك انه استبدل العلامة
    &v_empno بالعدد 10 .....

    في السطر الرابع والخامس والسادس يقول انه فيه خطأ ...

    السطر السابع يقول انه "لا يوجد بيانات"

    في السطر الثامن يقول "ان هذا الخطأ يكمن في السطر الخامس من البرنامج"

    الان ...

    مالحل ؟ مالعمل ؟؟؟

    لماذا هذا خطأ .؟؟ اليس غباء ؟؟ تخيل برنامج كبير ... وصار فيه هالخطأ ... يعني خلاص ؟ يتوقف البرنامج بالمرة ؟

    صراحة فيه سبب لهذه الاخطاء ... فيما بعد ستعرفه ... وستعرف طريقة البرمجة الجميلة , والتي تسهل علينا فهم البرامج وان نكفش ونمسك بالخطأ متلبسا وبسرعة ...

    انا اخترعت حل بسيط جدا .... وهو باستخدام جملة الشرط
    if ......

    انظر اليه :

    كود:
    declare 
    
    v_ename emp.ename%type;
    
    v_count number ;
    
    v_empno emp.empno%type :=&v_empno;
    
    begin
    
    select count(*) into v_count from emp
    
    where empno=v_empno;
    
    if v_count = 0 then
    
    dbms_output.put_line('no one his empno='||v_empno);
    
    else 
    
    select ename into v_ename from emp
    
    where empno=v_empno;
    
    dbms_output.put_line(v_ename||' is the employee who his empno is :'||v_empno);
    
    end if ;
    
    end; 
    
    /
    اليك التحدي .... التحدي الثاني على ما اعتقد ..

    اشرح لي مالذي حدث بالفعل ؟ وما هي فكرتي في هذا البرنامج ؟؟

    صراحة لو ما عرفت تشرحه ... فهي مصيبة !! ...

    اذا لم تعرف .. حاول .... اذا لم تعرف ان تحاول ... جرب ...

    اذا لم تعرف ان تجرب .... حاول ان تجرب ...

    اذا ما تبغي اصلا تحاول وتجرب .. فلا تتعلم ...

    اليك المخرجات ....
    كود:
    Enter value for v_empno: 10
    
    old 4: v_empno emp.empno%type :=&v_empno;
    
    new 4: v_empno emp.empno%type :=10;
    
    no one his empno=10
    
    
    
    PL/SQL procedure successfully completed.
    فعلا .... لقد حللنا المشكلة ....
    كود:
    Enter value for v_empno: 7654
    
    old 4: v_empno emp.empno%type :=&v_empno;
    
    new 4: v_empno emp.empno%type :=7654;
    
    MARTIN is the employee who his empno is :7654
    
    
    
    PL/SQL procedure successfully completed.

  9. #144
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    الان اليك مثال يوضح هل الرقم المدخل زوجي او فردي !!

    اولا .... كيف نعرف اذا كان العدد زوجي او فردي ؟؟

    هاه ؟ لا تعرف ؟ طيب ...

    مثلا
    8 .. زوجي صح ؟؟ كيف عرفت ؟؟

    يظهر ان بعضكم .. لا يعرف ما معنى زوجي وما معنى فردي ...

    رياضيا العدد الزوجي هو العدد الذي يقبل القسمة على اثنين ....

    والفردي هو الذي لا يقبل القسمة على اثنين ...

    ما معنى يقبل او ما يقبل ؟

    يعني مثلا العشرة هو زوجي ... لو قسمناه على اثنين ... هل يبقى شيء ؟؟

    لا
    ...

    بعضهم لا يعرف ... اعرف ذلك .... ولا عيب .. تعرفون ان بعضهم لا يستخدم ما يتعلمه .. لذا فهو لا يعرف .

    يعني 8
    /2 = 4 هل يوجد كسور ؟ لا ... اذن لا يوجد باقي ..

    طيب ....

    11/2=5.5 ..... يعني ايش في باقي ومافي باقي ؟ يعني اذا فيه كسور .. يعني فيه باقي .. واذا مافيه كسور .. يعني مافيه باقي ... الـ 11 فيه باقي .. لان فيه كسور ... الباقي كم ؟ واحد ....كيف واحد ؟

    في العدد 11 ... ماهو العدد الاصغر منه الذي يقسم على العدد 2 ولا يطلع باقي ؟ طبعا العشرة ..

    10/2=5 .... طبعا اخذنا من الـ 11 كم ؟ 10 ..... ويبقى كم ؟؟؟ 1

    لو مش فاهم ... روح تعلم هالقوانين ... وارجع لهذا المثال ... عادي ... انا انتظرك ...


    اذن .. اذا الباقي من القسمة على اثنين يساوي صفر .... فهو عدد زوجي .. و إلا ... فهو عدد فردي !!

    انظر الى البرنامج :

    كود:
    declare 
    
    v number :=&V;
    
    begin
    
    if mod(v,2)=0 then 
    
    dbms_output.put_line('even');
    
    else
    
    dbms_output.put_line('odd');
    
    end if ;
    
    end;
    
    /
    هنا استخدام رائع لدالة
    mod ... وهي دالة تاخذ مدخلين الاول هو القاسم .. والثاني هو المقسوم عليه ..

    وترجع لنا ايش ؟؟؟ تخرج لنا ايش ؟؟ نتوقع منها ان تعطينا ايش ؟؟

    سوف تعطينا باقي القسمة ! .....


    في السطر الرابع ... اذا كان المتغير
    v(الذي ادخلنا فيه رقم) باقي قسمته على الاثنين يساوي صفر ... فهذا يعني انه موجب .... أي نفذ السطر الخامس (اطبع على الشاشة انه موجب even) ...

    في السطر السادس .. وإلا ....نفذ السطر السابع ( أطبعه سالب
    odd ) ...



    انظر الى الفردي ..

    كود:
    Enter value for v: 5
    
    old 2: v number :=&V;
    
    new 2: v number :=5;
    
    odd
    انظر ... الى الزوجي ...
    كود:
    Enter value for v: 6
    
    old 2: v number :=&V;
    
    new 2: v number :=6;
    
    even
    يتهيألي .... ان البرامج جميلة ... ومسلية .. وكالألغاز
    ..

    طبعا كلامي هذا نتج عن حب للبرمجة ... ليش حبيتها ؟ لأني
    أحس انني ابرع فيها ...

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

    لو عرفت لها ... سوف لن تبحها ... بل ستعشقها ..

    وكما قيل "الانسان عدو ما يجهله" .... يعني يكره الي يجهله .... يعني اذا يجهل ولا يعرف البرمجة .. سوف يكرهها طبعا ...

    بعضكم سوف يذهب ويخترع برامج من رأسه ... ومسائل .. والغاز .. ويحاول ان يبرمجها .. اعرف ذلك ..

    ولكن البعض الاخر ... هيـــه .... ولا همه شيء ...

    ويبقى الاهتمام سيد الموقف .

    برنامج ... يوضح الزوجي الموجب .. والزوجي السالب ...

    والفردي الموجب والفردي السالب ..

    كود:
    declare 
    
    v number :=&V;
    
    begin
    
    if v>0 and mod(v,2)=0 then
    
    dbms_output.put_line('even positive');
    
    elsif v>0 and mod(v,2)<>0 then
    
    dbms_output.put_line('odd positive');
    
    elsif v<0 and mod(v,2)=0 then
    
    dbms_output.put_line('even negative');
    
    elsif v<0 and mod(v,2)<>0 then
    
    dbms_output.put_line('odd negative');
    
    end if ;
    
    end;
    
    /
    برنامج جميل ....

    انظر الى السطر الرابع ... لو المتغير اكبر من الصفر .... و ..... باقي القسمة على اثنين يساوي صفر

    فهو ايش يعني ؟ اكبر من الصفر يعني موجب .. ويقبل القسمة على اثنين ايش يعني ؟ يعني زوجي ..

    اذن زوجي موجب .....

    نفس الفكرة في السطور الثانية ...

    هيا ... اليك تحدي .. وتحدي من نوع محترم !!

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

    انا اريد ان اعطيك اياه ليس لتعجيزك ... انما ... لكي تفكر فيه حتى الدرس القادم ان شاء الله ....

    خذ السؤال ....

    كيف نحكم على عدد انه يقسم على العدد ثلاثة ؟

    يعني باقي القسمة على ثلاثة يساوي صفر ...؟

    يعني .. انه لو قسم على ثلاثة .. يكون الناتج عدد صحيح بدون كسور .... ؟

    مثلا ...

    27 نقسمه على 3 يصبح الناتج 9 ... اذن عدد صحيح بلا كسور .... اذن
    27 يقبل القسمة على ثلاثة ...

    هذا ليس السؤال ....

    خذ هذه القاعدة ..

    بعض الاعداد كبيرة ... مثل 999 ... هل يقبل القسمة على ثلاثة ؟

    توجد طريقة جميلة ... بالنظر تعرف ... وهي 9 + 9 + 9 = 27 ... و 27 تقبل القسمة على ثلاثة ..

    طيب .. 123
    3 هل يقبل القسمة على ثلاثة ؟ .... 1 + 2 + 3 + 3 = 9 ... والـ 9 يقبل القسمة على ثلاثة .. اذن ...

    1233
    يقبل القسمة على ثلاثة ....

    هذا ليس سؤالي ..

    سؤالي هو ...

    اريد برنامج .. ندخل له عدد ..

    اذا كان العدد ثلاث ارقام ... فسوف يقبله .. واذا لم يكون ثلاث ارقام .. فلن يقبله ويطبع الرسالة
    (not 3 digit number)
    مامعنى ثلاث ارقام ؟ يعني ثلاث خانات ... أي انه عدد ذو ثلاث خانات مثل 567 (
    3 digit = ثلاث خانات او اعداد)

    الان ... قلنا البرنامج لا يقبل الا عدد من ثلاث خانات ....

    اذا لم يكن العدد ثلاث خانات .. يطبع الرسالة
    not 3 digit number ويخرج من البرنامج

    اذا كان العدد من ثلاث خانات هنا يطبع البرنامج مايلي :

    العدد الاول العدد الثاني العدد الثالث

    العدد الاول + العدد الثاني + العدد الثالث

    مجموع الاعداد الثلاثة ...

    يعني لو ادخلنا 123

    فانه يطبع الاتي
    :

    كود:
    Enter value for v: 123
    
    1 2 3
    
    1 + 2 + 3
    
    6
    ولو ادخلنا 999 فسوف يطبع الاتي :
    كود:
    Enter value for v: 999
    
    9 9 9
    
    9 + 9 + 9
    
    27
    برنامج من العيار الثقيل ....



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

  10. #145
    التسجيل
    11-03-2006
    المشاركات
    1

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    يا اخ حمزه بارك الله فيك انا يا دوب لسه مسجل بالمنتدي وحبيت اشجعك بكلمتين جزاك الله خير

  11. #146
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اقتباس المشاركة الأصلية كتبت بواسطة ميعاد عوده
    يا اخ حمزه بارك الله فيك انا يا دوب لسه مسجل بالمنتدي وحبيت اشجعك بكلمتين جزاك الله خير

    حياك الله في منتدانا
    وحياك الله بيننا ....
    شكرا لك .. وجزيتي الف الف خير ....
    تسلمي .... ^^

  12. #147
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    السلام عليكم ^^
    اهلا وسهلا مرة ثانية ..


    رجعنا رجعة ان شاء الله نقدر نختم فيها هذه الدورة ..
    احب اعتذر عما حصل من تأخير للدورة ....
    المفترض ان انتهي منها في شهر او شهرين ...
    لكن ظروفي والله ما تسمح ...


    المهم اننا احياء نرزق وحتى هذه اللحظة ...
    ان شاء الله نبدأ ..
    بس صار مشكلة في المنتدى ... وراحت اعتقد بعض الدروس ..
    ياريت لو في احد يقدر يرجع لنا الدروس الضائعة ...
    من المحفوظات الموجودة في المستعرض ..
    لو فيه احد يساعدنا في استرداد الصور الضائعة ياريت يكلمني ...

    ان شاء الله نبدأ بطريقة كما عهدتمونا .... وصراحة حاسس اني مش مستقر .. لكن احاول انهي الدورة ..




    سي يا ...

  13. #148
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    الدرس السادس عشر
    اسم الدرس
    :لغة PLSQL

    نوع الدرس
    : تطبيقي

    صعوبة الدرس
    : ** من *****

    الوقت المتوقع منك لفهم الدرس
    : خمس ساعات .

    المتوقع منك في هذا الدرس
    :

    -
    فكرة عن الجمل الشرطية

    -
    فكرة عن حلقات التكرار


    هيا لنؤركل ^^



    السلام عليكم ....


    هنا حل لتحديات الدرس الخامس عشر ...

    حل التحدي الاول ...
    كود:
     
    declare v_ename emp.ename%type; v_dname dept.dname%type; v_deptno emp.deptno%type; begin select ename into v_ename from emp where empno =7654 ; select deptno into v_deptno from emp where empno=7654; select dname into v_dname from dept where deptno = v_deptno ; dbms_output.put_line('the name is :'||v_ename||' and his dept name is:'||v_dname); end; /



    خزنا اسم الموظف صاحب الرقم 7654 ...

    خزنا رقم القسم لصاحب الرقم 7654 ...

    استخدمنا رقم القسم الذي خزناه لايجاد اسم القسم الخاص بالموظف رقم 7654 ....

    انظر الى المنطق في هذا البرنامج .... حاول فهمه وتتبعه وعمل مثله ...

    اعتقد انه سهل جدا , و اعتقد ان بعضكم فكر فيه .... ولا اعتقد ان احدكم حله ^^ ....

    حل اخر لهذا التحدي ....
    كود:
     
    
    
    
    declare 
    
    v_ename emp.ename%type;
    
    v_dname dept.dname%type;
    
    begin
    
    select ename into v_ename from emp 
    
    where empno =7654 ;
    
    select dname into v_dname from dept 
    
    where deptno=(select deptno from emp where empno =7654);
    
    dbms_output.put_line('the name is :'||v_ename||' and his dept name is:'||v_dname);
    
    end;
    
    /



    رائع هذا الحل ... وسهل ... استخدمنا فيه الاستعلامات الفرعية ....


    اليك حل ثالث !!!!!

    وهو أروعهم وأسهلهم نظريا .....
    كود:
    declare 
    
    v_ename emp.ename%type;
    
    v_dname dept.dname%type;
    
    begin
    
    select d.dname , e.ename 
    
    into v_dname , v_ename
    
    from emp e , dept d 
    
    where e.deptno=d.deptno
    
    and e.empno=7654;
    
    dbms_output.put_line('the name is :'||v_ename||' and his dept name is:'||v_dname);
    
    end;
    
    /


    فكرته فقط ربط الجدولين !!

    يعني ....

    اما ان تحضر كل معلومة من استعلام ما .. كما شاهدنا في الحل الاول ..

    او ان تحضر ما أمكن إحضاره باستخدام جمل الاستعلام الفرعية ... كما شاهدنا في الحل الثاني ..

    او ان تحضر ما أمكن إحضاره باستخدام جملة الاستعلام وربط الجداول مع بعضها ...

    وكل طريقة احلى من الثانية ......

    فكر فيهم ... حاول تفهمهم ... اخترع اسألة ... اذا لم تستطع ... فلا مشكلة ان شاء الله ....

    التحدي الثاني ....






    كل مافي الامر ... اننا عملنا استعلام عن
    count(*) .... هذه دالة رائعة .. ترجع لنا الصفوف ...

    يعني لو ما بيرجع لنا ولا صف .... فسوف تكتب هذه الدالة صفر .... أي صفر صف ....

    واقصد يرجع لنا صفوف ... أي حينما ننفذ جملة استعلام ... نتوقع بنتيجة ترجع لنا ...

    الان لو كان الـ
    count(*) .... يساوي صفر .. وش معناه ؟ معناه مافيه أي صف ..

    تجنبنا الخطأ ... بطريقة جميلة .... انا اراها جميلة ... لكن هي طريقتي انا ... وارى انه الافضل ان نتبع طرقهم هم .. الاوراكليون لأن لهم اغراضهم في حل مشاكلهم ...





    التحدي الثالث :
    كود:
    declare 
    
    v number :=&V;
    
    t1 number ;
    
    t2 number ;
    
    t3 number ;
    
    begin
    
    if v>999 or v<100 then
    
    dbms_output.put_line('the number is not 3 digit !!');
    
    else
    
    t1 :=mod(v,10);
    
    v:=trunc(v/10);
    
    t2 :=mod(v,10);
    
    v:=trunc(v/10);
    
    t3:=v;
    
    dbms_output.put_line(t3||' '||t2||' '||t1);
    
    dbms_output.put_line(t3||'+'||t2||'+'||t1);
    
    dbms_output.put_line(t3+t2+t1);
    
    end if ;
    
    end;
    
    /
    برنامج من العيار الثقيل ...

    السطر الثالث والرابع والخامس .... متغيرات رقمية للتخزين ...

    سؤالي كان .. ان يدخل المستخدم رقم ذو ثلاث خانات .. أي ذو ثلاث ارقام .... أي على سبيل المثال 123 ..... ثلاث خانات ... و 123456 ست خانات ... وهكذا ...

    طيب ... لكي نضمن ان هذا الرقم ثلاث خانات ... ما هو الشرط الذي نضعه لكي نضمن ذلك .؟؟

    أي انه اذا كان الرقم اكبر من او يساوي 100 او اصغر من او يساوي 999 فهذا رقم مكون من ثلاث خانات !!! ...

    فكرة حلوة ... 100 هو اصغر عدد مكون من ثلاث ارقام ... والـ 999 هو اكبر عدد ممكن .... مكون من ثلاث ارقام .

    لو كان هذا الرقم يحقق هذا الشرط ! ..... فهو رقم ثلاث خانات !!

    لاحظ .... اكبر من او يساوي 100 ....... و.......... اصغر من او يساوي 999 ....

    ولاحظ ايضا انه بإمكاننا ان نقول :

    اكبر من 99 .... واصغر من 1000 ...... للاعداد الصحيحة .... هل فهمت ؟ كلها واحدة ...

    طيب ...

    في السطر السابع قلت : اذا كان اكبر من 999 ... او ..... اصغر من 100 ... فهذا ليس عدد مكون من ثلاث خانات

    الله الله على المنطق ... كم هو معقد ... وكم هو سهل .... وكم هو صعب ...

    انتبه لهذه النقطة ... انتبه كثيرا ... فكر لو عدد اكبر من 999 .. هل ثلاث خانات ؟ لا ..

    (أو)فكر لو عدد اخر اصغر من 100 ... هل ثلاث خانات ؟ طبعا لا !!

    طيب طيب ... في السطر السابع اذا لم يكن ذو ثلاث خانات ... اطبع على الشاشة "ليس ثلاث خانات"


    في السطر التاسع يقول
    else .. لو لم يكن ثلاث خانات .. هل سيدخل وينفذ الأوامر التي في جزئية else ؟؟؟

    فكر ...

    طبعا لا ... سوف يقفز الى أين ؟؟؟ الى
    end if .....

    في السطر التاسع .. اذا كان ثلاث خانات ..... فاعمل السطور من 10 الى 17 ....

    السطر العاشر غريب !! والحادي عشر والثاني عشر ايضا ... الى الخامس عشر ..

    قبل ان اشرحها ... اريدك ان تعرف السؤال اصلا ..

    يقول "اذا كان ثلاث خانات ... اجمع كل خانة مع الاخرى !! واعطيني الناتج"

    يعني ... لو ادخلنا 156 ... سوف يعمل مايلي : 1 + 5 + 6 .... والناتج يساوي 12

    كيف نعملها بالله عليك ؟؟كيف نفرق كل خانة ؟؟؟ نحتاج لخدعة !! .....
    .

    خدعة مشهورة وهي بدالة باقي القسمة !!
    t1 := mod(v,10);

    في هذا السطر ... قلت الرقم الاول خزن فيه ماذا ؟

    خزن فيه مايلي :

    باقي قسمة
    v على عشرة .....

    مثال :

    t1 := mod(123,10);

    t1 :=3

    الان ... المتغير
    t1 ..... به أي خانة ؟؟؟ انظر .... انها خانة الاحاد ...

    هل لاحظت ذلك ؟؟؟

    قسمنا على عشرة ... لاخذ خانة الاحاد !!

    الان اريد خانة العشرات ... كيف ؟؟ كيف الوصول ؟؟؟

    v:=trunc(v/10);

    لماذا هذه الخطوة ؟؟؟ نعطيك المثال نفسه .
    v:=trunc(123/10)

    v:=trunc(12.3)

    v:=12

    الان العدد الذي ادخلناه .... صار 12 بدلا ان كان 123
    !! ....

    طيب طيب .. ما رأيك نعيد من جديد بطريقة رياضية .. وعلى اساس اننا ادخلنا 123 ...
    if 123>999 or 123<100 then

    dbms_output.put_line('the number is not 3 digit !!');

    طبعا لن تعرض الرسالة ... لانه رقم ذو ثلاث خانات ....


    عارض الشرط وخالفه .. اذن .... سوف يتم تنفيذ مايلي :
    Else



    t1 := mod(123,10);

    t1 := 3



    v:=trunc(123/10);

    v:=trunc(12.3)

    v:=12

    طبعا بعد ان كانت
    v بها العدد 123 ... صارت الان 12 ..

    يعني كأننا تخلصنا من ماذا ؟ من خانة الاحاد ... واين خزناها ؟؟ خزناها مسبقا في المتغير
    t1 صح ؟

    الان خانة العشرات .. والتي هي 2 ... موجودة الان في خانة الاحاد في المتغير
    v ... اكرر .. بعد ان تخلصنا من الـ3

    صارت الان ... خانة الاحاد ..... صح ؟

    t2 := mod(12,10) ;

    t2 :=2 ;



    v:=trunc(12/10);
    v:=trunc(1.2)

    v:=1;

    الان .... المتغير
    v به الرقم 1 .. والذي كان ... يا مكان .... في خانة المئات معزز مكرم ... تخلصنا من 2 والان الرقم 1 هو في خانة الاحاد ....



    t3:=v;



    المتغير
    t1 به الان الرقم الذي كان .... في خانة المئات .. والمتغير t2 به الرقم الذي كان في خانة العشرات ..

    واخيرا
    t3 يخزن العدد الذي كان في متغير الاحاد ...

    وضاع العدد الذي بداخل
    v الفعلي ..

    الان نستطيع التلاعب بالارقام .. انظر ماذا سوف ينتج جراء الامر التالي



    dbms_output.put_line(t3||' '||t2||' '||t1);

    المخرجات ستكون :

    1 2 3





    dbms_output.put_line(t3||'+'||t2||'+'||t1);

    مخرجاته ستكون :

    1+2+3



    dbms_output.put_line(t3+t2+t1);

    مخرجاته ستكون

    6



    صدقني انه صعب في البداية ... وفي النهاية اسهل بكثير ..

    واذا شاهدته سهل الان ... فهذا جيد ...

    برنامج مسلي ... ومفيد كثيرا

    جرب وادخل قيم ليست ثلاث خانات .. وجرب ادخل قيم اخرى بثلاث خانات

  14. #149
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    درسنا اليوم ..... لا بأس به ....سهل وبسيط

    الان ... لنعقد الامور .. ولنداخل الجمل الشرطية ... وكما تذكر التداخل في الوحدات

    Nested Block الذي اريتك صورة توضيحية لهذا التداخل ....



    الجمل الشرطية لها نفس المفهوم ... ونفس التداخل ....






    -




    الجمل الشرطية المتداخلة Nested If Condition:






    انظر البرنامج التالي :




    كود:
    declare
    v number :=&v;
    v2 number:=&v2;
    begin
    if v>0 then 
    dbms_output.put_line('v is positive');
    elsif v<0 then
    dbms_output.put_line('v is negative');
    end if ;
    if v2>0 then
    dbms_output.put_line('v2 is positive');
    elsif v2<0 then 
    dbms_output.put_line('v2 is negative ');
    end if ;
    end ;
    /
    كود:
    
    



    طبعا لو نفذناه يطلب منا البرنامج ادخال قيمة في المتغير

    v وقيمة في المتغير v2







    سوف يكتشف اذا كان



    v موجبا او سالب ... وسوف يكتشف v2 هل موجب او سالب هو الاخر .. وسيطبع ذلك ..



    انظر الى المخرجات ....




    كود:
    Enter value for v: 1
    old 2: v number :=&v;
    new 2: v number :=1;
    Enter value for v2: 2
    old 3: v2 number:=&v2;
    new 3: v2 number:=2;
    v is positive
    v2 is positive






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





    كود:
    declare
    كود:
     
    
    v number :=&v;
    v2 number:=&v2;
    begin
    if v>0 then
    dbms_output.put_line('v is positive');
    if v2>0 then
    dbms_output.put_line('v2 is positive');
    elsif v2<0 then
    dbms_output.put_line('v2 is negative ');
    end if ;
    elsif v<0 then
    dbms_output.put_line('v is negative');
    if v2>0 then
    dbms_output.put_line('v2 is positive');
    elsif v2<0 then
    dbms_output.put_line('v2 is negative ');
    end if ;
    end if ;
    end;
    /






    مشربك جدا ,,, ومربك جدا ,,,







    انظر الى الصورة 1600 :




    هناك جمل شرطية داخلية

    if inner ويوجد في مثالنا هذا جملتين شرطيتين داخليتين





    وايضا جملة واحدة شرطية خارجية

    if outer






    ارجو ان تفرق بينها وبين الصورة 1601



    اذ ان هذه الصورة لايوجد بها تداخل .


    ركز جيدا في الصورتين , ركز في ترتيبهما وفرق بينهما .





    حلقات التكرار :





    اريد ان اكرر أي امر او عملية عدد من المرات ....



    اريد مثلا ان اطبع الاعداد من واحد الى مئة ماذا اعمل ؟

    اريد ان اعرض اسم موظف الف مرة ...

    اريد ان اكرر شيء ما ... حتى حدوث شيء ما اخر ...

    ماذا اعمل ؟

    لنقل انني اريد ان اطبع كلمة


    hello world خمس مرات .... اليك البرنامج :











    كود:
    SQL> begin
    كود:
     
    
    2 dbms_output.put_line('hello world');
    3 dbms_output.put_line('hello world');
    4 dbms_output.put_line('hello world');
    5 dbms_output.put_line('hello world');
    6 dbms_output.put_line('hello world');
    7 end;
    8 /
    hello world
    hello world
    hello world
    hello world
    hello world




    لنقل ايضا انني اريد ان اطبع الاعداد من 1 الى 100 كل عدد في سطر ...


    اليك برنامج يطبع من 1 الى 10 :







    كود:
    begin
     
    dbms_output.put_line('1');
    كود:
     
    
    
    dbms_output.put_line('2');
    dbms_output.put_line('3');
    dbms_output.put_line('4');
    dbms_output.put_line('5');
    dbms_output.put_line('6');
    dbms_output.put_line('7');
    dbms_output.put_line('8');
    dbms_output.put_line('9');
    dbms_output.put_line('10');
    end;
    /








    اتعبني بالرغم من انه من 1 الى 10 ....



    اريد برنامج يطبع الاعداد التي من واحد الى عشرة الزوجية منها

    يعني لو العدد زوجي ... اطبعه والا فلا تطبع ... اليك البرنامج :






    كود:
    begin
     
    if mod(1,2)=0 then
    كود:
     
    
    dbms_output.put_line('1 is even');
    end if ;
    if mod(2,2)=0 then
    dbms_output.put_line('2 is even');
    end if ;
    if mod(3,2)=0 then
    dbms_output.put_line('3 is even');
    end if ;
    if mod(4,2)=0 then
    dbms_output.put_line('4 is even');
    end if ;
    if mod(5,2)=0 then
    dbms_output.put_line('5 is even');
    end if ;
    if mod(6,2)=0 then
    dbms_output.put_line('6 is even');
    end if ;
    if mod(7,2)=0 then
    dbms_output.put_line('7 is even');
    end if ;
    if mod(8,2)=0 then
    dbms_output.put_line('8 is even');
    end if ;
    if mod(9,2)=0 then
    dbms_output.put_line('9 is even');
    end if ;
    if mod(10,2)=0 then
    dbms_output.put_line('10 is even');
    end if ;
    end;
    /



    المخرجات


    كود:
     
    2 is even
    4 is even
    6 is even
    8 is even
    10 is even



































    التعديل الأخير تم بواسطة The Coder ; 28-05-2006 الساعة 03:09 AM

  15. #150
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    البرنامج ضخم ... ونحن نحتاج لتكرار عملية ما ..

    اريد منك ملاحظة انه يوجد شرط ... في تكرارنا هذا ... متى يتوقف التكرار ..؟؟

    يتوقف التكرار اذا وصلنا العدد عشرة !!

    اذن عملية ما ... تتكرر ولا تتوقف الا بشرط ما ..


    اكرر كلامي ....... تتكرر وتتوقف بوجود شرط ما !!

    رأينا البرنامج السابق كيف كان ضخم وتكرار فيه من ناحية الكتابة ... هذا وهو من 1 الى 10 ..

    فما بالك لو قلت لك ... من 1 الى 1000 ؟؟ خلينا واقعيين ... نحتاج لاداة تكرار ... تتوقف عند شرط معين !!

    يوجد هناك ما يسمى بجمل التكرار !

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

    يوجد العديد من الأنواع هذه ,, واذكر بعض منها

    جمل التكرار البسيطة
    Simple loop

    جمل التكرار العددية
    Numeric for loop

    جمل التكرار طالما
    While loop

    جمل التكرار الخاصة بالمؤشرات
    Cursor for loop

    الأخيرة سوف نأخذها فيما بعد ....

    جمل التكرار البسيطة
    Simple loop

    سأعطيك مثال تكرار
    hello world .... خمس مرات :
    كود:
    declare
    
    i number :=1;
    
    begin
    
    loop
    
    dbms_output.put_line('hello world');
    
    i:=i+1;
    
    if i>5 then
    
    exit;
    
    end if ;
    
    end loop;
    
    end; 
    
    /
    
    

    يظهر انه اصعب من ذلك البرنامج ,,,

    انظر اليه ...

    السطر الثاني عرفنا
    i وقيمتها الاولية هي 1

    السطر الرابع كلمة غريبة ... وهي
    loop يعني تكرار ... او حلقة تكرار .... او يعني ابدأ التكرار من هنا ...

    السطر الخامس يطبع الجملة ..

    السطر السادس المتغير
    i يزداد بواحد .... يعني كان هو 1 , والان سيصبح اثنين ...

    السطر السابع اذا كان المتغير اكبر من 5 ,,,,

    السطر الثامن ..
    exit ... أي اخرج .... اخرج من ماذا ؟ من البرنامج ؟؟ لا .... من حلقة التكرار !!

    السطر التاسع نهاية الشرط الموجود في السطر السابع

    السطر العاشر نهاية التكرار !!

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

    لم تفهم ؟ طيب ...

    اليك شرح موجز ...

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

    يعني لن يتوقف ابدا من التكرار .. طالما انه لا يوجد شيء او امر يردعه !!

    هذه نقطة مهمة ...

    في برنامجنا السابق ... يكرر كما قلت السطور من الرابع الى العاشر ...

    في السطر السادس سوف يزيد في كل مرة المتغير بواحد .. يعني المرة الاولى كان 1 ... يزداد بواحد ويصير 2

    في المرة الثانية يكون 2 ... يزداد بواحد فيصير 3 ... وهكذا ...

    السطر السابع ... يقول اذا كان المتغير اكبر من 5 ... ماذا يفعل ؟ يفعل السطر الثامن .. أي اخرج من التكرار !!

    هل تعرف ما هي المخرجات ؟ انظر :
    كود:
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world

    لماذا طبعها خمس مرات ؟

    أي انه كرر الجمل تلك خمس مرات !!

    انا اخبرك .. في التكرار الاول ..يطبع الجملة ويزيد المتغير بواحد (كان 1 ويصبح الان 2)

    هل المتغير اكبر من 5 ؟؟؟ لا ....


    في التكرار الثاني يطبع الجملة و يصير المتغير 3

    هل المتغير اكبر من 5 ؟؟؟ لا ....

    في التكرار الثالث يطبع الجملة و يصير المتغير 4

    هل المتغير اكبر من 5 ؟؟؟ لا ....

    في التكرار الرابع يطبع الجملة و يصير المتغير 5

    هل المتغير اكبر من 5 ؟؟؟ لا ....

    في التكرار الخامس يطبع الجملة و يصير المتغير 6

    هل المتغير اكبر من 5 ؟؟؟ نعم !!

    هنا ينفذ السطر الثامن .. لانه تحقق الشرط ... ينفذ امر
    exit ... أي اخرج !!

    اخرج من جملة التكرار !!

    سوف يخرج ويقفز الى أي سطر ؟ الى السطر الحادي عشر (بعد السطر العاشر الذي به الامر
    end loop)

    وبهذا ينتهي البرنامج !!

    ارجو ان يكون ذلك واضح ... اعرف ان الشرح الكتابي ليس كافيا في بعض الاحيان , ولكن طبق والعب في النتائج وانظر ... سوف اساعدك ...

    رأينا كم كان البرنامج معقد !! واطول من البرنامج الذي يطبع الجملة خمس مرات يدويا ..

    طيب .... البرنامج المعقد ... بإمكاننا ان نجعله يكرر اكثر بتغيير بسييييييط جدا ....

    ما رأيك ان نجعله يكرر 20 مرة ؟
    كود:
     
    declare i number :=1; begin loop dbms_output.put_line('hello world'); i:=i+1; if i>20 then exit; end if ; end loop; end; /



    هل شاهدت التغيير ؟ ... مجرد عدلنا في الشرط !!
    بدلا ان يكون اكبر من 5 .... يكون اكبر من 20 !!
    كود:
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    كود:




    تغيير بسيط جدا في البرنامج

    ... وتغيير كبير في الناتج !!



    مارأيك بخمسين ؟
    كود:
    declare
    
    i number :=1;
    
    begin
    
    loop
    
    dbms_output.put_line('hello world');
    
    i:=i+1;
    
    if i>50 then 
    
    exit;
    
    end if ;
    
    end loop;
    
    end; 
    
    /
    رائع جميل ... انظر الى الناتج :

    كود:
    hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world

صفحة 10 من 12 الأولىالأولى ... 56789101112 الأخيرةالأخيرة

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •