اذهب إلى المحتوى
miash80

دروس Pl/sql من الألف الى الياء

Recommended Posts

miash80

اخواني واخواتي مشرفين وأعضاء السلام عليكم ورحمة الله وبركاته



وانا اسف للأنقطاع عن المنتدى مدة طويلة بسبب ظروف الحياة .

وشكر خاص لكل من سئل عني

والله يسعدكم جميعا


اليوم والحمدلله بدءت بكتابة بعض الدروس التي تشمل قسم PL/SQL

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

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

اطلب من اي عضو او مشترك طرح اي سؤال اول باول في اي درس سيتم طرحه

مع رجاء خاص ان تكون الاسئلة طمن الدرس لكي لا يتشتت تفكير اي مشترك.


وبسم الله بندء .....

مقدمة صغيرة

لغة PL/SQL تعتبر لغة البرمجة الخاصة بنظام اوراكل وهي اداة برمجية قوية جدا

وكلمة PL/SQL اختصاراً لـ (Procedure Language/Structure Query Language )

وتستخدم هذه اللغة لتجهيز نظام Oracle عن طريقة معالجة التسجيلات

وتستخدم أيضاً في أدوات التطوير المنتجة من قبل شركة Oracle

وهي تعتبر أساس برنامج بناء النماذج Oracle Forms و Oracle Reports

وتستخدم هذه اللغة أيضاً لتعريف نموذج ما

، والقيام ببعض الحسابات الخاصة في تقرير ما ، ومن أجل التسجيلات




الدرس الاول في ال Pl/Sql هو كتابة البرنامج البسيط وشرح مكونات البرنامج بالتفصيل

Declare  (Optional)  هذا الجزء اختياري بس اذا كان هنالك متغيرات يكون أجباري

Variables   Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها 

begin (Mandatory)  بداية البرنامج وهذا الجزء أجباري
Eexcutable Section	هنا يكتب كود البرمجة الخاص بالبرنامج 
Pl/Sql Code
Exception (Optional)هذا الجزء خاص بمعالجة أخطاء البرنامج وهو أختياري ولكن انا بنظري هذا الجزء يجب ان يكون اجباري
Error Hanling Section
Error Type انواع الاخطاء  
1) Syntax Error (Compilaion)
2)Run Time (Logical Error)
end;  (Mandatory)  نهاية البرنامج وهذا الجزء أجباري




قبل البدء في اعطاء امثلة يجب التذكير بانواع البيانات   (Data Types)

  Varibale				  Data Type

1) V1					  Number عدد صحيح
2) V2					  Number(,) عدد حقيقي
3) V3					  Varchar2( ) متغير نصي
4) V4					  Boolean المتغير المنطقي ويأخذ خيارين
						   a)True
						   b)False
5) V5					 Table-Name.Column-Name%Type;  يأخذ نفس مواصفات حقل معين في احد الجداول
  Example  :  V5   Emp.Empno%type;	Emp  في جدول الـــEmpno  أخذت نفس نوع الحقل V5 
6) V6					 Table-name%Rowtype;  يأخذ نفس مواصفات جدول معين ونتعامل مع هذا المتغير كما نتعامل مع جدول
Example  :  V6  Emp%rowtype;
				 ويستخدم بهذه الطريقة 
				V6.Empno  Or V6.Ename Or V6.sal ....Ext
7) V7			Cursor	وهذا المتغير له درس مستقل في الدروس القادمة أنشاء الله
8) V8			Cursor-Name%Rowtype;	أنشاء الله Cursor وهذا تابع في درس ال




كما احب ان اذكربــــ  جمــــــل If Statment  وأنواعها


1)If Condition then
  Code .....;
  end If;

2)If Condition then
  Code .....;
elsif
Code....;
  end If;

3)If Condition then
Code .....;
elsif
Code....;
elsif
Code....;
else
Code...;
end If;

4)If Condition1 then
Code .....;
		  If Condition2 then
		  Code....;
									  If Condition3 then
									  Code....;
End If;	---Condition3 
End If;	---Condition2
End If;	---Condition1




هنا سنشرح الحلقات او حلقة التكرار وانواعها

طبعا يجب وضع شرط للخروج من الحلقة

1)  For Loop
Example1 : اريد ان اطبع من رقم واحد الى رقم عشرة

