khaledmega بتاريخ: 5 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 5 أكتوبر 2009 (معدل) الفتـفوتـة الرابعــة خالد :- اولا السلام عليكم ؛ كنا اخر فتفوتة وقفنا فيها عند عملية الدمج ؛ النهاردة – اليوم – هناخد ان شاء الله فتفوتة جديدة وهي NVL – NVL2وهي تعني " القيم الخالية " ؛ والقيم الخالية معناها ان الحقل فارغ من اى قيمة ولازم تفرق بين ان الحقل لا يحتوى على قيمة وان الحقل به قيمة تساوى صفر طالب :- يعنى ايه ؟خالد :- الحقل الخالي هو فارغ من اى قيمة وكأنه فيه هواء او لا شيء او مجهول ؛ اما الصفر فهو قيمة لها معنى فى الداتا بيز ؛ يستطيع الاوراكل التعامل معها ؛ تعالي ناخد مثال على الحالتين علشان تفهم اكتر طالب :- يا ريتخالد :- احنا قلنا ان القيمة الخالية كأننا بنقول " لا شيء او مجهول " طب لو انا قلتلك لاشئ * 5 = ايه ؟ طالب:- لاشيئخالد :- طيب مجهول + 10 = ايه ؟طالب :- اكيد مجهول خالد :- لكن لو قلتلك مثلا0 * 5 = ايه ؟طالب :- صفرخالد :- طيب 0 + 10 = ايه ؟طالب :- 10 خالد :- تقريبا كده وضح الفرق بين التعامل مع القيم الخالية والصفر ؛ طيب مخاطر التعامل مع القيم الخالية ايه ؟طالب :- هي ليها مخاطر ؟خالد :- طبعا ؛ اولا تعالي نفهم الية تعامل الاوراكل مع القيم الخالية ؛ الاوراكل لما NULL بيلاقى القيم الخالية بيحط – بيضع – بشكل تلقائي كلمة وكانه وضع كلمة مجهول ؛ بمعني لو انك حبيت تعمل عملية جمع لاختبار التعامل مع القيم الخالية ؛ تعالي نشوفها بشكل عملي SELECT 5 + + 10 FROM DUAL ; 5++10 ---------- 15 الاوراكل هنا قام بعملية الجمع رغم وجود فراغ والسبب ان الفراغ لم يأتي من حقل فلو لاحظت ستجد انى كتبت 5 + + 10 الفراغ هنا ليس بحقل لان الخمسة و العشرة هي ايضا لم تأتي من حقول انما موضوعة باليد طالب :- عايز تقول ايه ؟خالد :- عايز اقول انا الاوراكل لو بيجيب – يسترجع – بيانات من جدول هيكون NULLالامر مختلف !!! لانه هيحول القيمة الفارغة الى كلمة تعالي نشوف SELECT 5 + NULL + 10 FROM DUAL ; 5+NULL+10 ---------- هي دي الية الاوراكل فى التعامل مع البيانات المرتجعة ؛ انه بيحول القيم الفارغة الي NULL ؛ فمثلا جدول EMP هناك حقل المرتب وحقل العمولة تعالي نشوف هيتعامل معاهم ازاى SQL> SELECT ENAME , SAL , COMM , SAL + COMM FROM EMP ; ENAME SAL COMM SAL+COMM ---------- ---------- ---------- ---------- SMITH 800 ALLEN 1600 300 1900 WARD 1250 500 1750 JONES 2975 MARTIN 1250 1400 2650 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 TURNER 1500 0 1500 ADAMS 1100 ENAME SAL COMM SAL+COMM ---------- ---------- ---------- ---------- JAMES 950 FORD 3000 MILLER 1300 14 rows selected. اللي حصل ان الاوراكل بدء يعرض الحقول المطلوب عرضها زى الاسم والمرتب والعمولة وكمان جمع المرتب + العمولة ؛ لكن لما بدء يجمع هنلاقى ان النتيجة لبعض الموظفين المسجلين خالية كالتالي :- ENAME SAL COMM SAL+COMM ---------- ---------- ---------- ---------- SMITH 800 ALLEN 1600 300 1900 WARD 1250 500 1750 JONES 2975 عندك مثلا سميث وجونز موظفين ولهم رواتب لكن ليس لهم عمولة فهم ليسوا مدرجين ضن الناس التى تأخذ عمولة فكان نتيجة جمع المرتب والعمولة كانت خالية ؛ اذا اخر الشهر ليس هناك رواتب لهم ؛ ودى كارثة فى حسابات الشركة ؛ اللي حصل ان البيانات او القيم المرتجعة من حقل العمولة كانت فارغة من اى قيم وبالتالي عند عملية الجمع بدء يجمع المرتب + قيم خالية " مجهول " كانت النتيجة = مجهول او بلغة الاوراكل NULL !!قد يتصور البعض ان الامر بسيط ؛ لكن فى حقيقة الامر انه ليس ببسيط على الطلاق ؛ فقد ينتج خطئ فى المستندات الحسابية للشركة اذا ما اغفلنا هذا الامر .طالب :- طب ايه قواعد التعامل مع القيم الخالية ؟خالد :- جميل ؛ اولا:- تستخدم NVL فقط لتحويل القيم الفارغة الي قيم فعلية يستطيع الاوراكل التعامل معها .ثانيا :- لا يوجد مشكلة فى تعامل NVL سيان مع الحروف او الارقام او التاريخ .ثالثا :- هناك نوعان وهم NVL / NVL2 ولكلا منهم هدف وطريقة مختلفة فى الاداء .طالب :- واحدة واحدة بعد اذنك .خالد :- تعالي نشوف اول حاجة ؛ امتى بحتاج لل NVL ؟بحتاج لها فى حالتين الاولى مع العمليات الحسابية وده علشان اظبط ميزانية اى عملية حسابية ؛ ولو انت متوقع انه يحصل تسجيل بيانات فارغة من المستخدم يجب انك تجهز البرنامج بتاعك لمثل هذه الاخطاء ؛ فالديفولبر ليس مصمم ومبرمج فقط ؛ انما يجب ان يتوفر فيه تحقيق رغبات العميل وتوقع الاخطاء وتفاديها والا لن تلاقي النجاح ابدا .طالب :- اسف ؛ يعني ايه " قيم فعلية يستطيع الاوراكل التعامل معها " ؟ .خالد :- اى حرف او رقم فهو قيمة فعلية ؛ ايا كان لغة الحرف وايا كان قيمة الرقم حتى لو صفر فهو فى النهاية قيمة يمكن للاوراكل التعامل معها .تعالي نكتب الكود بأيدينا ؛ لو عندك حقل سيان انت متأكد ان فيه قيم خالية او متوقع ان يوضع به قيم خالية ؛ وانت عايز تخلي الاوراكل يحسب صح لازم تضع قبل الحقل الذى يحتوي على قيم خالية NVL NVL(COLUMN_NAME) SELECT COMM , NVL(COMM , 0) FROM EMP ; NVL(COMM , 0) , COMM ---------- ---------- 0 300 300 500 500 0 1400 1400 0 0 0 0 0 0 0 NVL(COMM , 0) , COMM ---------- ----------- 0 0 0 14 rows selected. الاوراكل لما بيشوف انك كاتب NVL قبل اى حقل هو تلقائيا بيشيل – بيبدل – القيم الخالية المجهولة ويضع القيمة اللى انت كاتبها ايا كانت ؛ لكن ده مش معناه انه بيحفظ القيمة الجديدة فى الداتا بيز ولكن هي للعرض فقط .طالب :- طيب وال NVL2 ؟خالد :- دي بتشتغل على معاملين ؛ بمعني ان NVL بتشتغل فقط على القيم الخالية انما NVL2 بتشتغل على القيم الخالية وعلى القيم الفعلية ؛ تعالي نشوف SELECT COMM , NVL2(COMM , 10 , 5) FROM EMP ; NVL2(COMM , 0) , COMM ---------- ---------- 5 300 10 500 01 5 1400 10 5 5 5 5 0 10 5 NVL2(COMM ,10 , 5) , COMM ---------- ----------- 0 0 0 14 rows selected. الاوراكل لما بيشوف NVL2 قبل اى حقل كانك بتقوله ادخل على الحقل اذا لاقيت فيه قيمة حولها لكذا واذا لم تجد قيمة – خالي يعني – حولها لكذا تمام ؟الطالب :- الى حدا ما !!خالد :- تعالي نشوف فتفوتة جديدة اسمها Distinct :- الديستنكت ببساطة هي تستخدم لعدم تكرار القيم ؛ لو انا عندي كشف بأسماء سكان مصر ومحافظتهم مثلا ؛ هذا يعني ان كل اسم مواطن بجواره المحافظة التى ينتمي اليها ؛ واذا كان عدد سكان مصر 80 مليون مواطن فهذا يعني ان الكشف به 80 مليون اسم وكذلك 80 مليون محافظة بجوار كل اسم ؛ لكن هل فعلا مصر تحتوى على 80 مليون محافظة ؟ طالب :- لا طبعا !!خالد :- اذا انا عندي 80 مليون اسم لاشخاص مختلفين بالفعل ولكن عندي تكرار لا حصر له للمحافظات ؛ هنا بيظهر فايدة الديستنكت ؛ فلو انت عايز تعرف العدد الاصلي للمحافظات بدون تكرار هنا بنستخدم ديستنكت ؛ نفس الامر هتلاقيه فى جدول EMP عندك اسماء موظفين مختلفين فعليا ؛ وكل موظف ينتمي لأدارة ولكن هناك تكرار للادارات كالتالي :- SELECT ENAME , DEPTNO FROM EMP ; ENAME DEPTNO ---------- ---------- SMITH 20 ALLEN 30 WARD 30 JONES 20 MARTIN 30 BLAKE 30 CLARK 10 SCOTT 20 KING 10 TURNER 30 ADAMS 20 ENAME DEPTNO ---------- ---------- JAMES 30 FORD 20 MILLER 10 لالغاء هذا التكرار بنستخدم Distinct ؛ ولكن بشكل منفرد على الحقل الذى تريد ان تلغي فيه التكرار كالتالي :- SELECT DISTINCT DEPTNO FROM EMP ; DEPTNO ------ 30 20 10 تمام !!طالب :- تماااااام !! [center]م / خالد الشاذلي مبرمج اوراكل بوزارة الانتاج الحربي IT Manager 1Solution Group 0122512071 [email protected] [email protected][/center] تم تعديل 5 أكتوبر 2009 بواسطة khaledmega 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdbzour بتاريخ: 3 أغسطس 2013 تقديم بلاغ مشاركة بتاريخ: 3 أغسطس 2013 مشكور جدً أخي بارك الله فيك موضوعك رائع جداً في المحتوى وطريقة العرض حيث أن المعلومة رسغت في ذهني بشكل ممتاز بارك الله فيك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.