سوري .. الصورة 1500
http://img9.picsplace.to/img9/7/1500.jpg
طيب طيب .... هل انتهى كل شي ؟؟ لا لا ..
يوجد مشكلة بالنسبة لاوراكل ... يريد ان يستخدم المتغير
empno الموجود في هذا المتغير r_emp ..
كيف ؟ كيف يعرف ان
empno للمتغير r_emp ؟؟؟؟
بسيطة ... اليك حل :
r_emp.empno
سيكون المتغير
empno ... الموجود في المتغير r_emp .... بس ... هذه الفكرة ...
ستجد في السطر الرابع جملة استعلام بسيطة جدا .... انظر ماذا تقول ...
Select * into r_emp from scott.emp where scott.emp.empno=7654 ;
سيضع كل الحقول .. بنفس الترتيب .... في المتغير
r_emp ..... والذي نوعه ماذا ؟ نوعه سجل .. سجل ماذا ؟ سجل جدول الموظفين .. emp
طبعا في هذا السطر الرابع ... سوف تكون ناتج الاستعلام :
Select * from scott.emp where scott.emp.empno=7654 ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- -------- ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
لاحظ للمرة المليونين ونصف المليون .... اننا حتى الان ... نجد ان الناتج سجل واحد ...
طيب ... ماذا يعني في السطر الرابع ذلك الامر ؟
سوف يقوم بوضع القيمة التي في العمود
empno الذي في الجدول emp ... فين ؟ في المتغير r_emp.empno ...
أي بمعنى اخر ... سيضع 7654 في المتغير
r_emp.empno
ثم يضع
MARTIN في المتغير r_emp.ename ....
وهكذا ...
ارجو ان يكون ذلك واضح ..
السطور من السطر الخامس الى السطر 12 ..... مخرجات ...
لاحظ كيف استخدمنا المتغير الجميل
r_emp والذي نوعه سجل !!
ياسلام على هالنوع الجديد ...
استخدمنا في السابق متغيرات من نوع اعمدة ..
الان متغيرات من نوع سجلات !!
والله مرونة عالية , واختصار للوقت والجهد ...
طبعا اذا بتستخدم عدد قليل من الاعمدة .. لا تستخدم سجل كامل .. استخدم متغيرات من نوع الاعمدة التي تريدها , حتى لا تحجز من الذاكرة ... اكثر من حاجتك , انظر الى مثال يقتصد في
كود:
declare
r_emp scott.emp%rowtype;
begin
select scott.emp.ename , scott.emp.empno into r_emp.ename ,r_emp.empno
from scott.emp where scott.emp.empno=7654;
dbms_output.put_line('the name:'||r_emp.ename);
dbms_output.put_line('the number:'||r_emp.empno);
end;
/
تتبع البرنامج ... تدرب ان تقرأ برامج وتتبعها , وتحاول فهمها ...
اعرف ان هذا ممل ... لكن ... تحمل
اريدك ان تستنتج ماذا يعمل هذا البرنامج وما فائدته , فهو سهل جدا
... لا تطبقه في الحاسب الا بعد ان تفكر فيه .
هيا .. حاول ان تكتسب مهارة التتبع الجيد واستنتاج فوائد البرامج ....
الان اريدك ان تذكر شيء ... وهو
data type ... أي انواع البيانات ..
مثل varchar و char و number و X%type و date و X%rowtype
هذه تسمى ماذا ؟ تسمى انواع البيانات
data type ....
سوف نرجع لها قريبا ... فلا تنسى ...
مشاكل جمل
الاستعلام مع لغة PLSQL
مشكلتين ...
ارجاع اكثر من سجل ...
او ارجاع صفر سجل ...
انظر الى المثال التالي :
كود:
declare
v_name scott.emp.ename%type;
begin
select ename into v_name from scott.emp;
dbms_output.put_line(v_name);
end;
/
شوف النتيجة الي تفشل :
كود:
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4
اقرأ الخطأ .... (وهو خطأ وقت التنفيذ
Runtime Error)
انظر اليه بتمعن ....
يقول ان جملة الاستعلام ترجع كم سجل ؟ كم صف ؟ اكثر من صف واحد .
.
اعيد واكرر للمرة الثلاث مليون وثلاثمئة وست واربعون ..... حتى الان امثلتنا لا ترجع الا صف واحد ..
طيب ... لما شفنا الان انها ترجع اكثر من صف اعتبرها خطأ ... بالله عليك وش نسوي ؟
الا يوجد طريقة لتساعدنا ؟
يوجد طريقة وتدعى بـالمؤشر ....
Cursor .... وهو الكابوس الاعظم في هذه اللغة , كل من ارادني ان اشرح له هذه اللغة .. كان يريدني ان اشرح له المؤشرات .... هي سهلة وصعبة في نفس الوقت
قريبا سنشرحه ...
الان مشكلة السجلات المتعددة حللناها ان شاء الله
وتبقى مشكلة عدم ارجاع أي سجل قائمة والتي تعتبر Runtime Error , وحتى اشعار اخر ...
المنطق (جمل
if الشرطية):
يوجد حل لمشكة عدم ارجاع أي سجل ... وهو حل متقدم .. يعني فيما بعد ...
يوجد حل اخر في رأسي اعتقد انه يصلح قليلا ... وسنحاول ان نوجده معا ....
ماهي هذه الجملة ؟
if الشرطية ؟؟
وما قصدي بالمنطق ؟
انا اخبرك ...
لو صار كذا وكذا اعمل كذا .... ولو ماصار كذا وكذا لا تعمل كذا بل اعمل كذا ....
احتمالات .... مسارات للاحداث ...
يا احمد ... لو اتى اخوك ... اذهب معه , واذا لم يأتي , اذهب لوحدك ..
ويا خالد اذا لم تكن مشغول ساعدني , واذا كنت مشغول فاذهب ....
اذا و اذا ... اذا لم ..
كلها هذه شروط .. اذا تحققت ... تصير بعض الامور ... واذا لم تتحقق تصير امور اخرى ..
هنا تكمن قوة البرمجة ... هنا يكمن المنطق الرقمي ... من هنا نستطيع عمل الذكاء الاصطناعي ..
من هنا نستطيع جعل البرامج ذكية .. ونجعلها نفكر تفكير سليم كما نفكر نحن ..
ندخل على الامثلة وبسرعة .... ونرى ما يمكننا فعله حيال هذه اللغة ....
برنامج يخبرنا اذا كان المتغير v يساوي عشرة ... سيقول "هذا المتغير يساوي عشرة" :
كود:
declare
v number :=10 ;
begin
if v=10 then
dbms_output.put_line('it is 10');
end if;
end;
/
انظر الى المخرجات :
طيب طيب ...
السطر الثاني عرفنا متغير وقيمته 10 .....
في السطر الرابع قلنا "اذا
v يساوي عشرة .... فانه " (معنى if أي "اذا" )
في السطر الخامس سوف يخرج الرسالة it is 10
في السطر السادس نهاية الشرط .....
ما معنى هذا الكلام ؟
لاحظ انه في السطر الرابع ... عملية اليساوي ... وليست اسناد !!
فرق بينهما !! = يعني مساواه ... =: ... يعني اسناد ووضع قيمة ....
الان في السطر الرابع سوف يتأكد هل ما بداخل
v يساوي 10 او لا ...
سؤال .. ما بداخل المتغير v ؟؟ عشرة ..
طيب ... يقول اذا تحقق الشرط .. ما معنى اذا تحقق شرط ؟ واي شرط يتحدث عنه ؟
الشرط هو كما قلنا v=10 .. اذا نعم ... نفذ الأوامر من بعد سطر الشرط ... الى end if ....
اذا لم يتحقق أين يذهب ؟ في هذه الحالة ... سوف يذهب الى
end if .... على طول ....
بعدها ينتهي البرنامج ...
انا اريد ان اضع قيمة اخرى .... دعنا نرى ذلك ....
كود:
declare
v number :=9;
begin
if v=10 then
dbms_output.put_line('it is 10');
end if;
end;
/
النتيجة .... لم يعرض شيء !!
لماذا لم يعرض شيء ؟
انظر الى البرنامج مرة ثانية ...
يقول اذا
v=10 اطبع it is 10 ....
اذا لم يساوي
v العشرة .... انتهى الشرط ... خلاص ...(لاحظ then هي كلمة زائدة ولكنها مهمة ... ومعناها "فإنه ")
هل انتهينا الى هذا الحد ؟ الا يوجد تعقيدات ؟
اريد ان يرى ... اذا كان عشرة .. يطبع لي 10 ... اذا كان تسعة .. يطبع لي 9
كود:
declare
v number :=9;
begin
if v=10 then
dbms_output.put_line('it is 10');
end if ;
if v=9 then
dbms_output.put_line('it is 9');
end if ;
end;
/
السطر الرابع .. اذا كان عشرة ... طبق السطور حتى اول
end if تجده ...
طبعا ينفذ الامر الذي في السطر الخامس ... (عرض انه 10) ,,, في السطر السادس انتهى الشرط ...
في السطر السابع .. يقول اذا v=9 نفذ السطر الثامن .... (عرض انه 9) ....
في السطر التاسع انتهى الشرط ...
الان .. عرفت معناها ولم تفهم متى وكيف واين نستخدمها ....
انظر الى المثال ... نفسه ولكن يجعلك انت تدخل القيمة .. هل تذكر ادخال القيم ؟؟؟
كود:
declare
v number :=&Enter_Any_Number ;
begin
if v=10 then
dbms_output.put_line('it is 10');
end if ;
if v=9 then
dbms_output.put_line('it is 9');
end if ;
end;
/
جعلنا المتغير يساوي مدخل من عندنا ...
ماذا يعني مدخل من عندنا ؟ يعني نحن ندخل رقم وسوف يتخزن في هذا المتغير .. اعتقد تكلمنا فيها كثيرا ...
وطبعا علامة المدخل ... هي
& .........
سوف يسألك ... ويطلب منك ادخال قيمة :
كود:
Enter value for enter_any_number: 10
it is 10
انا ادخلت 10 ....
قال لي
it is 10
لو ادخلنا 9 ... سيقول لنا
it is 9
طيب لو ادخلنا 8 ؟؟؟ لن يقول شيء ..... فكر فيها ..
ولكن لاحظ ان لكل شرط .. تقفيلة خاصة ... أي
end if ....