For i in  1..10 loop	طبعا اجباري من الصغير للكبير دائما
end loop;

 Example2 :	اريد ان اطبع من رقم واحد الى رقم عشرة بالعكس
For i in  reverse 1..10 loop	أنتبه اجباري من الصغير للكبير دائما
end loop;

2) While Loop

  While Condition Loop		 يجب وضع شرط لايقاف الحلقة
 Code  .....;
 end Loop;

Example :اريد طباعة الراتب لغاية ما يصير الراتب يساوي 1000 دينار
 While sal = 1000 loop
Code .....;
sal:=sa+10;
end loop;

3)loop

Loop 
 Code ....;
 Exit When Condition;
end loop;
Example  : أريد ان يعمل اضافة على الراتب لغاية ما يصير الراتب اقل أو يساوي500 دينار
Loop
Code ....;
Exit When sal <= 500;
end loop;



أتمنى ان اكون اوصلت معلومة بشكل صحيح ومناسب

فإن أصبت فمن الله وإن أخطأت فمن الشيطان ،،

إن شاء الله في المرة القادمة بعد الأخذ برأيكم وأسئلتكم

سأبدء بكتابة الامثلة إن شاء الله

أدعو لي بالتوفيق

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

السلام عليكم ورحمة الله وبركاته

اخواني واخواتي الاعزاء

لا ادري الموضوع من ثلاث ايام و71 قراءة ولا رد واحد

لا ادري هل اكمل الدروس اما لا .....

  • أعجبني 3

شارك هذه المشاركة


رابط المشاركة
شارك
Amgad

السلام عليكم ورحمة الله

الأخ / miash80

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

استمر وستجد الكثير من الأعضاء... يتابعون شرحك

جزاك الله خيرا

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
المحب لله

السلام عليكم ورحمة الله وبركاته
توكل على الله
اكمل بقيت الشرح
اسلوب رائع فى الشرح ومبسط
على بركة الله
والله المستعان

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

وعليكم السلام ورحمة الله وبركاته



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

انا أسف للأنقطاع عن المنتدى بسبب مشاغل الحياة

ولكن ان شاء الله سأستمر في التواجد في المنتدى

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
السلام عليكم ورحمة الله وبركاته
توكل على الله
اكمل بقيت الشرح
اسلوب رائع فى الشرح ومبسط
على بركة الله
والله المستعان


وعليكم السلام ورحمة الله وبركاته

اهلا بأخي الفاضل المحب لله

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

تم تعديل بواسطة miash80
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

اليوم سنبدء ببعض الامثلة البسيطة .

ولكن قبل ذلك يجب معرفة بعض الامور بالنسبة للغة الــــــPL/SQL

1) يجب قبل كتابة اي برنامج في هذه اللغة كتابة هذه الجملة set serveroutput on

لكي تظهر نتيجة اي برناج على الشاشة وبدون هذه الجملة لن تظهر اي نتيجة على الشاشة

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

طبعا تكتب هذه الجملة مرة واحدة في كل مرة نفتح فيها شاشة ال Oracle SQL*Plus

2) يجب ان ينهتي أي امر في هذه اللغة بـــ ; و بعد كل تعريف موجود في البرنامج تنتهي بــــ ;

3) لأدخال اي قيمة في البرنامج يوضع & بعد كتابة المتغير مع اشارة :=

على سبيل المثال عندي متغير واسمه x واريد ان ادخل قيمة x اكتب التالي x:=&x

طبعا بعد & ممكن اكتب اي شي انا اريده يعني ممكن ان اكتب x:=&sal;

4) dbms_output.put_line(' '); هذه الجملة لاخراج النتائج على الشاشة

5) لاعادة تنفيذ البرنامج نكتب / ثم Enter

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

نبدء في اول مثال .

اريد كتابة برنامج يقسم رقمين ويعطيني الناتج ((( برنامج سهل جداااا)))



 SQL> set serveroutput on
SQL>  declare
 2   a number;
 3   b number;
 4   c number;
 5   begin
 6   a:=&a;
 7   b:=&b;
 8   c:=a/b;
 9   dbms_output.put_line('Result Is  '||c);
10  end;
11  /
Enter value for a: 49
old   6:  a:=&a;
new   6:  a:=49;
Enter value for b: 7
old   7:  b:=&b;
new   7:  b:=7;
Result Is  7

