صفحة 9 من 12 الأولىالأولى ... 456789101112 الأخيرةالأخيرة
النتائج 121 إلى 135 من 169

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

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

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

    الان انظر الى الجدول
    emp_30 وانظر الى المنظر view_30 ,

    كود:
    SQL> select * from emp_30;
    
    
    
    ENAME SAL
    
    ---------- ----------
    
    XYZ 1600
    
    WARD 1250
    
    MARTIN 1250
    
    XYZ 2850
    
    XYZ 1500
    
    XYZ 9999
    
    
    
    6 rows selected.
    
    
    
    SQL> select * from view_30;
    
    
    
    ENAME SAL
    
    ---------- ----------
    
    XYZ 1600
    
    WARD 1250
    
    MARTIN 1250
    
    XYZ 2850
    
    XYZ 1500
    
    XYZ 9999
    كما رأينا سابقا ... انه يستمد بياناته من جدول
    emp_30 ,,

    لو حذفنا
    emp_30 ؟؟ لنرى ماذا يحصل في المنظر view_30

    كود:
    SQL> drop table emp_30;
    
    
    
    Table dropped.
    
    
    
    SQL> select * from view_30;
    
    
    
     
    
    ERROR at line 1:
    
    ORA-04063: view "SCOTT.VIEW_30" has errors
    بعد حذف الجدول الاساس للمنظر
    view_30 ... وبعد اصدار امر عرض هذا المنظر ... يقول ان المنظر فيه خطأ !! .. لا يهتم الأوراكل ما هذا الخطأ انما ... يقول انه خطأ وفقط ..... وهذا المهم بالنسبة له ..... , اما بالنسبة لنا .. فإننا نعرف ان الخطأ يكمن ان احد جداول الاساس للمنظر ... محذوف وغير موجود اصلا ..... صح ؟

    طيب الان دعنا نعمل منظر
    view_29 والذي يستمد بياناته من الجدول المرحوم emp_30 ... هل نستطيع ؟ لنجرب ذلك :


    كود:
    SQL> create view view_29 as
    
    select * from emp_30 ;
    
    
    
    ERROR at line 2:
    
    ORA-00942: table or view does not exist
    هنا يتدخل الأوراكل بكل حزم وقوة .... ويقول انه خطأ ... وان الجدول (او المنظر !!) اصلا غير موجود ...

    الان دعك من هذا الخطأ وركز في (المنظر) ....

    هل تصدق ان المنظر بإمكانه ان يستمد بياناته من منظر اخر ؟؟ مسألة معقدة في التركيب سهلة الفهم .. سوف نتطرق إليها بعد ...
    10 دقائق من الان ان شاء الله ....

    الان اريد ان اعمل المنظر
    view_29 ..... ولا اريد الأوراكل ان يتدخل ....

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


    كود:
    SQL> create force view view_29 as
    
    2 select * from emp_30;
    
    
    
    Warning: View created with compilation errors.
    أضفت كلمة جديدة ...
    force ... ما معنى هذه الكلمة ؟

    معناها بالقوة .. بالغصب .... انا أغصبك يا أوراكل ان تعمل المنظر ولا تتدخل في شؤوني العائلية !!

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

    "تحذير يا سيدي .... المنظر عملته ولكن به بعض أخطاء
    "

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

    الان هل عرفت كيف تجبره ؟ جميل ..... لاحظ أين تضع كلمة
    force ...

    الان ... دعنا نغير اسماء الاعمدة للمنظر !!

    مجرد تغيير للأسماء , وفائدته تكمن في العرض ليس الا .... ولكن الاعمدة اصلا تستمد بياناتها من الجدول الأساس ولا يوجد أي تغيير في البيانات نفسها
    .

    كود:
    create view view_10 as
    
    select ename as "Name" , sal as "Salary" 
    
    from emp where deptno=10;
    في الحقيقة اكتشفت شيء بالصدفة , لم اجربه من قبل ...

    الان انظر الى اسماء الاعمدة :
    كود:
    SQL> select * from view_10;
    
    
    
    Name Salary
    
    ---------- ----------
    
    CLARK 2450
    
    KING 5000
    
    MILLER 1300
    هل شاهدت اسماء الاعمدة كيف تغيرت ؟؟ مع العلم ان البيانات لم تتغير ولا نوعها !! مجرد اسم العمود .....

    هيا ... انظر لو كتبنا مايلي :
    كود:
    SQL> select salary from view_10;
    
    
    
     
    
    ERROR at line 1:
    
    ORA-00904: "SALARY": invalid identifier
    يقول انه لا يوجد عمود بهذ الاسم !! يا عالم اقسم انني اسميته هكذا !!

    حققنا في الامر , ووجدنا العمود المتهم لا يحمل اسم
    salary ,,,,,

    انما يحمل اسم
    Salary وكتبنا ما يلي :

    كود:
    select "Salary" from view_10;
    هل لاحظت الوضع ؟

    يفضل اذا عملت الاعمدة ... اعملها هكذا ... ولاحظ الفرق :
    كود:
    create view view_100 as 
    
    select ename emp_name , sal salary
    
    from emp where deptno=10;
    هل لاحظت التسميات ؟ اخذناها سابقا ... ول اردنا عمل اسماء كما هي ... ضعها بين علامتي تنصيص ثنائية
    "Salary"

    ولا انصح بذلك طبعا ....

    الان لنغير المنظر
    view_10 ونستبدل اسماء لاعمدته ... هيا بنا :


    كود:
    SQL> create view view_10 as
    
    select ename emp_name , sal salary 
    
    from emp where deptno=10 ;
    
    
    
    ERROR at line 1:
    
    ORA-00955: name is already used by an existing object
    نسيت !!

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

    هيا لنستبدله بأمر
    replace ,,,, أي اذا لم يجد الأوراكل المنظر .. اعمله ..

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

    كود:
    SQL> create or replace view view_10 as
    
    select ename emp_name , sal salary 
    
    from emp where deptno=10 ;
    
    
    
    View created.
    وهكذا عملناه ....

    ياسلام ... على امر الاستبدال ..
    or replace

    الان اريد ان اعمل المنظر
    view_29 .... هل تذكره ؟؟ ذلك المنظر الذي يحتوي على جدول غير موجود !! ارجع عدة سطور ... وستشاهده ... واننا غصبنا الأوراكل !!

    هيا لنستبدله .... بجدول اخر لا يوجد في الاصل ...

    كود:
    SQL> create or replace view view_29 
    
    as select * from emp_10000 ;
    
    
    
    ERROR at line 2:
    
    ORA-00942: table or view does not exist
    عملية الاستبدال قبلها , ولكن لم يقبل ان يكون هناك جدول غير موجود !!

    هيا لنجبره على ذلك .. ولحظ تركيب الجملة كاملة ... ولاحظ لماذا انا
    أعيدالأمثلة !! طبعا لكي اعملها هذه المرة مجتمعة .. انظر الى الاستبدال أين يأتي , واين يأتي الاجبار force ... تعلم يا رجل !

    كود:
    SQL> create or replace force view view_29
    
    2 as select * from emp_10000;
    
    
    
    Warning: View created with compilation errors.

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

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

    أضفت كلمة جديدة ...
    force ... ما معنى هذه الكلمة ؟

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

    "تحذير يا سيدي .... المنظر عملته ولكن به بعض أخطاء
    "

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

    الان هل عرفت كيف تجبره ؟ جميل ..... لاحظ أين تضع كلمة
    force ...

    الان ... دعنا نغير اسماء الاعمدة للمنظر !!
    مجرد تغيير للأسماء , وفائدته تكمن في العرض ليس الا .... ولكن الاعمدة اصلا تستمد بياناتها من الجدول الأساس ولا يوجد أي تغيير في البيانات نفسها
    .

    كود:
    
    
    كود:
    create view view_10 as
    select ename as "Name" , sal as "Salary"
    from emp where deptno=10;

    في الحقيقة اكتشفت شيء بالصدفة , لم اجربه من قبل ...
    الان انظر الى اسماء الاعمدة :
    كود:
    
    
    كود:
    SQL> select * from view_10;
    Name Salary
    ---------- ----------
    CLARK 2450
    KING 5000
    MILLER 1300

    هل شاهدت اسماء الاعمدة كيف تغيرت ؟؟ مع العلم ان البيانات لم تتغير ولا نوعها !! مجرد اسم العمود .....
    هيا ... انظر لو كتبنا مايلي :
    كود:
    
    
    كود:
    SQL> select salary from view_10;
    ERROR at line 1:
    ORA-00904: "SALARY": invalid identifier

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

    انما يحمل اسم
    Salary وكتبنا ما يلي :

    كود:
    
    
    كود:
    select "Salary" from view_10;

    هل لاحظت الوضع ؟
    يفضل اذا عملت الاعمدة ... اعملها هكذا ... ولاحظ الفرق :
    كود:
    
    
    كود:
    create view view_100 as
    select ename emp_name , sal salary
    from emp where deptno=10;

    هل لاحظت التسميات ؟ اخذناها سابقا ... ول اردنا عمل اسماء كما هي ... ضعها بين علامتي تنصيص ثنائية
    "Salary"

    ولا انصح بذلك طبعا ....
    الان لنغير المنظر
    view_10 ونستبدل اسماء لاعمدته ... هيا بنا :


    كود:
    
    
    كود:
    SQL> create view view_10 as
    select ename emp_name , sal salary
    from emp where deptno=10 ;
    ERROR at line 1:
    ORA-00955: name is already used by an existing object

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

    اذا وجده نفسه .. استبدله بالجديد :
    كود:
    
    
    كود:
    SQL> create or replace view view_10 as
    select ename emp_name , sal salary
    from emp where deptno=10 ;
    View created.

    وهكذا عملناه ....
    ياسلام ... على امر الاستبدال ..
    or replace

    الان اريد ان اعمل المنظر
    view_29 .... هل تذكره ؟؟ ذلك المنظر الذي يحتوي على جدول غير موجود !! ارجع عدة سطور ... وستشاهده ... واننا غصبنا الأوراكل !!

    هيا لنستبدله .... بجدول اخر لا يوجد في الاصل ...
    كود:
    
    
    كود:
    SQL> create or replace view view_29
    as select * from emp_10000 ;
    ERROR at line 2:
    ORA-00942: table or view does not exist

    عملية الاستبدال قبلها , ولكن لم يقبل ان يكون هناك جدول غير موجود !!
    هيا لنجبره على ذلك .. ولحظ تركيب الجملة كاملة ... ولاحظ لماذا انا
    أعيدالأمثلة !! طبعا لكي اعملها هذه المرة مجتمعة .. انظر الى الاستبدال أين يأتي , واين يأتي الاجبار force ... تعلم يا رجل !

    كود:
    
    
    كود:
    SQL> create or replace force view view_29
    2 as select * from emp_10000;
    Warning: View created with compilation errors.

    الان هل ما زلت تذكر المنظر
    temp ؟

    هيا لننظر ما بداخله :
    كود:
    
    
    كود:
    SQL> select * from temp;
    ENAME SAL DEPTNO
    ---------- ---------- ----------
    ALLEN 1600 30
    WARD 1250 30
    JONES 2975 20
    MARTIN 1250 30
    BLAKE 2850 30
    CLARK 2450 10
    SCOTT 3000 20
    KING 5000 10
    TURNER 1500 30
    FORD 3000 20
    MILLER 1300 10

    الان انا استخدم معلومات كل من رقم قسمه يساوي 30 ... أي بمعنى اخر ... اريد ان اعمل منظر اخر ..
    به نفس معلومات المنظر
    temp ولكن لكل من رقم قسمه يساوي 30

    ما رأيك ان نعمل منظر اساسه منظر اخر وليس جدول !!
    طبعا لديك الخيار .. من جدول او من منظر :
    كود:
    
    
    كود:
    create view temp2 as
    select ename , sal from temp
    where deptno=30 ;

    بسيطة هاه ... اخترنا عمودين من المنظر
    temp واخترنا بعض الصفوف .... أي بعض المعلومات ...

    قلنا سابقا ان المنظر
    temp .... هو ناتج استعلام التالي :

    كود:
    
    
    كود:
    select ename , sal , deptno
    from emp
    where sal > 1100 ;

    صحيح ؟ طيب ... استعلام المنظر
    temp2 ماهو ؟؟ أي الاستعلام الذي بداخله ... أي هو ناتج من الاستعلام التالي

    انظر اليه :
    كود:
    
    
    كود:
    select ename , sal from temp
    where deptno=30 ;

    صحيح ؟
    ماذا سوف يفعل الأوراكل اذا شاهد جملة الاستفسار هذه ؟ ؟ ؟
    كود:
    
    
    كود:
    SQL> select * from temp2 where sal >1250;
    ENAME SAL
    ---------- ----------
    ALLEN 1600
    BLAKE 2850
    TURNER 1500

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

    كود:
    
    
    كود:
    select * from temp2 where sal >1250;

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

    يجد فيه استعلام ... مكتوب هكذا :
    كود:
    
    
    كود:
    select ename , sal from temp
    where deptno=30 ;

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

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

    - يجد به استفسار ... وهو :
    كود:
    
    
    كود:
    select ename , sal , deptno
    from emp
    where sal > 1100 ;



    - يقول في نفسه : " سوف انفذ هذا الاستفسار ..."
    -هل الجدول
    emp موجود ؟؟ طبعا موجود .... ينفذه ويخزن الناتج ...

    وكان الناتج هو مايلي :
    كود:
    
    
    كود:
    ENAME SAL DEPTNO
    ---------- ---------- ----------
    ALLEN 1600 30
    WARD 1250 30
    JONES 2975 20
    MARTIN 1250 30
    BLAKE 2850 30
    CLARK 2450 10
    SCOTT 3000 20
    KING 5000 10
    TURNER 1500 30
    FORD 3000 20
    MILLER 1300 10


    التعديل الأخير تم بواسطة The Coder ; 20-02-2006 الساعة 08:54 PM

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

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

    - يأتي ويرجع بالنتيجة الى النقطة ب ....
    -
    يرى الاستفسار الخاص بـالمنظر temp2 .... هل يتذكره ؟؟ نعم ... انه هذا الاستفسار :

    كود:
    select ename , sal from temp
    
    where deptno=30 ;


    -
    ياسلام ... هو لديه الناتج الخاص بالمنظر temp2 مخزن !! صح ؟

    الان من هم الذين في قسم 30 في الناتج التالي ؟؟:

    كود:
    ENAME SAL DEPTNO
    
    ---------- ---------- ----------
    
    ALLEN 1600 30
    
    WARD 1250 30
    
    JONES 2975 20
    
    MARTIN 1250 30
    
    BLAKE 2850 30
    
    CLARK 2450 10
    
    SCOTT 3000 20
    
    KING 5000 10
    
    TURNER 1500 30
    
    FORD 3000 20
    
    MILLER 1300 10


    -
    سوف ينتقي كل من هو في القسم 30 في النتيجة السابقة للتو ..

    انهم مايلي :

    كود:
    ENAME SAL
    
    ---------- ----------
    
    ALLEN 1600
    
    WARD 1250
    
    MARTIN 1250
    
    BLAKE 2850
    
    TURNER 1500


    -
    الان يرجع بالنتيجة للنقطة أ

    - هنالك ... يجد انه طلب من هذه النتيجة السابقة كل مم راتبه اكبر من 1250

    أي في جملة الاستفسار تلك هل تذكرها ؟؟ :
    كود:
    select * from temp2 where sal >1250;
    - سوف ينتقي من الناتج الاخير كل من راتبه فوق 1250

    وسوف يكون الناتج الاخير هكذا :
    كود:
    ENAME SAL
    
    ---------- ----------
    
    ALLEN 1600
    
    BLAKE 2850
    
    TURNER 1500

    ركز وارجع اقرأ الخطوات كيف !!

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

    طبعا سوف يخزن كل نتيجة في متغيرات !! ....

    هل شاهدت كم هي متعبة على أوراكل هذه المناظر ؟ بالرغم من انها سهلة لنا ..

    فما بالك ان نستعلم من منظر .. اساسه منظر اخر ... وهذا المنظر الاخر اساسه منظر ثالث ... والمنظر الثالث اساسه منظر عاشر ....... الخ

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

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



    كود:
    create view v1 (the_name , the_depart , the_sal , the_grade_sal)
    
    as select e.ename , d.dname ,e.sal ,s.grade
    
    from emp e,dept d ,salgrade s 
    
    where e.deptno=d.deptno
    
    and e.sal between s.losal and s.hisal 
    
    and e.sal >=1250 ;
    انظر اليه عن كثب :
    كود:
    SQL> select * from v1 ;
    
    
    
    THE_NAME THE_DEPART THE_SAL THE_GRADE_SAL
    
    ---------- -------------- ---------- -------------
    
    WARD SALES 1250 2
    
    MARTIN SALES 1250 2
    
    MILLER ACCOUNTING 1300 2
    
    TURNER SALES 1500 3
    
    ALLEN SALES 1600 3
    
    CLARK ACCOUNTING 2450 4
    
    BLAKE SALES 2850 4
    
    JONES RESEARCH 2975 4
    
    SCOTT RESEARCH 3000 4
    
    FORD RESEARCH 3000 4
    
    KING ACCOUNTING 5000 5
    ولاحظ انه في إنشاء المناظر لا يوجد شيء اسمه
    order by

    برأيك لماذا ؟؟ لماذا ممنوع استخدام
    order by في جملة إنشاء المناظر ؟؟؟

    فكر فيها ... واجعلها تحدي ... التحدي الاول !!
    ....


    الان .. قلنا انه سوف يفتح ملف المنظر .... عدنا هذه المقولة كثيرا !!

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

    بالتحديد في
    Data dictionary هل تذكرها ؟ التي تحتوي على مجموعة جداول تخص الأوراكل والتي يتعامل معها الأوراكل .... اعتقد انك تذكر هذه المجموعة جداول !!

    ما اسم الجدول الذي يحتوي المناظر الخاصة بنا
    ؟؟


    كود:
    SQL> select * from user_views;
    
    
    
    VIEW_NAME TEXT_LENGTH TEXT 
    
    --------------- ----------- -------------------------------------
    
    VIEW_20 64 select ename employee_name , sal salary
    
    from emp where deptno=10
    
    
    
    VIEW_100 59 select ename emp_name , sal salary
    
    from emp where deptno=10
    
    
    
    VIEW_2 39 select "ENAME","SAL","DEPTNO" from temp
    
    TEMP2 46 select ename , sal from temp
    
    where deptno=30
    
    
    
    V1 150 select e.ename , d.dname ,e.sal ,s.grade
    
    from emp e,dept d ,salgrade s
    
    where e.d
    
    
    
    TEMP 54 select ename , sal , deptno
    
    from emp
    
    where sal > 1100
    
    
    
    VIEW_30 32 select "ENAME","SAL" from emp_30
    
    VIEW_29 23 select * from emp_10000
    
    VIEW_10 60 select ename emp_name , sal salary
    
    from emp where deptno=10
    اسف على العرض السيء ....

    يوجد هنالك بعض العيوب والغباء في برنامج
    sql plus

    انظر في جملة الاستعلام الخاصة بالمنظر
    V1

    كأنها ناقصة كثيرا !!

    لماذا يا ترى ؟؟ لا اعلم !!

    مجرد عيب في البرنامج نفسه !!

    الان اليك التحدي الخياري الثاني
    ..

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

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


    الان سوف نعمل جدول ... يدعى
    emp_100 , وهو جدول اساس لمنظر نعمله ويدعى v2



    كود:
    SQL> create table emp_100 
    
    as select ename , sal , deptno
    
    from emp where sal>1250 ;
    
    
    
    Table created.
    
    
    
    SQL> select * from emp_100;
    
    
    
    ENAME SAL DEPTNO
    
    ---------- ---------- ----------
    
    ALLEN 1600 30
    
    JONES 2975 20
    
    BLAKE 2850 30
    
    CLARK 2450 10
    
    SCOTT 3000 20
    
    KING 5000 10
    
    TURNER 1500 30
    
    FORD 3000 20
    
    MILLER 1300 10
    
    
    
    9 rows selected.
    
    
    
    SQL> create view v100 as 
    
    select * from emp_100
    
    where deptno=20;
    
    
    
    View created.
    
    
    
    SQL> select * from v100;
    
    
    
    ENAME SAL DEPTNO
    
    ---------- ---------- ----------
    
    JONES 2975 20
    
    SCOTT 3000 20
    
    FORD 3000 20
    الان المنظر
    v2 ناتج من الاستعلام التالي :


    كود:
    select * from emp_100
    
    where deptno=20;
    صح ؟

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

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

    طيب ... لو عملنا ترتيب
    order by ... مالذي يحدث ؟ انظر !!

    كود:
    SQL> select rownum , ename , sal from emp
    
    2 order by sal ;
    
    
    
    ROWNUM ENAME SAL
    
    ---------- ---------- ----------
    
    1 SMITH 800
    
    12 JAMES 950
    
    11 ADAMS 1100
    
    3 WARD 1250
    
    5 MARTIN 1250
    
    14 MILLER 1300
    
    10 TURNER 1500
    
    2 ALLEN 1600
    
    7 CLARK 2450
    
    6 BLAKE 2850
    
    4 JONES 2975
    
    8 SCOTT 3000
    
    13 FORD 3000
    
    9 KING 5000
    مشكلة هاه .. اريد ان يكون ترتيب على حسب الراتب !! كيف ؟ انظر الى حل ممتاز :

    كود:
    SQL> select rownum , ename , sal
    
    2 from (select ename , sal from emp order by sal) ;
    
    
    
    ROWNUM ENAME SAL
    
    ---------- ---------- ----------
    
    1 SMITH 800
    
    2 JAMES 950
    
    3 ADAMS 1100
    
    4 WARD 1250
    
    5 MARTIN 1250
    
    6 MILLER 1300
    
    7 TURNER 1500
    
    8 ALLEN 1600
    
    9 CLARK 2450
    
    10 BLAKE 2850
    
    11 JONES 2975
    
    12 SCOTT 3000
    
    13 FORD 3000
    
    14 KING 5000
    لا تعلم مالفكرة ؟ فكر فيها ...

    في الحالة الاولى اوجد الأوراكل الناتج
    ... وحسب قيم دالة الـ rownum

    ثم رتب الناتج .. وتلخبطت بيانات العمود
    rownum

    في الحالة الثانية ... اعطينا الدالة ... جدول مرتب ومنظم يعني جاهز ... (الاستفسار الفرعي ويعامل كجدول !!)

    وهو في النهاية حسب قيم الدالة ..

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

    اعرف ان الاجابة في رأسك ....

    وعليك ايجادها .







    3- السلسلة
    sequences

    السلسلة عبارة عن اوبجيكت ... محفوظ لغرض ما ..

    غرضه غريب قليلا , وهو لتوليد ارقام للمفتاح الأساسي ...

    ما معنى توليد ؟؟ إنشاء اوتوماتيكي ... اختراع ارقام جديدة بطريقة منتظمة .......

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

    تخيل انك لا تعرف اخر قسم ماهو ... كم رقمه ... مثلا رقم اخر قسم اضفناه هو 150 .. الذي بعده ماهو ؟ على حسب .. يمكن احدهم يرغب بزيادة واحد .. واخر يرغب بزيادة عشرة ...

    دعنا نعمل نسخى احتياطية لجدول القسم كي نتلاعب فيه كما نرغب .. :
    كود:
    create table dept1 as 
    
    select * from dept ;
    الان جدولنا الجديد هو
    dept1 ....

    نلاحظ ان المفتاح الأساسي في هذا الجدول يتزايد بشكل منتظم صح ؟؟ انظر ... انه يزيد في كل مرة ب 10 :
    كود:
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- ------------
    
    10 ACCOUNTING NEW YORK
    
    20 RESEARCH DALLAS
    
    30 SALES CHICAGO
    
    40 OPERATIONS BOSTON
    10 ثم 20 ثم 30 ثم 40 ........ مارأيك في العدد القادم ؟؟ اكيد 50 .... انه يتزايد بطريقة منتظمة ...

    ما معنى منتظمة ؟ أي بشكل لا يتغير ... هنا زيادة عشرة في كل مرة ..

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

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

    هيا لنعمل مولد ارقام منتظم ..... اليك امر عمل السلاسل ..:
    كود:
    SQL> create sequence dept1_deptno_seq
    
    2 increment by 10
    
    3 start with 50
    
    4 maxvalue 150
    
    5 nocache
    
    6 nocycle;
    واو ... يظهر انه طويل قليلا ..

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

    انا اريد هذه المواصفات ما يلي ... ان يبدأ المولد بـ50 , ويصل الى 150 اخر حد له ... لانني اعرف ان الأقسام مهما كثرت لن تزيد عن 15 قسم ..... اريد ان يزيد العدد ب 10 ارقام .. أي ان الاول 50 .. الثاني يصبح 60 ... وهكذا ...




    اول سطر .. يقول اعمل لي .... سلسلة تدعى بـ
    dept1_deptno_seq..... مجرد اسم .. انا اخترته بنفسي

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

    الان ... السطر الثاني يقول ... زد على القيمة الحالية 10 في كل مرة .... مثلا كنا 50 .... في المرة القادمة تصير 60 ...

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

    السطر الثالث .... يقول نبدأ بكم ؟؟ بـ50 كما اتفقنا ...

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

    السطر الخامس لست افهم ما معناها , لم توضح لي الرؤية فيها .. اسف !!

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

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

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

    الان دعنا نستخدم هذه السلسلة ... تستخدم في اماكن عدة ... هيا لنرى في امر إضافة صف :

    كود:
    insert into dept1 values
    
    (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    هل رأيت اسم السلسلة ؟ يوجد شيء وكأنه دالة ...
    nextval ... وهي اختصار لـ next value معناها القيمة التالية ...

    السلسلة سوف تبدأ بـ 50 ...... سوف تضع خمسين ....

    أي بمعنى اخر .... اضفنا صف ... واضفنا قيم ... اسم القسم
    MARKETING , وموقعه SAN DIEGO

    ورقم القسم كم ؟؟ انه 50 .... لاننا اول مرة نستخدم السلسلة ... انظر الناتج للتأكد ...
    كود:
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -----------
    
    10 ACCOUNTING NEW YORK
    
    20 RESEARCH DALLAS
    
    30 SALES CHICAGO
    
    40 OPERATIONS BOSTON
    
    50 MARKETING SAN DIEGO
    الان نريد ان ندخل المزيد ... فلنرى هل يتغير الـ 50 ؟؟؟

    انظر ... سوف اضيف مرات عديدة لنفس الجملة :
    كود:
    SQL> insert into dept1 values
    
    2 (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    
    (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO')
    
    *
    
    ERROR at line 2:
    
    ORA-01438: value larger than specified precision allows for this column
    اضفتها اربع مرات .. والخامسة رفض ؟؟


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

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

    لنرى لماذا .. :
    كود:
    SQL> select * from dept1 ;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -----------
    
    10 ACCOUNTING NEW YORK
    
    20 RESEARCH DALLAS
    
    30 SALES CHICAGO
    
    40 OPERATIONS BOSTON
    
    50 MARKETING SAN DIEGO
    
    60 MARKETING SAN DIEGO
    
    70 MARKETING SAN DIEGO
    
    80 MARKETING SAN DIEGO
    
    90 MARKETING SAN DIEGO
    اها ... يظهر ان السلسلة وصلت الرقم 100 , وهو مرفوض في العمود
    deptno لان حده خانتين فقط ...

    انظر الى القيمة الحالية التي تقف السلسلة عليها ... باستخدام دالة اخرى تدعى بـ
    currval اختصارا لـ current value أي القيمة الحالية ..

    كود:
    SQL> select dept1_deptno_seq.currval from dual;
    
    
    
    CURRVAL
    
    ----------
    
    100
    انظر لهذه .. وصل للمئة ... هيا لنحذف السلسلة ....
    كود:
    SQL> drop sequence dept1_deptno_seq ;
    
    
    
    Sequence dropped.
    لقد حذفناها ... ولكن هل ستحذف معها القيم التي وضعتها ؟؟ انظر :
    كود:
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -----------
    
    10 ACCOUNTING NEW YORK
    
    20 RESEARCH DALLAS
    
    30 SALES CHICAGO
    
    40 OPERATIONS BOSTON
    
    50 MARKETING SAN DIEGO
    
    60 MARKETING SAN DIEGO
    
    70 MARKETING SAN DIEGO
    
    80 MARKETING SAN DIEGO
    
    90 MARKETING SAN DIEGO
    لم تحذف ... لسبب بسيط وانت تعرفه ..

    هي دالة تعطينا قيم وتمشي ... يعني اننا حينما قلنا سابقا :
    كود:
    insert into dept1 values
    
    (dept1_deptno_seq.nextval ,'MARKETING','SAN DIEGO');
    وكانت مثلا القيمة الحالية 80 .... فهي تضع 80 في الصف , وتخزن 90 بداخلها كقيمة حالية ..
    .. واذا استخدمناها ثانية .. تضع قيمة 90 وتخزن بداخلها 90+10=100 .... وهكذا

    السلسلة ليست الا ملف ... اوبجيكت .... يعني شيء مخزن ... وعملها اعطائنا ارقام منتظمة ... ليس الا ,,,

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


    الان مثال اخر لكي نفهم بعض خصائص هذه السلاسل ...

    دعنا نحذف سلسلتنا لهذا الصباح ...
    كود:
    drop sequence dept1_deptno_seq ;

    كود:
    delete dept1;
    لنعمل سلسلتين ....واحدة لرقم القسم والاخرى لاسم القسم ... مثلا اريد اسماء اقسام وليكن ارقام ... مثلا يعني ...

    والان لننظر كيف يصبح الوضع ...

    كود:
    SQL> create sequence dept1_depno_seq 
    
    2 increment by 1
    
    3 start with 5
    
    4 maxvalue 40
    
    5 nocache
    
    6 nocycle;
    
    
    
    Sequence created.
    
    
    
    SQL> create sequence dept1_dname_seq
    
    2 increment by 2
    
    3 start with 6
    
    4 minvalue 0
    
    5 maxvalue 12
    
    6 nocache
    
    7 cycle;
    
    
    
    Sequence created.

    كود:
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> insert into dept1 values
    
    2 ( dept1_depno_seq.nextval , dept1_dname_seq.nextval ,'any');
    
    
    
    1 row created.
    
    
    
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -------------
    
    5 6 any
    
    6 8 any
    
    7 10 any
    
    8 12 any
    
    9 0 any
    
    10 2 any
    
    11 4 any
    
    12 6 any
    
    13 8 any
    
    
    
    9 rows selected.
    فكر قليلا ... لماذا النتيجة الاخيرة اصبحت هكذا ... انا اخص اسم القسم ....

    لماذا يا ترى صارت هكذا ؟؟ بدأت بستة , وانتهت الى ال 12 , ومن ثم رجعت صفر !!

    لماذا لم ترجع ستة ؟ لاننا قلنا
    minvalue تساوي صفر ... ولماذا يا ترى حينما وصلنا القيمة الكبرى رجعت من جديد ؟ لاننا قلنا cycle , وهل يجب ان يكون start by اكبر من او يساوي minvalue ؟؟ طبعا يجب .. والا سوف يعطينا الأوراكل خطأ ....


    الان تحدي ..... فسر ما الذي حصل في هذه الأوامر التالية :
    كود:
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -------------
    
    5 6 any
    
    6 8 any
    
    7 10 any
    
    8 12 any
    
    9 0 any
    
    10 2 any
    
    11 4 any
    
    12 6 any
    
    13 8 any
    
    
    
    9 rows selected.
    
    
    
    SQL> update dept1 set dname=dept1_dname_seq.nextval ;
    
    
    
    9 rows updated.
    
    
    
    SQL> select * from dept1;
    
    
    
    DEPTNO DNAME LOC
    
    ---------- -------------- -------------
    
    5 10 any
    
    6 12 any
    
    7 0 any
    
    8 2 any
    
    9 4 any
    
    10 6 any
    
    11 8 any
    
    12 10 any
    
    13 12 any
    
    
    
    9 rows selected.

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

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

    بقي عليك ان تعرف متى نستطيع استخدامها ومتى لا نستطيع ... نستطيع في الاستعلام الرئيسي .. نستطيع في الاستعلام الفرعي الذي يأتي مع جملة
    insert ... نستطيع مع جملة Insert ... نستطيع مع جملة update ...

    لا نستطيع مع جملة الاستعلام التي تأتي مع إنشاء المناظر , لا نستطيع اذا اتت كلمة
    distinct .. والتي تلغي التكرار يا سادة ...... ولا نستطيع مع جملة الاستعلام اذا كان فيها أي من group by , having , order by

    ولا نستطيع مع جملة الاستعلام الفرعية التي تأتي مع جملة
    select او تاتي مع جملة delete او حتى تأتي مع update

    وطبعا لا نستطيع ان نستخدمها مع جملة
    ALTER او CREATE ....

    كتبت هذه السطور إبراء للذمة ...

    ونسيت ان هنالك جدول في الـ
    Data Dictionary يسمى user_sequences

    كود:
    
    
    كود:
    
    
    كود:
    SQL> select * from user_sequences;
    SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- DEPT1_DNAME_SEQ 0 12 2 Y N 0 14 DEPT1_DEPNO_SEQ 1 40 1 N N 0 14



    4- الادلة او الفهارس
    index

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

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

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


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

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

    1- ان يكون الجدول كبير ... وان يكون المتوقع من استخدام جملة
    select ان نحصل على 2-4% من عدد الصفوف الكلي .. أي اذا كان لدينا 10000 صف ... لو كنا نسترجع عادة .. 400 صف .... 350 صف ... او 200 صف او حتى اقل ... فنستخدم الطريقة هذه .. والا فلن تحس بالفرق .

    2-
    ان يكون العمود الذي سنعمل له الفهرسة ..يكون ذو خانات ضخمة ... أي مثلا هو رقم .. يكون هكذا مثلا number(20) .. مجرد مثال , مفيدة الطريقة مع هذا الشرط ..

    3- ان يحتوي هذا العمود على قيم فارغة كثيرة ...

    4- ان يستخدم هذا العمود .. في جملة
    where كثيرا ,, أي نضعه كشرط كثيرا .. لاننا اذا وضعنا أي عمود في جملة الشرط , فإنه سوف يقرأ كل قيمه موجودة به . فإذا عملنا فهرسة ... فلن يقرأه كله .. بل بطريقته الخاصة .. سوف يطبق الشرط بأسرع ما يكون ....

    5- اذا كانا عمودين ... يجب ان تنطبق عليهما الشروط السابقة ... وايضا يزيدان شرط وهو ان نستخدمهما بكثرة في الـربط
    join



    اعرف انك مللت ولم تفهم لماذا هذه الشروط ..

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

    صراحة حتى لو نفعت الطريقة .... فإن عملية الحذف والتعديل .. تصبحان بطيئتان .. لكن لا يهم لاننا نستخدم
    select اكثر بكثير من التعديل والحذف ... لذا فهي طريقة ممتازة .

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


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

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

    الان كيف نعمل هذه الفهرسة ؟ او هذا الدليل ؟

    لنسميها ادلة .. جمع دليل ..

    الادلة ننشأها بطريقتين ...

    طريقة اوتوماتيكية وتسمى هذه الادلة .. بالدليل الفريد او الوحيد
    unique index

    والطريقة اليدوية وتسمة بالدليل الغير وحيد ...
    nonunique index

    الطريقة الاوتوماتيكية ... أوراكل يعملها اوتوماتيكي .. متى ؟ اذا وجد القيد
    unique والقيد primary key ...

    يعني اذا عملنا جدول , ووضعنا مفتاح أساسي او عملنا
    unique !! فسوف تعمل اوتوماتيكي ..

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


    المهم الطريقة اليدوية .. والتي غرضها تسريع عملية استرجاع البيانات بالشروط التي ذكرتها سابقا ...

    هيا لنعمل على جدول الموظفين .. دليل .. وبالتحديد على عمود اسماء الموظفين ....

    كود:
    SQL> create index emp_ename_idx 
    
    2 on emp(ename);
    واضحه هاه .. اعمل دليل اسمه
    emp_ename_idx وضعه أين ؟؟ على emp(ename) أي على عمود ename الذي يقطن في جدول emp ... بس ...

    لست مستعد ان اجرب السرعة ... ولست مستعد ان اضع 10000 صف او اكثر ...

    اذا كنت فاضي .. اعمل سلسلة توليد الارقام , وانسخ .. و ابدأ الصق الصق الصق الصق ....

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





    كود:
    SQL> select ename, sal from emp 
    
    2 where ename like '%S%' or ename like '%A%' ;
    
    
    
    ENAME SAL
    
    ---------- ----------
    
    SMITH 800
    
    ALLEN 1600
    
    WARD 1250
    
    JONES 2975
    
    MARTIN 1250
    
    BLAKE 2850
    
    CLARK 2450
    
    SCOTT 3000
    
    ADAMS 1100
    
    JAMES 950
    هنا جدولين يضمان كل معلومات الادلة الموجودة ...
    User_indexes , user_ind_columns


    كود:
    SQL> select ic.index_name ,ic.column_name , ic.column_position,ix.uniqueness
    
    2 from user_indexes ix , user_ind_columns ic 
    
    3 where ic.index_name =ix.index_name 
    
    4 and ic.table_name ='EMP';
    
    
    
    INDEX_NAME COLUMN_NAME COLUMN_POSITION UNIQUENESS 
    
    -------------------------- ----------------------- -------------------- ---------------
    
    PK_EMP EMPNO 1 UNIQUE
    
    EMP_ENAME_IDX ENAME 1 NONUNIQUE

    لو اردت حذف الدليل ... اليك الامر :

    كود:
    drop index emp_ename_idx ;

    5
    - المرادفات synonym

    اردت ان تقول "اعداد" .. بالانجليزي ...
    Preconditioning واو ... يظهر انها كلمة .. طويلة جدا ... مالعمل ؟؟

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

    ولاحظ ان لكل كلمة من الممكن ان لا يكون لها الا مترادفة واحدة .. او اكثر من مترادفة .... صح ؟؟

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

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

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

    بمعنى اخر .. تستطيع ان تستخدم المرادفات للمناظر , جداول , الادلة , السلاسل ....

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

    الان اذكر ذلك الدليل !! كان اسمه
    EMP_ENAME_IDX

    بغيض جدا الاسم !!

    هيا لنسميه
    a ... ما رأيك نسميه اسم اخر ؟؟ وليكن ss ... مترادفات ... اكثر من مترادفات .. يا سلام ...


    كود:
    SQL> create synonym ss
    
    2 for EMP_ENAME_IDX;
    
    
    
    Synonym created.
    
    
    
    SQL> create synonym a
    
    2 for EMP_ENAME_IDX;
    
    
    
    Synonym created.
    صراحة لا ارى فائدة للمترادفات الا في الجداول , السلاسل , والمناظر ...

    لاننا نستخدمها بكثرة ... في الاستعلامات ... واوامر الـ
    DML


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

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

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



    كود:
    SQL> create synonym s
    
    2 for emp ;
    
    
    
    Synonym created.
    سميناه
    s ... هيا اذهب وانظر الى هذا الجدول :

    كود:
    SQL> select ename , sal , deptno from s where deptno=10;
    
    
    
    ENAME SAL DEPTNO
    
    ---------- ---------- ----------
    
    CLARK 2450 10
    
    KING 5000 10
    
    MILLER 1300 10
    وكأنه
    emp .... هو نفسه انما اسم اخر ..

    طبعا اسم
    emp جميل وصغير ولا يحتاج الى مترادفات ....

    قبل ان ننتقل الى درس الصلاحيات وما شابه ..

    اشير الى اننا من اول الدروس .. نعمل تحت حساب
    scott ...

    أي اننا نعمل في جداول الحساب الخاص ب
    scott .....

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

    يوجد موظف افتراضي اسمه
    scott ..... كنا نستخدم حساب هذا الموظف ,

    له رقم سري خاص .. صحيح ؟؟

    هل تصدق اننا نستطيع عمل حساب اخر ؟ ونسميه ما نشاء ؟

    لو عملنا حساب يسمى بـ
    hamzah .... وله كلمة سر خاصة ...

    ودخلنا بهذا الحساب .. ماذا سيحدث اذا قلنا :

    كود:
    SQL> select * from emp ;
    ؟؟؟ الذي يحدث ان الأوراكل سيخبرنا ان الجدول غير موجود !! هل تصدق !!

    مالعمل لكي نستخدم جدول موظف اخر له حساب اخر ؟؟ اليك حل :

    كود:
    SQL> select * from scott.emp;
    ولكي نستخدم عمود ما في جدول ما تحت حساب احدهم ... نقول ما يلي ...
    كود:
    SQL> select scott.emp.ename from scott.emp ;
    صدقني ... شكلها جميل جدا ... ولكنها طويلة جدا ....

    هيا لنعمل مرادف للجدول
    !!

    كود:
    SQL> create synonym q
    
    for scott.emp ;
    الان .. اذا دخل الموظف
    XYZ ,, واراد ان يستخدم جدول الموظف scott ,,,فسوف يكتب مايلي ...

    كود:
    select q.ename from q ;
    هذا كل شيء ,’,’,’

    نستعرض كل ما عملناه صباح هذا اليوم ....
    كود:
    SQL> select * from user_synonyms ;
    
    
    
    SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
    
    ------------------------------ -------------------- ----------------------- -------
    
    S SCOTT EMP
    
    SS SCOTT EMP_ENAME_IDX
    
    A SCOTT EMP_ENAME_IDX
    
    Q SCOTT EMP
    انتهى ,
    ....
    الان .......
    بقي الصلاحيات .....
    انتظرو ....

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

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

    سلام عليكم >< ..
    سوري عالتأخير .....
    نكمل الدرس للصلاحيات ....



    - مستخدمون و صلاحيات :
    نحن الان نعمل على جهاز واحد , أي سيرفر واحد ... ما معنى سيرفر ؟ هو برنامج خادم ... أي يخدمنا ...

    يخدمنا بماذا ؟؟ يخدمنا بالذهاب الى المصادر ... او الموارد
    resources , مثل ماذا هذه الموارد ؟

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

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

    هذه بعض الامور المزعجة ... لكن يجب ان تعرفها ...

    اصلا السيرفر هو اسم يطلق على أي برنامج يحضر لنا الموارد ... ركز جيدا ...

    أجهزة السيرفر .. هي أجهزة بها برامج السيرفر ... كمبيوترات عملها احضار الموارد ....

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

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

    جهازه هو العميل !!
    Client كلاينت ... الكلاينت هو البرنامج الذي يطلب من السيرفر ..

    عادة يوجد سيرفر واحد , وعدة كلاينتات .... (جمع كلاينت اسف على الكتابة بالعربي ... ولكن حفاظ على الوقت ولكي تحفظ الكلمة ..)

    الان كم المسافة بين الكلاينت والسيرفر ؟؟ لا نعرف ... يمكن متر .. يمكن الف ... يمكن في كوكب اخر ...

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

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

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

    طيب ... لماذا سيرفر .؟ ولماذا كلاينت ؟؟ ولماذا سيرفر وكلاينت اصلا !!

    هي طريقة تنظيمية .. ليس الا ..

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


    الان كيف طريقة العمل ؟

    سوف اشرح طريقة السيرفر المحلي .. و نحن شغالين عليه ..

    نحن حملنا سيرفر الأوراكل !!

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

    أي اننا الان نعمل على سيرفر محلي !! اذ اجهزتنا هي الكلاينت ... وهي نفسها السيرفر ...

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

    يعني لو عملنا شبكة مكونة من جهازين مثلا ... ووصلناهما على جهازك .... فإن الجهازين هذين يعتبران كلاينت ....

    وجهازك السيرفر
    ... وبالتالي فإننا نعتبر هذه البيئة .. بيئة متعددة المستخدمين .. اكرر بيئة متعددة المستخدمين ..لا يوجد صعوبة في فهم الموضوع ....


    طيب ...

    في الشركات .... بيئتهم هي بيئة متعددة المستخدمين ... ما معنى هذا الكلام المبهم ؟

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

    يعني ... كلهم يريدون ان يستعرضون اسماء الموظفين في القسم 10 مثلا !!

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

    هل يخدم هذا او ذاك ... او يرمي زهور النرد ويختار احدهم ليخدمه ؟ او يختار المدراء ؟؟؟؟؟ ماذا يفعل ؟؟

    ليس مسكينا .. بل خارق ....

    انا لا اتكلم عن اجهزة شخصية مثل جهازي وجهازك ...

    توجد اجهزة جبارة وقوية وذات ذاكرة جبارة وسعة تخزين هائلة .... وهي الاجهزة السيرفر ...

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

    اذن أين الموارد ؟ في اجهزة السيرفر ..

    أين برنامج السيرفر ؟ في اجهزة السيرفر

    من يحضر لنا الموارد ؟ اجهزة السيرفر ..

    من يطلب الموارد ؟ اجهزة السـير... اسف ... اجهزة الكلاينت !!

    لا اريد ان اخوض اكثر من ذلك ..

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

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

    الان عرفنا بعض هذه المفاهيم ....

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

    هل يعقل ان نعطيه هذه الصلاحية ؟؟ لو بالخطأ اعطيناه 1490 ريال ... سوف يغضب ... ويحقد ..

    وسوف يحذف الجدول بكامله ...... ولا عليه دخل السجن او لا ...

    والخاسر الاكبر هو .... الشركة ... باجملها !

    اذن نعطيه صلاحية صغيرة جدا .. يعني ايش صلاحية ؟ يعني حق !! نعطيه بعض الحقوق التي له ..

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

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




    دعنا نتقمص شخصية المدير العام ... لقواعد البيانات ... ويسمى
    DBA اختصارا لـ database administrator

    مدير قواعد البيانات هو الموظف صاحب الصلاحية الأعظم
    ...

    الان هل تذكر حينما كنت اقول لك ... ادخل تحت حساب
    scott وكلمة السر ****** أين كانت هذه الكلمة السر ..

    لكن ادحل الان ... بحساب الموظف
    system وبكلمة السر التي اقترحتها انت ...

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

    الان حينما تدخل بحساب
    system ... وتكتب الامر التالي /أايب




    كود:
    Select * from emp;
    فسوف يقول لك ... لا يوجد جدول بهذا الاسم !!

    فتقول له ....
    كود:
    Select * from scott.emp ;
    وهكذا ... سوف تعرض لك بيانات جدول الموظفين .... والذي يخص حساب او يخص الموظف
    scott

    الان ... يوجد مصطلح اريدك ان تعرفه .. ويجب ان تعرفه ... وهو
    schema

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

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

    طيب لنركز على الاولى
    schema

    وتعني "مجموعة من الاوبجيكت من جداول و مناظر وغيرها ... والتي يمتلكها شخص واحد "

    مثل جدول الموظفين .... والمنظر
    emp10 والمنظر view_30 ..... وجدول الأقسام .... وغيرها ..

    يمتلكها الموظف
    scott ..... ونسمي schema الخاص بالموظف scott بنفس اسم الموظف ..

    أي
    scott schema

    ولكي نستخدم
    schema الخاص بscott

    نكتب
    scott.the_schema

    مثل ..
    scott.emp , scott.dept …… ..... وغيرها

    الان لنعمل مستخدم ... او مايسمى بحساب ... مثل
    SCOTT

    لكن نريد اسمه ....
    King , وكلمة السر مثلا ..... boss

    انظر الى الامر ...




    كود:
    create user king
    
    identified by boss;
    يقول : اعمل مستخدم يدعى
    king واجعل كلمة السر هي boss

    الان لنجرب وندخل حساب هذا الشخص الذي يدعى بـ
    king

    لاحظ امر الدخول الى حساب أي شخص ... وهو
    conn

    كود:
    SQL> conn king
    
    Enter password: ****
    
    ERROR:
    
    ORA-01045: user KING lacks CREATE SESSION privilege; logon denied
    
    
    
     
    
    Warning: You are no longer connected to ORACLE.
    يقول ان المستخدم موجود وكلمة السر صحيحة ولكن لا يمكنني ان ادخل في حسابه ؟

    لانه لا يملك صلاحية الدخول على قواعد البيانات !!

    الم يكن من المفروض ان تعمل هذه الصلاحية اوتوماتيكيا ؟؟

    المفترض ولكن لاغراض امنية لم تعمل !!

    طيب طيب ... اسمع ماذا يقول في السطر الاخير :

    تحذير : انت الان ضايع ولم تعد في حساب احدهم !! ... ولم تعد متصلا باوراكل !!
    كود:
    SQL> select * from scott.emp;
    
    SP2-0640: Not connected
    يقول ... لست متصلا ؟؟؟

    طيب .... يعني اذا فشل في الاتصال باحد المستخدمين ..... سوف تفقد الاتصال ...

    نرجع لاتصالنا القديم ..
    .

    كود:
    SQL> conn system
    
    Enter password: ******
    
    Connected.
    يا سلام ... رجعنا لحساب مدير قواعد البيانات ...

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

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

    الان لنستذكر .. مالذي حصل ؟؟

    عملنا مستخدم وهو غير مفعل !! غير مسموح له الان .... كيف نسمح له ؟؟

    نعطيه صلاحية الاتصال بقواعد البيانات ..

    الان امر اعطاء الصلاحيات .. هو
    grant ..... طيب امر حذف الصلاحيات ..هو revoke

    هيا لنعطي
    king صلاحية الاتصال بقواعد البيانات ....

    كود:
    SQL> grant create session 
    
    to king ;
    
    
    
    Grant succeeded.
    اعطيناه الصلاحية
    create session ......

    وهي الصلاحية الخاصة بالاتصال بقواعد البيانات أوراكل .....

    الان لنتأكد :
    كود:
    SQL> conn king 
    
    Enter password: ****
    
    Connected.
    نعم .... أي والله .... اتصلنا ....

    والله روعة ^^

    هيا لنستعرض جدول الموظفين الخاص بالمستخدم
    scott

    كود:
    SQL> select * from scott.emp;
    
    select * from scott.emp
    
    *
    
    ERROR at line 1:
    
    ORA-00942: table or view does not exist
    يقول ... لا يوجد شيء بهذا الاسم ..؟؟

    لا يوجد .. ولكن ليس لنا صلاحية نحن للوصول الى الجدول ....

    طيب طيب.....

    هيا لنعمل جدول خاص بنا ...
    كود:
    SQL> create table a 
    
    (no number );
    
    
    
    ERROR at line 1:
    
    ORA-01031: insufficient privileges
    هاه ؟؟ لا اسمع ؟؟ ماذا تقول ؟؟ لا يوجد صلاحية كافية !!!!!

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

    يقال انها اكثر من 80 صلاحية .... لا اعرف كيف حسبوها الاوراكليين ..... ولكن ... هي اكثر من
    80 !!

    صراحة .. اريد اعطاء الموظف المسكين
    king كل الصلاحيات التي في بالي ....

    هيا لنعمل صلاحية ...

    كود:
    SQL> grant create table , create view , create sequence , create procedure 
    
    to king ;
    
    
    
    ERROR at line 1:
    
    ORA-01031: insufficient privileges
    غريبة ؟؟؟ لا يوجد صلاحية "اعطاء الصلاحيات "؟؟؟؟

    اوه نسيت . ما زلت متصل تحت حساب المستخدم
    king



    كود:
    SQL> conn system
    
    Enter password: ******
    
    Connected.
    
    SQL> grant create table , create view , create sequence , create procedure 
    
    2 to king ;
    
    
    
    Grant succeeded.
    اعطيت الموظف
    king الان اربع صلاحيات اساسية ..

    هي عمل الجداول , عمل المناظر , عمل سلاسل , عمل الإجراءات !!

    إجراءات ؟ وما هي هذه الإجراءات ؟؟؟

    سوف تعرفها في لغة الـ
    PLSQL !!

    وما هي لغة الـ
    PLSQL ؟؟

    هي لغة برمجة .. خاصة بالاوراكل ....

    وما معنى لغة برمجة ؟؟ وما الفرق بينها وبين الـ
    SQL

    ستعرف قريبا ....

    أين وصلنا ؟ نعم نعم .. صلاحية عمل الإجراءات ,

    المهم .. ان
    king يستطيع عمل هذه الاربع .... ياسلام .... رائع ...

    الان هذه الصلاحيات الخمس .... تسمى صلاحيات النظام .... اكرر صلاحيات النظام .. وهي :

    Create session , create table , create view , create procedure , create sequence
    صلاحيات مهمة .....

    الان هل يوجد صلاحيات غير صلاحيات النظام ؟؟؟

    طبعا
    !!

    مثلا الموظف
    king ليس لديه صلاحية الوصول الى جداول الاخرين ....

    لماذا لا نعطيه صلاحية الوصول الى جداول معينة ولا نعطيه الوصول الى جداول اخرى ؟؟

    اولا ما معنى وصول ؟؟ ماذا يقصد المؤلف الذي امامك بكلمة الوصول ؟؟

    يصل اذا وصل وصول ... يعني يتعامل مع, يعرض من , يحذف او يضيف الى , يعدل في ,

    أي جدول ......

    هل فهمت ؟ يعني اذا لم يملك صلاحية وصول .. فان الجدول لا يكون موجود في نظره ... .

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

    دعنا نعدل كلمة السر الخاصة بالموظف
    king ,,,

    ماذا نعطيه ؟؟ ما رأيك
    the_boss ؟؟؟


    كود:
    SQL> alter user king 
    
    identified by the_boss;
    
    
    
    User altered.
    اردت ان اعرفك على امر التعديل ... ليس الا .... خاصة اذا نسيت كلمة السر ...

    اذهب الى مدير قواعد البيانات , وقل له "ضيعت كلمة السر .... اريدها ان تكون
    the_boss " وهو يغيرها ^^


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


    كود:
    SQL> create user smith
    
    2 identified by not_boss;
    
    
    
    User created.
    
    
    
    SQL> grant create session , create table , create view 
    
    2 to smith ;
    
    
    
    Grant succeeded.
    الان ... عندنا جدول
    emp والذي عند الموظف scott , هذا الجدول اريد ان يستطيع جميع الموظفين ان يستعرضوه ... ماذا نفعل ؟؟؟

    اذن النوع الثاني من الصلاحيات هي صلاحيات الاوبجيكت ...

    على فكرة .... كلمة صلاحيات هي
    privilege .... احفظها جيدا ...

    Object Privileges
    وهي صلاحيات الوصول الى الاوبجيكت بانواعها ,

    الان كما قلنا اريد ان اعطي جميع الموظفين صلاحية استعراض جدول الموظفين الخاص ب
    scott

    اليك الامر :
    كود:
    grant select 
    
    on scott.emp 
    
    to public ;
    انظر كلمة
    public ..... أي عام ... أي للكل .... سميها ما شئت ,,,

    سوف يستطيعون جميعهم ان يستعرضوا جدول الموظفين ....

    الان لاحظ انني المستخدم
    system مدير قواعد البيانات ..

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

    أي بمعنى اخر ..... يا
    scott او system في مثالنا هذا ...


    سوف نعطي صلاحية الحذف من جدول الموظفين ... وايضا صلاحية تعديل اسماء الموظفين و ارقام اقسامهم .. ل
    king و smith !!





    كود:
    grant delete , update (ename , deptno )
    
    on scott.emp 
    
    to king , smith ;
    الان ... جدول الموظفين ... مثلا يوجد به بيانات مهمة جدا ليست قابلة للتعديل من قبل أي شخص الا
    Scott , system
    ..... وهي العمود sal مثلا .. اريد ان لا يعدلها احـد غير scott و system

    وهو تحدي !! أي ... يستطيع كل الموظفين التعديل في جدول الموظفين ... ولكن لا يستطيعون التعديل على عمود الرواتب الا
    scott , system


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

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








    الان ..... اريد ان اعطي صلاحية ل
    smith و king ان يعطي صلاحية تعديل بيانات جدول الموظفين ....


    أي ... ان الموظف
    king يستطيع ان يكتب الامر التالي او له الصلاحية ان يكتب الامر التالي :






    كود:
     
    grant delete , update (ename , deptno )
     
    on scott.emp 
     
    to smith ;




    لانه لو كتب الان الموظف
    king الامر السابق ... فانه ليس له الصلاحية ابدا ..... لكن الان اليك الامر الذي يمنح هذه الصلاحية الإضافية :





    كود:
    grant delete , update (ename , deptno )
    on scott.emp
    to king , smith
    with grant option ;



    لاحظ الجملة
    with grant option







    أي انه يستطيع ان يمنح هذه الصلاحية (
    delete , update (ename , deptno) لشخص اخر ....


    تريد ان تسحب الصلاحية ؟ تريد ان تحذفها ؟؟

    سوف نحذف صلاحية التعديل من الموظف
    SMITH على جدول الموظفين

    وفي الامر الثاني سنحذف كل الصلاحيات من الموظف
    smith على جدول الموظفين ..






    كود:
     
    SQL> revoke update
     
    2 on scott.emp 
     
    3 from smith ;
     
     
     
    Revoke succeeded.
     
     
     
    SQL> revoke all 
     
    2 on scott.emp 
     
    3 from smith ;
     
     
     
    Revoke succeeded.







    الان لديك صلاحيات الاوبجيكت الممكنة : صورة 1301













    كيف تستخدم الصورة ؟


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

    مثلا ....
    ALTER ... هو امر تعديل للاوبجيكت ... لأي اوبجكت هو يصلح ؟؟

    لنبحث في كلمات الـ
    yes .................






    اها ... لل
    table و sequence ..... أي للجداول والسلاسل ....


    فقط .....













    وايضا انظر الى
    execute .. فهي لا تصلح هذه الصلاحية او هذا الامر الا للاجراءات procedure ..







    سوف نأخذها فيما بعد ....
    Don’t worry









    الان مثال على اثنتين منهما ...













    كود:
    SQL> grant index
    2 on scott.emp
    3 to king ;
    Grant succeeded.
    SQL> grant references
    2 on scott.emp
    3 to king ;



    ... ارجو ان يكون واضح .. مع العلم انني نسيت او لا اعرف هذا الشيء
    references ...







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


    الان لو قلت ....





    كود:
     
    SQL> grant execute 
     
    2 on scott.emp
     
    3 to king ;
     
    on scott.emp
     
    *
     
    ERROR at line 2:
     
    ORA-02224: EXECUTE privilege not allowed for tables




    لماذا اعطانا هذه الرسالة :"صلاحية (تنفيذ
    execute ) لا تصلح مع الجداول !! "


    انظر الى الصورة السابقة 1301

    وهل يوجد
    yes .... في ملتقى execute و table ؟؟؟ هل عرفت الان كيف تستخدم الصورة ؟؟ هيا ... شد حيلك ..













    في شيء اخير ... نختم به منهجنا ... ونرتاح قليلا من
    SQL ,,,,







    انها الادوار ..
    ROLES







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


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

    صلاحية العرض ...

    صلاحية التعديل ..

    صلاحية الحذف ...

    صلاحية العرض والحذف

    صلاحية التعديل والحذف والعرض ..

    صلاحية الفهرسة والعرض

    صلاحية تعديل عمود الرواتب ... إضافة الى صلاحية الحذف ...





    .....








    عدد هائل من الاحتمالات ...


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

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

    يعني تخيل لدينا ثلاث مدراء ... الاول سميث والثاني اسكوت والثالث كنج .
    ...






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


    عرض
    select, تعديلupdate , حذف delete, وتعديل بناء alter....






    كلهم ... متشابهون في الصلاحيات ...


    انظر كيف سوف نعطيهم هذه الصلاحيات ... انظر الصورة 1302
    :







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


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

    وستة مدراء مثلا ...؟؟؟؟؟

    الاوراكليين .... (الاوراكليين جمع اوراكلي ...و هم اصحاب الأوراكل , ومبرمجيه ) قالوا ...

    "يجب ان نبسط هذا الموضوع , ونضيف خاصية الـ
    Roles "






    وما هي خاصية الادوار يا اوراكليون ؟؟


    هي خاصية تنظيمية .. مثلا نسمي هذه الصلاحيات (عرض
    select, تعديلupdate , حذف delete, وتعديل بناء alter.) بصلاحيات المدراء ....

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

    بل نقول له ... "لك صلاحية المدراء "

    انظر البساطة .... والسلاسة ... انظر كيف نعمل هذه الـ
    Roles ولاحظ الصورة 1303







    الان لاحظ الامر :






    كود:
     
    create role manager ;




    عملنا الدور ... الخاص بالمدراء ...


    هيا يا أوراكل .... انظر ماذا لدينا ... لدينا دور .... ويدعى بدور المدراء ...

    الان نضيف الصلاحيات الخاصة بالمدراء لمن ؟؟ للمستخدم كنج ؟ لسميث ؟؟؟ لمن ؟؟

    لا ... بل للدور نفسه !!





    كود:
     
    grant select , update , alter , delete
     
    on scott.emp 
     
    to manager;




    الان الدور جاهز للاستخدام ... انظر فقط الى الامر التالي ...











    كود:
    grant manager
    to king , smith , scott ;



    ... وكأنه صلاحية واحدة !!


    طبعا خاصية الأدوار لا تصلح الا لصلاحيات الاوبجيكت فقط .....

    الان .... هل فهمت المغزى ؟؟

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










    التعديل الأخير تم بواسطة The Coder ; 23-02-2006 الساعة 12:50 AM

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

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

    انظر الى جداول الـ
    Data Dictionary لكي تستعرض الصلاحيات على اشكالها :

    Role_sys_privs
    جدول خاص بصلاحيات النظام المعطاه للادوار

    Role_tab_privs
    جدول خاص بصلاحيات الاوبجيكت المعطاه للادوار

    User_role_privs
    جدول خاص بالادوار

    User_tab_privs_made
    جدول خاص بصلاحيات الاوبجيكت المستخدمة على جميع الابجكت

    User_tab_privs_recd
    جدول خاص بصلاحيات الاوبجيكت المعطاه للمستخدمين

    User_col_privs_made
    جدول خاص بصلاحيات الاوبجكت المستخدمة على اعمدة ما ...

    User_col_privs_recd
    جدول خاص بصلاحيات الاوبجت المعطاه للمستخدمين والتي تخص اعمدة ما ...


    التحدي ما قبل
    ... قبل ... الاخير ... لـ SQL

    استعرض الجداول السابقة .. وحاول ان تعرف ما مغزى كل جدول ...

    واسألني اذا واجهت صعوبة ...

    التحدي ماقبل الاخير لـ
    SQL

    اعمل كذا مستخدم .... اقترح صلاحية للمدراء .. اقترح صلاحية للموظف العادي ...

    وضع لكل مستخدم .. صلاحية تخصه , اي الموظف 1 , والموظف 2 .. لهم صلاحية المدراء ..

    والموظف 10 , 20 , 30 , 50 , 1000 ..... لهم صلاحية الموظف العادي ... اقترح أي شيء ...



    التحدي الاخير .... للـ
    SQL

    اعمل جدول او مجموعة جداول ... تلخيص لاوامر الـ
    SQL .....

    وسوف اعرض كل محاولاتكم ....

    لم يبقى غير ان اخبرك ..... انني انا انهيت منهجي في الـ
    SQL

    ولكن ... هل انهيت انت منهج
    SQL؟؟؟

    ابحث , وجرب , واسأل ..... واستفسر .. وترقب كل جديد ....

    من الممكن ان ترى كم هائل من المعلومات التي لم اشرحها ....

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

    الخيار لك ... ولكن ... أنصحك بنصيحة واحدة ....

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



    انتهى المنهج للـ SQL

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

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

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

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

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

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

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

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

    -
    التعرف على هذه اللغة ..

    -
    المتغيرات ...

    - بعض النصائح البرمجية ...


    هيا لنؤركل ^^
    السلام عليكم

    لغة الـ
    PLSQL .....

    ما هي هذه اللغة ...؟

    لماذا نستخدمها ؟ وما فائدتها ؟؟؟

    هي لغة تطويرية للغة
    SQL ,, طورت الأوراكل هذه اللغة لتواكب متطلبات البرمجة الحديثة ,,

    وهي اختصار لـ
    Procedure Language SQL أي اللغة الاجرائية لجمل الـ SQL



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

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

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

    شكلها يشبه لغة
    ADA المشهورة (ADA لغة تم تطويرها لوزارة الدفاع الامريكية ... خلونا نبعد عن السياسة )

    بها حلقات التكرار , بها مسارات منطقية و جمل شرطية ....بها مصائب اخرى .

    اذا صادف وقد ربطت قواعد البيانات مع لغة اخرى مثل الجافا او الـ
    C# او الـ Visual Basic , فأقول لك ...

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

    اذا لم تبرمج في حياتك .. اقول لك ,,,

    اخي .. مارأيك في لغة
    SQL , لو قلت لك ... اريدك ان تعدل بيانات مئة شخص ... ومن ثم تعرض لي بياناتهم قبل التعديل وبياناتهم بعد التعديل ؟ ماذا تفعل ... سوف تعرض اولا بياناتهم .. ثم تعدل .. ثم تبحث عن الذين عدلتهم وتعرض بياناتهم ...

    اخي تخيل انك تستطيع ذلك في كتابة 5 الى 10 سطور ... ثم تكبس زر انتر ... وسيعملها الأوراكل اوتوماتيكيا ؟؟

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

    تخيل هذه البرامج الذكية والاوتوماتيكية ... موجودة ؟ هل تستطيع عملها بالـ
    SQL ؟؟ طبعا لا ...

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

    طبعا لا غنى عن
    SQL فهي الام ولكن قدرتها محدودة في اوامر ... PLSQL تعطيك امكانيات اوسع لاستخدام الـ SQL ....

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

    - قبل البدء :
    اريدك يا صاحبي ... ان تتقن الـ
    SQL ... اريدك ان تشربها كشرب الماء .. خذ يومين فيها ... خذ عشر ... خذ شهرين ... هذا ليس مهم ... الاهم ان تتقن الـ SQL .... ان لم تتقنها او لا تريد ذلك ... فلا تكمل معي .


    - ما معنى برنامج :
    البرنامج هو مجموعة اوامر للحاسب , مثال على هذه الأوامر "احسب ,اجمع , اطرح , اقسم , هات , خذ , سوي , افعل " هذه الأوامر مكتوبة بلغة برمجة ما ... من يكتبها ؟ المبرمج ..

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

    نحن :ياااا حاسب ....

    الحاسب: نعم

    نحن :خزن الرقم الاول

    الحاسب:حاااضر

    نحن :ياااا حاسب .... خزن الرقم الثاني

    الحاسب:حاااضر ..

    نحن :ياااا حاسب .. اجمعهما

    الحاسب:حاااضر

    نحن :ياااا حاسب.. خزن النتيجة في متغير

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

    نحن :ياااا حاسب .... ضع النتيجة في متغير اخر

    الحاسب: حاااضر

    نحن :اووووف .... ياااا حاسب .... اضرب المتغيرين في بعضهما

    الحاسب: طيييييييب

    نحن :.... ياااا حاسب .... خزن النتيجة في متغير جديد ...

    الحاسب:حاااضر

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

    يعني نطلب من الحاسب كوارث ليس اوامر !! والكارثة العظمى "يا حااااسب ... فرمت الجهاز "
    .

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

    مثلا 2 و 5 .. ماهو مربع جمعهما ؟؟
    2 + 5 = 7

    7 * 7 = 49
    يعني هي خطوات حل ... هذا ما نقصده بالخوارزميات !!

    وهي خطوات منطقية تؤدي الى حل ..

    فهمت ؟؟

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

    لغات البرمجة كثيرة , كل شركة تطلع لغة جديدة , لا تمر بضع سنين الا ونسمع لغة جديدة او تطوير لغة ما ,,

    هذه اللغات سوف تتحول الى اصفار وواحدات ..... لا يفهمها الا الكمبيوتر , الكمبيوتر اصلا لا يفهم هذه اللغات !!

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


    - المتغيرات
    Variables :

    من اهم العناصر في البرمجة بشكل عام ,, احفظ الكلمة بالانجليزي ....

    هل تذكر لما تكلمنا عن القرص الصلب وعن الذاكرة العشوائية (
    RAM) ؟؟

    قلنا ان القرص الصلب للذاكرة الدائمة , والبيانات التي نريد تخزينها للابد ,, ومثال على ذلك قواعد البيانات نفسها !!

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

    تكلمنا لماذا تلك ولماذا هذه , واهم الاشياء التي اريدك ان تستذكرها هي ان الذاكرة العشوائية ميزتها ميزة .. ماهي ؟

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

    الالكتروني يعتمد على سرعة الالكترونات , يعني مثل سرعة الضوء !!

    الان سوف تعرف لماذا بعض البيانات غير هامة لدرجة اننا نخزنها تخزين مؤقت ....

    المتغيرات ماهي ؟

    هي اوعية , هي شيء يحمل قيمة , أي قيمة .... يخزن القيمة بداخله .... طبعا المتغيرات هي جزء من الذاكرة , يعني اذا قلنا المتغير س أي ان س هذه حاجزة مكان في الذاكرة ... المتغيرات دائما لا نستطيع نحن البشر ان نرى ما بداخلها ... الا اذا نحن قلنا "س=10" فهذا يعني ان س بها العدد عشرة , واذا قلنا "س=اهلا وسهلا" يعني ان س بها القيمة "اهلا وسهلا" ,,, واعيد واكرر ,, المتغيرات هي جزء من ماذا ؟ من الذاكرة , يعني الذاكرة هي مجموعة متغيرات .

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

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

    - تركيب هذه اللغة :
    هذه اللغة لها شكل محدد وهو :
    كود:
    Declare
    
    ……
    
    …
    كود:
    مجموعة تعريفات....
    
    ……
    
    Begin
    
    ……
    
    …مجموعة اوامر…
    
    ……
    
    end;
    
    Exception 
    
    ……
    
    …مجموعة اوامر ….
    
    ……
    
    /
    
    


    قبل البدء بالبرنامج الاول .....

    لاحظ انني سوف استخدمة كلمة "جزئية" ...

    مثلا جزئية التعريف يعني هي السطور ما بين الكلمة
    declare والكلمة begin

    او جزئية الأوامر .. أي السطور التي بين
    begin وبين end ...

    او جزئية الاستثناءات وهي السطور التي تحت كلمة
    Exception

    الان ... البرنامج الاول ... وهو اشهر برنامج , انه برنامج"
    Hello world"

    وهو ابسط برنامج يمكن كتابته .... وهو برنامج يعرض لنا الجملة
    hello world على الشاشة ...

    طبعا بنفس البرنامج
    SQL PLUS نعمل برامج هذه اللغة ,,, الان اريدك ان تكتب الامر التالي وهو الخاص بعرض الرسائل والمخرجات :

    كود:
    SQL> set serveroutput on ;
    يجب ان تكتبه في كل مرة تفتح هذا البرنامج ... يعني اعمله مرة واحدة في كل مرة تقوم بتشغيل البرنامج ...


    الان برنامج
    hello world ..

    كود:
    SQL> begin
    
    2 dbms_output.put_line('hello world');
    
    3 end;
    
    4 /
    
    hello world
    
    
    
    PL/SQL procedure successfully completed.
    في السطر الاو كتبنا
    begin .... يعني يا أوراكل ... هذا بداية برنامج بلغة PLSQL

    في السطر الثاني كلام كثير جدا ...
    dbms_output ثم نقطة ثم دالة ... بها مدخل Parameter , وهو مدخل واحد ,

    ويظهر ان المدخل من نوع نصي ... انها دالة
    put_line("???")

    وهي تأخذ ما بين القوسين (المدخل) .. وتخرجه لنا على الشاشة ..

    السطر الثالث نهاية البرنامج

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

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

    الان انظر ماذا طبعت لنا ... طبعت لنا الجملة
    hello world ...

    انظر تحتها بكم سطر ... يقول
    PL/SQL procedure successfully completed.

    يعني خلاص ... كذا انتهى البرنامج ...

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

    الان لنضع جملتين
    hello world بجانب بعضهما ...


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

    كود:
    SQL> begin 
    
    2 dbms_output.put_line('hello world');
    
    3 dbms_output.put_line('hello world');
    
    4 end;
    
    5 /
    
    hello world
    
    hello world
    اوبس .... يظهر ان الدالة تضع كل مدخل .... في سطر ... على اسمها
    put_line يعني ضع الجملة التالية في سطر.

    لاحظ انه في كل نهاية جملة نضع الاشارة
    ; أي الفاصلة المنقوطة , يجب ان تضعها ...

    في اماكن لا نضعها مثل
    begin و declare ... وغيرها .

    الان نريد ان نستخدم المتغيرات ... كيف نستخدمها ؟

    انظر البرنامج التالي ... وهو برنامج
    hello world .... ولكن من نوع اخر :


    كود:
    SQL> declare 
    
    2 abc varchar2(15) :='Hello World';
    
    3 begin
    
    4 dbms_output.put_line(abc);
    
    5 end;
    
    6 /
    
    Hello World
    يظهر ان هنالك نقطة جديدة ... وكلمة جديدة ... وهي
    declare أي تعريف ... أي اننا نعرف متغيرات ... ومصائب اخرى ... ماهي هذه المصائب الاخرى ؟ ستعرفها لاحقا ...

    السطر الاول : هي كلمة
    declare أي تعريف ...

    السطر الثاني : عرفنا متغير .. اسمه
    abc ونوعه ماذا ؟؟ رقمي ؟ حرفي ؟ نصي ؟ تاريخ ؟؟

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

    العلامة التي تشبه اليساوي
    := ما معناها ؟؟ معناها اسند .. ساوي ... ضع ... ضع ماذا ؟ ضع القيمة التي في اليمين ... في المتغير الذي في اليسار ... اكرر .. تضع هذه العلامة القيمة الي باليمين , في المتغير الي في اليسار ...

    لاحظ انه سوف يضع
    hello world في المتغير abc ... ولا تنسى ان تضع التواريخ والنصوص بين علامة تنصيص احادية ....


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

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

    الان نحن خزنا في المتغير قيمة ...

    الان نحن خزنا في المتغير جملة
    hello world

    الان نحن خزنا في الذاكرة نص
    hello world

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

    السطر الثالث .. بداية البرنامج .

    السطر الرابع .. اطبع ماذا ؟ اطبع ما بداخل
    abc !! ماذا بداخل abc ؟؟؟ من يذكرني ؟؟

    اها ... بداخله جملة "
    hello world" هيا اطبعه ...


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

    لنعقد الموضوع قليلا في المثال القادم :
    كود:
    SQL> declare 
    
    2 hello varchar2(20) :='hello';
    
    3 name varchar2(10):='hamzah';
    
    4 any_thing varchar2(10);
    
    5 like_any_thing any_thing%type;
    
    6 begin
    
    7 any_thing :='yes';
    
    8 like_any_thing :=any_thing;
    
    9 any_thing :=like_any_thing||' no';
    
    10 dbms_output.put_line(hello||' '||name);
    
    11 dbms_output.put_line(hello||name);
    
    12 dbms_output.put_line(any_thing);
    
    13 dbms_output.put_line(like_any_thing);
    
    14 dbms_output.put_line('hi '||name);
    
    15 hello := hello||' ali '||hello;
    
    16 dbms_output.put_line(hello);
    
    17 end;
    
    18 /
    
    hello hamzah
    
    hellohamzah
    
    yes no
    
    yes
    
    hi hamzah
    
    hello ali hello
    واو

    يظهر ان البرنامج كبير قليلا ...

    السطر الثاني ...

    عرفنا متغير اسمه ماذا ؟ اسمه
    hello من نوع نصي .. وبه الجملة "hello" ... لاحظ ان اسم المتغير لا يدل دائما على محتواه !!


    السطر الثالث
    :

    .. عرفنا متغير اسمه
    name وبه القيمة "hamzah" , لاحظ ايضا ان اسم المتغير لا يدل دائما على محتواه .. فبعضهم يقول المتغير x .... وبداخله اسم شخص مثلا ...

    اسماء المتغيرات ليست الا لمن ؟؟ لنا نحن لكي نعرف نقرأ البرنامج ....

    هيا الان ما بداخل
    name ؟؟ بداخله القيمة hamzah ..... عرفنا ذلك لاننا سمينا المتغير باسم يليق ما بداخله ...

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


    السطر الرابع
    :

    عرفنا متغير باسم
    any_thing .... من نوع نص ايضا .... لكن هل بداخله شي ؟ هل وضعنا شيء ؟ هل اسندنا اليه قيمه ؟؟ لا ..... انه فارغ الان ...

    على فكرة .. لما اقول "عرفنا " يعني حجزنا في الذاكرة ... يعني حجزنا جزء من الذاكرة .. كم حجمه ؟ على حسب .. فمثلا
    any_thing .... 10 خانات ... أي 10 احرف ... أي اخذنا من الذاكرة مقدار 10 احرف ...


    السطر الخامس :

    انتبه هنا ... عرفنا متغير باسم ماذا ؟
    like_any_thing .... اسم طويل ... لكن لو قرأته فانه يدل على معنى ...

    الان ما نوعه ؟ نص ؟؟؟ رقم ؟؟؟ تاريخ ؟؟

    لا لا لا ...

    ذكرنا ان نوعه ... هو
    any_thing%type .... لاحظ جيدا ....

    معناه هو "اجعل نوع المتغير
    like_any_thing نفس نوع المتغير any_thing .... "

    وما نوع المتغير
    any_thing ؟؟ نوعه نص !! وحده هو 10 احرف ... اذن المتغير like_any_thing سيكون نص , حده 10 احرف !! أي نفس نوع المتغير any_thing ....

    لماذا عملوا الأوراكليين هذه الحركة ؟؟ ستعرف لاحقا .... ستعرف .

    المهم ما نوع
    like_any_thing ؟؟ نوعه نفس نوع المتغير any_thing

    طيب ما بداخل
    like_any_thing ؟؟ لا يوجد شيء !!

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


    السطر السادس :

    بداية البرنامج ....

    السطر السابع :

    اسناد .... او وضع قيمة
    yes وهي نص طبعا في ماذا ؟ في المتغير any_thing ....

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

    الان بداخل المتغير
    any_thing القيمة النصية yes



    السطر الثامن :

    اسناد اخر ... لكن ليس اسناد قيمة الى متغير هذه المرة .... انه اسناد ما بداخل متغير الى متغير اخر !!

    يا سلام على المرونة ... الان المتغير
    like_any_thing الذي نوعه هو نفس نوع المتغير any_thing به القيمة ماذا الان ؟؟؟ به القيمة yes ... كيف ؟

    قلنا انه سوف يتم اسناد ما بداخل المتغير
    any_thing الى المتغير like_any_thing في هذا السطر ..


    السطر التاسع :

    يظهر ان البرنامج لا يتكلم الا عن المتغيرات النصية ....

    اسناد قيمة الى المتغير
    any_thing .. مالذي اسندناه بالضبط ؟

    اسندنا ما بداخل المتغير
    like_any_thing + القيمة no الى المتغير any_thing

    فكر معي ... ماهي العلامة || ؟؟؟

    انها علامة الضم ... هل تذكرها ؟ هي تستخدم للنصوص ... يعني
    'a' || 'b' تعطينا الناتج 'ab'

    عملية رائعة ... ومفيدة ....

    الان ... لاحظ ان المتغير
    like_any_thing بداخله ماذا ؟؟ به القيمة yes

    طيب .. ناتج العملية التالية :
    'yes' || ' no' = 'yes no'
    لاحظ الفراغ كيف اتى ... اتى من
    ' no' .....

    الان الناتج يوضع في المتغير
    any_thing

    بداخل المتغير
    any_thing الان القيمة النصية 'yes no'

    الان ما رأيك بالمتغير
    like_any_thing .. ما بداخله ؟؟

    ... بداخله قلنا
    'yes' .... هل تغير في هذا السطر ؟؟ لا لا .. لم يتغير .. نحن استخدمناه فقط (يمين عملية الاسناد:= )



    السطر العاشر :

    اطبع على الشاشة القيمة التالية (
    'hello hamzah') .. يعني يطبع ما بداخل المتغير hello واعرض فراغ بعده .... ثم اعرض ما بداخل المتغير name ولاحظ عملية الضم || ....

    hello || ' ' || name = 'hello' ||' '||'hamzah' = 'hello hamzah'


    السطر الحادي عشر :
    نفس العاشر لكن ... يوجد شيء مختلف ... الا وهو انه يقول اعرض مابداخل المتغير hello ثم المتغير name

    الناتج :
    hellohamzah بدون فراغ .. انتبه للسطر هذا والسطر السابق وحاول التفريق بينهما ..

    جرب وضع بينهما فاصلة مثلا ...


    السطر الثاني عشر ..

    سيعرض ما بداخل المتغير
    any_thing أي ستكون النتيجة 'yes no'



    السطر الرابع عشر ...

    سيعرض النص التالي
    'hi hamzah' .... فكر فيه قليلا ...


    السطر الخامس عشر :

    قلنا ان ما بداخل المتغير
    hello هي القيمة 'hello' طيب .. فكر ماذا سيكون الناتج ؟؟

    مالذي سوف يسند الى المتغير
    hello ؟؟ فكر قليلا ...

    سوف اعطيك الحل ولن اشرح كيف ...

    hello ali hello
    الان لنستذكر المخرجات وكانت كما يلي :
    كود:
    hello hamzah
    
    hellohamzah
    
    yes no
    
    yes
    
    hi hamzah
    
    hello ali hello

    طيب .. لو كان احد المتغيرات فارغ ؟؟؟؟ سوف لن يطبع شيء ... اوكيه ..

    انظر لاصغر برنامج يمكن كتابته بهذه اللغة ... لا فائدة منه ... ولكن انظر اليه :
    كود:
    begin
    
    null;
    
    end;
    
    /

    الان سوف اعطيك برنامج خاطئ .. وكله خطأ في خطأ ...
    كود:
    declare 
    
    qwertyuiopasdfghjklzxcvbnmQWERT number;
    
    123abc number ;
    
    a%b number ;
    
    a , b , c number ;
    
    select number ;
    
    begin
    
    null;
    
    end;
    
    /

    لماذا خطأ في السطر الثاني ؟؟

    لان اسم المتغير اكثر من 30 حرف !!

    لماذا خطأ في السطر الثالث ؟؟

    لان اسم المتغير لم يبدأ بحرف .. بل بدأ برقم !! ...

    يمكنك ان تقول :
    aB348 ....

    لماذا خطأ في السطر الرابع ؟؟

    لان اسم المتغير احتوى على رمز من الرموز الممنوعة .. وهو الرمز % .. من هذه الرموز الممنوعة( + = - ^ & | .)

    يمكنك ان تستخدم مابين القوسين ( _ $ # )

    وانا صراحة احب استخدام _ كثيرا .....

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

    لماذا خطأ في السطر الخامس ؟؟

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

    لماذا خطأ في السطر السادس ؟؟

    لان المتغير اخذ اسم من الاسماء المحجوزة للغة ...

    لكل لغة اسماء محجوزة لا يجوز تسمية متغيراتنا بها .... ومن هذه الاسماء المحجوزة
    update , insert , for , while , if , loop , select , create ….



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



    -
    فوائد المتغيرات


    تتلخص في ثلاث فوائد رئيسية ..

    1- معالجة البيانات المخزنة في الذاكرة
    .



    2-
    اعادة الاستخدام .



    3-
    سهولة الصيانة .

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

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

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

    ونستطيع ايضا ان نعدل ونغير فيها وبسرعة الضوء , وتخرب فيها ونضع قيم فيها ... وفي النهاية نضع الناتج مثلا النهائي بها , ونخزنها في قواعد البيانات مثلا ...

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



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

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


    Constant
    الثوابت


    الان لو عندي متغير يكون ثابت .. مثلا القوة = ثابت الجاذبية * الكتلة .. << لا اعرف من أين اتى هذا القانون ولكن لنفرض انه صحيح ...

    ثابت الجاذبية هو 9.8 (لا ادري هل هو صحيح هذا العدد الاخر !!)

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

    طيب انظر كيف تعمل متغير ثابت لا يتغير .

    كود:
    declare 
    
    gravity constant number :=9.8 ;
    
    begin 
    
    dbms_output.put_line(gravity);
    
    end;
    
    /
    نضيف كلمة
    constant فقط ....

    حبيبي ... مع الثوابت لازم تضع قيمة مبدئية
    , يعني ايش قيمة مبدئية ؟ يعني تضعها وقت التعريف زي ما عملنا الحين


    الغير خالية :
    بعض المتغيرات ريدها ان لاتكون خالية بالمرة ... كيف نعمل ذلك ؟ بسيطة .. باضافة
    not null المشهورة ...

    ومثلا اريده ثابت الجاذبية ... ولا يكون خالي ... انظر :


    كود:
    declare 
    
    gravity constant number not null :=9.8;
    
    begin 
    
    dbms_output.put_line(gravity);
    
    end;
    
    /
    انواع البيانات
    Data type:


    تعرفها اعتقد ... سوف استعرض بعض هذه الانواع للتذكير :
    VARCHAR2
    للنص .. ويجب ان نحدد حجمه .. وحده الاقصى 32676 حرف .

    CHAR
    للنص ايضا ... وبامكاننا ان لا نحدد حجمه .... ليصبح حرف واحد ... حده الاقصى 32676 حرف .

    Number(P,S)
    للارقام .. نضع حده الكلي في الـ P ونضع حده الكسري في S

    Date
    للتاريخ ...

    BINARY_INTEGER
    وهو للارقام الصحيحة فقط .... ويحمل ارقام اكثر من مليارين موجبة واكثر من مليارين بالسالب ...

    PLS_INTEGER
    نفس فكرة سابقه ولكن بحجم اقل .... من number ومن Binary_Integer


    انواع المتغيرات
    :

    1- المتغيرات التي تحتوي على قيمة واحدة ....
    كما شاهدنا .... متغيرات التي تكون حرفية ورقمية و نصية و تاريخية ووو .......

    يعني الي شاهدناها سابقا ... متغيرات القيمة الواحدة ...

    2- المتغيرات المنطقية
    Boolean variables

    متغيرات نتوقع ان تحتوي على ثلاث قيم ...
    Null , false , true
    اليك مثال عليها .....



    كود:
    declare 
    
    a boolean := true;
    
    b boolean :=false;
    
    c boolean :=null;
    
    sal_1 number :=1000;
    
    sal_2 number :=2000;
    
    d boolean :=(sal_1>sal_2);
    
    begin
    
    null;
    
    end;
    
    /

    المتغير
    a نوعه متغير منطقي ... وبه القيمة true يعني صحيح ..

    المتغير
    b به القيمة false يعني خاطئ

    المتغير
    c به قيمه خالية ..

    المتغير
    d به القيمة ماذا ؟ true false null ؟؟؟ أي منهم ؟؟

    انه
    false لماذا يا ترى ؟؟ لان ناتج التعبير المنطقي (sal_1>sal_2) هو خاطئ ...

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


    3- المتغيرات المركبة
    Composite Data type

    متغيرات بها اكثر من قيمة ... سنخوض فيها حتى تطفش وتزهق مني ..

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

    4-
    المتغيرات التي تخص الكائنات الكبيرة الحجم ..Large Object Data type

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

    5- متغيرات الربط
    bind variables .

    وهي متغيرات شاملة .. يعني نحن لو عرفنا المتغير
    a في برنامج ما ... بعد ان ينتهي البرنامج ماذا تتوقع يحصل ؟

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

    كود:
    SQL> variable a number;
    عرفنا المتغير .... الذي يسمى بـ
    a

    كود:
    declare 
    
    abc number :=9;
    
    begin 
    
    :a := abc;
    
    dbms_output.put_line(:a);
    
    end;
    
    /
    انظر كيف استخدمناه في هذا البرنامج ...

    عرفنا متغير
    abc ويساوي تسعة ...

    انظر الى المتغير
    a ماذا وضعنا قبله !!

    وضعنا قبله العلامة :

    اسندنا قيمة المتغير
    abc الى المتغير a

    الان المتغير
    a به القيمة تسعة ..

    انتهى البرنامج صح ؟ اذن مات المتغير
    abc وليس له وجود الان ...

    تأكد بنفسك ....

    كود:
    begin 
    
    dbms_output.put_line(abc);
    
    end ;
    
    /

    سوف يقول "لا وجود لشيء يدعى
    abc"

    الان جرب ما يلي :
    كود:
    begin 
    
    dbms_output.put_line(:a);
    
    end;
    
    /
    سوف يعطيك الناتج تسعة .. وهي اخر قيمة مخزنة في هذا المتغير ..

    لنستعرض ما بداخله .. اليك الامر :
    كود:
    SQL> print a;
    
    
    
    A
    
    ----------
    
    9
    الجدير بالذكر انك تستطيع ان تحفظها على القرص الصلب .. انا لا اعرف كيف ... >< اااسف


    -
    تركيب لغة PLSQL وبعض الملاحظات عليها :



    لغة الـ
    SQL و PLSQL مترابطة جدا , وستجد اننا سوف نأخذ بعض الدوال التي موجودة في SQL , وستجد مفاهيم اخرى جدا متشابهة ..

    الان اريدك ان ترى بعض التراكيب في هذه اللغة .

    - المتغيرات : وقد عرفنا خصائصها .

    -القيم الثابتة : هي القيم النصية والرقمية وقيم التاريخ .. اشير الى ان التاريخ والنص يأتيان بين علامتي تنصيص .

    - العمليات : وهي كما يلي :

    الاس ** .... النفي
    NOT ,

    الجمع + .... الطرح - .... الضرب * .... القسمة /

    عمليات المقارنة
    = , > , < , =< , => , <> , IN , Between , LIKE , IS NULL....

    العمليات المنطقية وهي
    AND OR




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

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

    -
    الهوامش والملحوظات والتعليقات : وهي بعض التعليقات التي تنفعنا فيما بعد , يعني تخيل معي كتبت برنامج مكون من 1000 سطر , وأتيت عليه بعد سنتين ... هل ستذكر اسماء متغيراته ؟؟ هل ستذكر عمله بالضبط ؟؟

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

    الطريقة الاولى باستخدام الرمز -- وهو يستخدم للسطر الواحد ...

    لاحظ ان السطرين الثاني والثالث والسطر السادس لن يتم تنفيذهم , يعني أوراكل بيغطي عيونه عنها ولا ينفذها مهما كان فيها من اوامر .
    كود:
    declare
    
    -- now we will declare a variable for
    
    -- the gravity ... it's name is v_gra
    
    v_gra constant number :=9.8 ;
    
    begin
    
    -- we will print it on the screen ...
    
    dbms_output.put_line(v_gra);
    
    end;
    
    /
    طيب ... عندي الفين سطر ابي اكتبهم تعليقات ..... يعني كل شوي اعمل بداية السطر -- ؟؟؟؟؟؟

    اليك علامة /**/ ... وهي لمجموعة سطور ....

    يعني /* اكتب التعليق هنا */

    فهمت ؟ انظر :
    كود:
    declare
    
    /* now we will declare a variable for
    
    the gravity ... it's name is v_gra */
    
    v_gra constant number :=9.8 ;
    
    begin
    
    /*we will print it on the screen ...*/
    
    dbms_output.put_line(v_gra);
    
    end;
    
    /


    -
    استخدام الدوال التي في لغة الـ SQL :

    كل الدوال مسموح استخدامها في لغة
    PLSQL , من رقمية ونصية وتاريخية ودوال التحويل من نص الى تاريخ او من تاريخ الى نص او من رقم الى نص ....... كلها تستطيع استخدامها ... ما عدى :

    1- Decode
    .... هل تذكرها ؟ هي غير مسموحة هنا

    2- دوال الـ
    Group function مثل min , max , count …. ....... الخ



    -
    الوحدات Blocks



    ماهي الوحدات ؟

    انظر المثال التالي :
    كود:
    declare 
    
    v_1 number ;
    
    begin 
    
    v_1:=10;
    
    end;
    
    /
    السطور التي بين
    begin و end تسمى وحدة block , في برنامجنا هذا يوجد وحدة واحدة صح ؟

    في الحقيقة انه من
    declare وحتى end هذا يعتبر وحدة واحدة .....

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

    الان لنعمل برنامج به وحدتين ....وبرنامج اخر به ثلاث وحدات ... انظر شكلها في الصورة 1400
    :






    لاحظ كلمة الوحدات المتداخلة ....
    Nested Blocks

    يعني تتداخل فيما بينها ...

    انتبه الى تركيبها ... لا تقل تركيبها مثل الصورة 1401 :

    الصورة
    1401 هذه .. مفهومها خطأ !!انتبه ...

    الصح تجده في الصورة 1400


    الان انظر الى المثال الخاطئ ... فكر لماذا هو خاطئ ؟؟
    كود:
    declare
    
    v_1 number :=1;
    
    begin
    
    dbms_output.put_line(v_1);
    
    declare
    
    v_2 number :=2;
    
    begin
    
    dbms_output.put_line(v_2);
    
    end;
    
    v_1 :=10;
    
    dbms_output.put_line(v_2);
    
    end;
    
    /
    فكر فكر فكر ....

    انا اخبرك .. في السطر الذي قبل الاخير .. قال اطبع المتغير
    v_2 ....

    لقد عرفنا المتغير
    v_2 في وحدة داخلية Sub Block (تنبه للكلمة الانجليزية) .... في السطر السادس ..

    لكنه مات هذا المتغير ... في السطر التاسع عندما رأى نهاية الوحدة
    end

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

    الان اريد ان اتكلم قليلا عن مهارة جديدة ... وهي مهارة التتبع
    trace !!

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

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

    لكن هي مهمة ... مهمة جدا ...

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

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



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

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

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