PL/SQL procedure successfully completed.




الحمدلله البرناج يعمل صحيح ولكن انا لا اريد ان تظهر كلمة old وكلمة new في كل مرة

الموضوع مزعج لذلك اقوم بكتابة هذا الامر لتخلص من وجود هذه الكلمات وهو SQL> set verify off

طبعا بكتب هذا الامر في اي مكان ولكن يستحسن ان يكتب بعد الامر SQL> set serveroutput on

وهذه هي النتيجة

SQL> set verify off

SQL> /
Enter value for a: 49
Enter value for b: 7
Result Is  7

PL/SQL procedure successfully completed.




طيب في حالة اني قسمت على الرقم صفر ما هي النتيجة ...؟

SQL> /
Enter value for a: 15
Enter value for b: 0
declare
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 8



عند القسمة على صفر طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي

SQL>  declare
 2   a number;
 3   b number;
 4   c number;
 5   begin
 6   a:=&a;
 7   b:=&b;
 8   c:=a/b;
 9   dbms_output.put_line('Result Is  '||c);
10   exception
11   when zero_divide then
12	dbms_output.put_line('You Can Not Divide By Zero   ..');
13  end;
14  /
Enter value for a: 15
Enter value for b: 0
You Can Not Divide By Zero   ..

PL/SQL procedure successfully completed.



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

طيب في حالة غلط المستخدم وادخل بدل الرقم حرف ماذا يحصل ...؟

SQL> /
Enter value for a: 15
Enter value for b: 'm'
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 7



عند أستخدام حرف بدل رقم طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي

SQL> ed
 1   declare
 2   a number;
 3   b number;
 4   c number;
 5   begin
 6   a:=&a;
 7   b:=&b;
 8   c:=a/b;
 9   dbms_output.put_line('Result Is  '||c);
10   exception
11   when zero_divide then
12	dbms_output.put_line('You Can Not Divide By Zero   ..');
13	when value_error then
14*  dbms_output.put_line('Pleas Enter Number   ..');
15  end;
16  /
Enter value for a: 15
Enter value for b: 'm'
Please Enter Number   ...

PL/SQL procedure successfully completed.



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

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

طبعا يوجد انواع اخرى من الـــError وحلولها وإن شاء الله في الدروس القادمة سنوضحها .

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

اتمنى ان يكون اسلوبي سهل وسلس.

  • أعجبني 3

شارك هذه المشاركة


رابط المشاركة
شارك
Ahmed_diab1983

اخى العزيز انا افضل لو هتنزل كتاب لتعليم PL/SQL من الالف للياء

يفضل يكون كتاب فى صورة doc او pdf ولا اية رأيكم ياخونا

وممكن تضع علية اسمك وتجعله للقراءة فقط للحفاظ على حقوق الناشر

وعندها تكون قمت بعمل عمل يحتذى به

وبالتوفيق ان شاء الله

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
اخى العزيز انا افضل لو هتنزل كتاب لتعليم PL/SQL من الالف للياء

يفضل يكون كتاب فى صورة doc او pdf ولا اية رأيكم ياخونا

وممكن تضع علية اسمك وتجعله للقراءة فقط للحفاظ على حقوق الناشر

وعندها تكون قمت بعمل عمل يحتذى به

وبالتوفيق ان شاء الله


اهلا وسهلا بأخي الفاضل احمد

اقتراحك على العين والراس

أخي العزيز بأمكانك عمل بحث على الانترنت وسترى الالف من الملفات التعليمة

من الالف الى الياء بأمكانك تنزيلها والاستفادة منها

اخي العزيز انا فكرتي تكمن في وضع درس درس والتطرق لكل كبيرة وصغيرة في كل درس

بأسلوب بسيط جداااا

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

أخي العزيز فكرة انا اضع اسم على كتاب غير واردة ابدا هذه الدروس لوجه الله تعالى

بل اتمنى اذا كان هذا الكتاب في النهاية يستحق النشر ان يقوم اي واحد بنقله ونشره

فإن شاء الله تكون صدقة جارية لكل واحد يعمل على نقله أو نشره .

اتمنى ان تفهم فكرتي
  • أعجبني 2

شارك هذه المشاركة


رابط المشاركة
شارك
@nana@

جزااااااااااااااك الله خيرااااااااااااااااااااااااااااا

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
جزااااااااااااااك الله خيرااااااااااااااااااااااااااااا


الله يبارك فيك اختي الفاضلة

ومشكورة على مرورك
:) :P ;)
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

السلام عليكم ورحمة الله وبركاته

اليوم عنا مثال جديد ...

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

بسم الله نبدء

SQL> set serveroutput on
SQL> set verify off
SQL> declare
 2   v_ename emp.ename%type;
 3   v_sal   emp.sal%type;
 4   begin
 5   select ename,sal
 6   into v_ename,v_sal
 7   from emp
 8   where empno=&empno;
 9   dbms_output.put_line('Name '||v_ename||' Salary '||v_sal);
10   end;
11  /

Enter value for empno: 7900
Name JAMES Salary 950

PL/SQL procedure successfully completed.



الحمدلله البرنامج شغال صح الصح

طيب لو على فرض المستخدم العادي قام بادخال رقم خطأ ماذا يحصل لنرى

SQL> /
Enter value for empno: 7903
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 5




طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي

SQL> ed
Wrote file afiedt.buf

 1  declare
 2		v_ename emp.ename%type;
 3		v_sal   emp.sal%type;
 4		begin
 5		select ename,sal
 6		into v_ename,v_sal
 7		from emp
 8		where empno=&empno;
 9		dbms_output.put_line('Name '||v_ename||' Salary '||v_sal);
10		exception
11		when no_data_found then
12		dbms_output.put_line('Employee Number Is Wrong Please Enter Correctt Number ...');
13*	   end;
14  /
Enter value for empno: 7966
Employee Number Is Wrong Please Enter Coreect Number ...



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

الموضوع بسيط نعدل شوية في الكود ....

SQL> ed
Wrote file afiedt.buf

 1  declare
 2		v_ename emp.ename%type;
 3		v_sal   emp.sal%type;
 4		begin
 5		select ename,sal
 6		into v_ename,v_sal
 7		from emp
 8		where deptno=&deptno;
 9		dbms_output.put_line('Name '||v_ename||' Salary '||v_sal);
10*	   end;
SQL> /
Enter value for deptno: 10
declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 5



طلع لنا Error والمستخدم العادي لا يعرف لماذا هناك خطأ ولمعالجة هذا الموضوع نستخدم الــــ Exception كالتالي

SQL> ed
Wrote file afiedt.buf

 1  declare
 2		v_ename emp.ename%type;
 3		v_sal   emp.sal%type;
 4		begin
 5		select ename,sal
 6		into v_ename,v_sal
 7		from emp
 8		where deptno=&deptno;
 9		dbms_output.put_line('Name '||v_ename||' Salary '||v_sal);
10		exception
11		when too_many_rows then
12		dbms_output.put_line('Resulat Too Many Rows ....');
13*	   end;
SQL> /
Enter value for deptno: 10
Result Too Many Rows ....

PL/SQL procedure successfully completed.



طيب احنا حلينا مشكلة الـــError بس فعليا احنا ما حلنا المشكلة الاصلية وهي اريد ان ارجع اكثر من صف او سطر

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

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

والمتغير هذا هو الــــــ Cursor وهو موضوع بسيط جداااا جدااااا

سأبدء فيه أنشاء الله الدرس القادم اذا لم يكن هنالك اسئلة على ما سبق .

  • أعجبني 2

شارك هذه المشاركة


رابط المشاركة
شارك
Amgad

السلام عليكم ورحمة الله

جهد متميز ,,, شكرا لك ... مرة اخرى

عودة قوية

بارك الله فيك
وجزاك خيرا

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
جزاك الله خيرا



الله يبارك فيكي اختي الفاضلة سارة

مشكورة على مرورك الطيب
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
السلام عليكم ورحمة الله

جهد متميز ,,, شكرا لك ... مرة اخرى

عودة قوية

بارك الله فيك
وجزاك خيرا


وعليكم السلام ورحمة الله وبركاته

شكر وعرفان للأستاذ الكبير أمجد للتثبيت الموضوع

الله يبارك فيك أستاذنا الفاضل

اتمنى ان اكون عند حسن ظنك أستاذي الفاضل

وأرجوا منك أستاذ أمجد متابعة الدروس للتصحيحي ان أخطأت

جلّ من لا يسهو

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

اليوم أنشاء الله سنشرح الــــــ Cursor

الــــــــ Cursor هو عبارة عن جملة Select نستطيع من خلالها نرجع اكثر من صف او سطر

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

كيف نكتب الــــــ Cursor ....؟

الموضوع بسيط جدااااااااااا كالتالي

بسم الله نبدء


Cursor Cursor-Name  is	Cursor  اجياري ان تكتب بعد أسم الــ is طبعا	Cursor  هنا عرفنا الـــ 
select columns name		Cursor هنا حددنا الحقول التي اريدها ان تظهر من خلال الـــ 
From Table-Name;			Cursor تحديد أسم الجدول صاحب الحقول التي ستظهر من خلال الــ 
Open Cursor-Name;		  Cursor	هنا قمنا بفتح الــ 
Fetch Cursor-Name		   بسحب البيانات صف صف Cursor هنا يقوم الــ 
Into Variables Name;		 بوضع البيانات التي سحبها في المتغيرات صف صف Cursor هنا يقوم الــ
Close Cursor-Name;		 Cursor  هنا قمنا بأغلاق الـــــ




طبعا الــــــــــــــــ Cursor يعرف كأي متغير في مرحلة Declaration

في الدرس السابق كان السؤال أريد ان اكتب برنامج اعطيه رقم القسم ويعطيني اسماء ورواتب الموظفين في هذا القسم

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

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

والحل كما يلي .

SQL>Set serveroutput on
SQL>Set verify off
SQL> declare
 2   cursor cur_emp  is select ename,sal
 3   from emp
 4   where deptno=&deptno;
 5   v_ename varchar2(50);
 6   v_sal   number;
 7   begin
 8   open cur_emp;
 9   fetch cur_emp
10   into v_ename,v_sal;
11   close cur_emp;
12   dbms_output.put_line('Name  '||v_ename||'   Salary  '||v_sal);
13*  end;
14  /
Enter value for deptno: 10
Name  CLARK salary  2450

PL/SQL procedure successfully completed.



الحمدلله البرنامج شغال صح الصح

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

المشكلة ليست بالـــــCursor لانه قام بوظيفته على اكمل وجه

لانه قام بسحب اول صف من الجدول وقام بعرضه

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

اذا عرفنا وين المشكلة نريد امر يجبر الــــ Cursor الانتقال لصف التالي

هل تعرفون ما هو هذا الامر ....!!!

أنه بسيط جداااا نحن بحاجة للحلقة يبقى الـــ Cursor يعمل فيها لنهاية أخر سطر

ومن الشرح السابق للحلقات الحلقة المناسبة لهذه الحالة هي الـــــ Loop

سنقوم بالتعديل على الكود وأستخدام حلقة الـــ Loop

SQL> ed
Wrote file afiedt.buf

 1  declare
 2   cursor cur_emp is select ename,sal
 3   from emp
 4   where deptno=&deptno;
 5   v_ename varchar2(50);
 6   v_sal   number;
 7   begin
 8   open cur_emp;
 9   loop
10   fetch cur_emp
11   into v_ename,v_sal;
12   exit when cur_emp%notfound;
13   dbms_output.put_line('Name  '||v_ename||' salary  '||v_sal);
14   end loop;
15   close cur_emp;
16*  end;
SQL> /
Enter value for deptno: 10
Name  CLARK salary  2450
Name  KING salary  5000
Name  MILLER salary  1300

PL/SQL procedure successfully completed.



الحمدلله البرنامج شغال صح الصح

طيب لو على فرضنا اريد اكثر من حقل رقم واسم وراتب وتاريخ ميلاد الموظف

او حتى على فرض اريد جميع الحقول الخاصة بالموظف

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

حل هذه المشكلة بسيط جداااااااااا

أستخدم متغير يأخذ جميع مواصفات الحقول الموجودة داخل الـــ Cursor

ويستطيع التعامل مع جميع البيانات الموجودة داخل الــ Cursor

واعرف هذا المتغير داخل الـــDeclaration واحدد نوع البيانات فيه بأسم الـــCursor

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

SQL> ed
Wrote file afiedt.buf

 1  declare
 2   cursor cur_emp is select ename,sal
 3   from emp
 4   where deptno=&deptno;
 5   v_cur  cur_emp%rowtype;
 6   begin
 7   open cur_emp;
 8   loop
 9   fetch cur_emp
10   into v_cur;
11   exit when cur_emp%notfound;
12   dbms_output.put_line('Name  '||v_cur.ename||' salary  '||v_cur.sal);
13   end loop;
14   close cur_emp;
15*  end;
SQL> /
Enter value for deptno: 10
Name  CLARK salary  2450
Name  KING salary  5000
Name  MILLER salary  1300

PL/SQL procedure successfully completed.






مثال اخر اريد ان اكتب برنامج اعطيه رقم القسم ويعطيني اسماء ورواتب الموظفين مع اسماء الوظائف في هذا القسم

سنقوم بتعديل على الكود كالتالي .

SQL> ed
Wrote file afiedt.buf

 1  declare
 2   cursor cur_emp is select *	  هنا اخبرته اريد جميع الحقول
 3   from emp
 4   where deptno=&deptno;
 5   v_cur cur_emp%rowtype;
 6   begin
 7   open cur_emp;
 8   loop
 9   fetch cur_emp
10   into v_cur;
11   exit when cur_emp%notfound;
12   dbms_output.put_line('Name  '||v_cur.ename||' salary  '||v_cur.sal||'  Job  '||v_cur.job);  هنا طلبت منه فقط اسم وراتب الموظف مع اسم وظيفته
13   end loop;
14   close cur_emp;
15*  end;
SQL> /
Enter value for deptno: 10
Name  CLARK salary  2450  Job  MANAGER
Name  KING salary  5000  Job  PRESIDENT
Name  MILLER salary  1300  Job  CLERK

PL/SQL procedure successfully completed.




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

الحمدلله البرنامج شغال صح الصح

بس عندي مشكلة ومشكلة كبيرة

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

الامر متعب ومزعج جدااااااااا وخصوصا اذا كان عندي جداول كبيرة

كيف احل هذه المشكلة الكبيرة .........؟

الحل سهل وبسيط جدااااااااااا.

اكتب برنامج بس من نوع تاني

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

ويرجع لي قيمة معينة ويقوم بأكثر من عملية في البرنامج الواحد

وأستطيع استدعائه في اي وقت انا بحاجته واقوم بتنفيذه

هذا البرنامج الجديد صاحب هذه المواصفات العالية هو الــــــــــــــــــ Procedure

وسنقوم بشرحه في الدرس القادم أنشاء الله .

تم تعديل بواسطة miash80
  • أعجبني 2

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

السلام عليكم ورحمة الله وبركاته



أسف اخواني عن الانقطاع عن تكملة اعطاء الدروس

غدا إن شاء الله سأبدء في شرح Procedure




;) :angry: :angry:

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
deamon

الأخ الفاضل miash80 أششكرك كثيرا على هذا المجهود الرائع وأتمن منك المتابعة بسرعة طبعا أنا عضو جديد وأيضا جديد على pl/sql وعندي بعض الأسئلة لكن أرحو الآن أن تكمل ال procedure.

شارك هذه المشاركة


رابط المشاركة
شارك
deamon

السلام عليكم ورحمة الله وبركاته



أسف اخواني عن الانقطاع عن تكملة اعطاء الدروس

غدا إن شاء الله سأبدء في شرح Procedure




:D ;) ;)



شكرا لك الأخ الفاضل miash80 لكن متى بالضبط أرجو ان تستجيب

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
الأخ الفاضل miash80 أششكرك كثيرا على هذا المجهود الرائع وأتمن منك المتابعة بسرعة طبعا أنا عضو جديد وأيضا جديد على pl/sql وعندي بعض الأسئلة لكن أرحو الآن أن تكمل ال procedure.



اهلا وسهلا بك أخي العزيز وانا اسف على التأخير

وبالتوفيق أخي العزيز
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
miash80

اليوم إن شاء الله سأبدء في شرح Procedure

بسم الله نبدء


Create [Or Replace] Procedure Procedure-Name   هنا نقوم بأنشاء الاجراء  
(P1 in Number,P2 out Varchar2,P3 in out date....) هنا نقوم بتعريف البراميتر  
Is   كلمة اجبارية  
Variables   Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها   

Begin   (Mandatory)  بداية الاجراء  وهذا الجزء أجباري

Eexcutable Section	هنا يكتب كود البرمجة الخاص بالبرنامج 
Pl/Sql Code

.
.
.
[Exception]  (Optional)هذا الجزء خاص بمعالجة أخطاء الاجراء وهو أختياري	 
.
.
.
End [Procedure-Name];  (Mandatory)  نهاية البرنامج وهذا الجزء أجباري





الكلمات بين [ ] اختيارية الكتابة

[Or Replace] تكتب لكي نستطيع التعديل على الاجراء في المستقبل وبدونها لا نستطيع التعديل على الاجراء

[Procedure-Name] كتابة اسم الاجراء عند نهاية الاجراء اختيارية



P1,P2,P3 هذه عبارة عن براميتر نمررها عبر الاجراء وهي عبارة عن ثلاث انواع كما يلي



Prameter Type:

Name	   Mode	  data Type
P1			 In		   Number,Varchar2,Date ....Ext
P2			 Out		 Number,Varchar2,Date ....Ext
P3			 In Out   Number,Varchar2,Date ....Ext





البراميتر من In يقوم هذا البراميتر بأدخال قيمة للـــ Procedure

البرامتير من Out يقوم هذا البراميتربالاحتفاظ بقيمة معينة من ال Procedure وأخراجها

البراميتر من In Out يقوم هذا البراميتر بأدخال قيمة معينة على الــ Procedure ويقوم الــ Procedure بتنفيذ الاوامر الموجودة

داخله وأخراج قيمة جديدة للبراميتر الذي قمنا بأدخاله


بعض الملاحظات على البراميتر

طبعا من المهم جداااا عدم تحديد حجم انواع البيانات في البراميتر يحدد فقط نوع البيانات

اذا ما حددنا نوع Mode ياخذ نوع الــ MOde مباشرة In

لا نستطيع عمل لي تعديل على البراميتر من نوع In داخل الـــ Procedure

ونستطيع التعديل على البراميتر من نوع الـــ out ومن نوع In Out

عند أخراج قيمة مباشرة من الـــ Procedure على الشاشة ليس بحاجة للبراميتر

من نوع Out فأمر الطباعة يكفي في هذه الحالة


سنبدء في مثال صغير للكتابة الــــــــــProcedure

اريد ان اكتب Procedure يقوم بوظيفة Print

بدل من كتابة dbms_output.put_line();

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

بسم الله نبدء


SQL> set serveroutput on
SQL> set verify off
SQL> create or replace procedure print(p_text in varchar2)
 2  is
 3  begin
 4  dbms_output.put_line(p_text);
 5* end;
SQL> /

Procedure created.





وهنالك نوعين من الاستدعاء

طريقة Pl/Sql

begin
print(' ');
end;




طريقة Sql

execute print(' ');



طبعا نستخدم طريقة الــSql فقط في حالة اذا كان البراميتر من نوع In


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


اريد ان اكتب Procedure اعطيه رقم القسم يعطيني أيم الموظف مع راتبه .

SQL>  create or replace procedure get_info(p_deptno in number)
 2  is
 3  cursor cur_emp is
 4  select *
 5  from emp
 6  where deptno=p_deptno;
 7  v_cur cur_emp%rowtype;
 8  begin
 9  open cur_emp;
10  loop
11  fetch cur_emp
12  into v_cur;
13  exit when cur_emp%notfound;
14  print('Name '||v_cur.ename||'  Salary '||v_cur.sal);
15  end loop;
16  close cur_emp;
17* end;
SQL> /

Procedure created.



طريقة أستدعاء Procedure فيه براميتر من نوع In .

SQL> begin
 2  get_info(&p_deptno);
 3  end;
 4  /

Enter value for p_deptno: 10
Name CLARK  Salary 2450
Name KING  Salary 5000
Name MILLER  Salary 1300

PL/SQL procedure successfully completed.




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


اريد ان اكتب Procedure اعطيه رقم الموظف ويعطيني اسم الموظف مع أسم قسمه واريد ان احتفظ بأسم الموظف مع اسم القسم في متغير

SQL> create or replace procedure get_name(p_empno in number,p_ename out varchar2,p_dname out varchar
2)
 2  is
 3  cursor cur_emp is
 4  select ename,dname
 5  from emp e ,dept d
 6  where e.deptno=d.deptno
 7  and   e.empno=p_empno;
 8  begin
 9  open cur_emp;
10  fetch cur_emp
11  into p_ename,p_dname;
12  if cur_emp%notfound then
13  p_ename:='No Name';
14  p_dname:='No Dname';
15  end if;
16  close cur_emp;
17  end;
18  /

Procedure created.



طريقة أستدعاء Procedure فيه براميتر من نوع Out .

يجب يجب يجب ان نعرف لكل براميتر من نوع Out متغير نضع فيه قيمة البراميتر

SQL> declare
 2  v_ename varchar2(100);
 3  v_dname varchar2(100);
 4  begin
 5  get_cur(&p_empno,v_ename,v_dname);
 6  print('Name '||v_ename||' Dname '||v_dname);
 7  end;
 8  /
Enter value for p_empno: 7900


Name JAMES Dname SALES

PL/SQL procedure successfully completed.




مثال جديد اريد ان أستخدم فيه براميتر من نوع In Out

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

SQL> create or replace procedure phone(p_num in out varchar2)
 2  is 
 3  begin
 4  p_num:='('||substr(p_num,1,3)||').'||substr(p_num,4);
 5  end;
 6  /

Procedure created.



طريقة أستدعاء Procedure فيه براميتر من نوع In Out .

SQL> declare 
 2  v_num varchar2(100);
 3  begin
 4  v_num:=&v_num;
 5  print(v_num);
 6  end;
 7  /
Enter value for v_num: 796690462

(796).690462

PL/SQL procedure successfully completed.




مثال جديد اريد ان أستخدم فيه خاصية الاضافة


اريد ان اكتب Procedure يقوم باضافة أسم وموقع القسم في جدول الاقسام


QL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type)
 2  is
 3  v_deptno number;
 4  begin
 5  select max(deptno)
 6  into v_deptno
 7  from dept;
 8  v_deptno:=v_deptno+10;
 9  insert into dept
10  values(v_deptno,p_dname,p_loc);
11  commit;
12* end;
SQL> /

Procedure created.



طريقة الاستدعاء


SQL> begin
 2  insert_dept('Finance','Amman');
 3  end;
 4  /

PL/SQL procedure successfully completed.



ولتأكد من انه اضاف البيانات الجديدة

SQL> select *
 2  from dept;

  DEPTNO DNAME		  LOC
--------- -------------- -------------
   10 ACCOUNTING	 NEW YORK
   20 RESEARCH	   DALLAS
   30 SALES		  CHICAGO
   40 OPERATIONS	 BOSTON
   50 Finance			Amman




طيب في حالة اريد ان اضيف اسماء اقسام جديدة

وكلها موجودة في موقع واحد ولا اريد ان اكرر في كل مرة اسم الموقع

الموضوع بسيط جدا جدا جدا في الدرس القادم مع تكلمة الشرح لموضوع الـــ Procedure

تم تعديل بواسطة miash80
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
Amgad

السلام عليكم ورحمة الله

شرح مبسط وواضح .... شكرا لك على الجهد


ارجوا كتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ...

وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها

وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها


استمر ... وبارك الله فيك

شارك هذه المشاركة


رابط المشاركة
شارك
miash80
السلام عليكم ورحمة الله

شرح مبسط وواضح .... شكرا لك على الجهد


ارجوا كتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ...

وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها

وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها


استمر ... وبارك الله فيك


وعليكم السلام ورحمة الله وبركاته

الله يبارك فيك أستاذ أمجد

مشكور على المتابعة

أستاذ امجد انا لم أنهي درس الـــــــProcedure

في الدرس القادم أنشاء الله سأخذ بكل ما طلبت مني سواء

كتابة الاوامر التى تسترجع اسماء ال procedures التى سبق انشاؤها ...

وايضا كتابة امر الغاء ال procedures التى سبق انشاؤها

وايضا كتابة امر استرجاع محتويات الprocedure السابق انشاؤها

وأتمنى ان تتابع هذه الدروس للتقويمي اذا أخطأت

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

شارك هذه المشاركة


رابط المشاركة
شارك
@nana@

جزااااااااااااااااااااااااااك الله خيرااااااااااااااااااا


بجد شرح رائع

شارك هذه المشاركة


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

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من إضافة تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

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

سجل حساب جديد

تسجيل دخول

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

سجل دخولك الان

×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: إتفاقية الخصوصية