الانتقال إلى المحتوى

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


miash80

Recommended Posts

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


بجد شرح رائع


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



وأنشاء الله تستفيدي من هذه الدروس

رابط هذا التعليق
شارك

  • الردود 147
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

  • miash80

    71

  • masmas1001

    9

  • deamon

    8

  • hannona

    6

أخي في هذا الكود ليش عملت هيك عند مثال استخدامك للمتعير من نوع
OUT

5 from emp e ,dept d
6 where e.deptno=d.deptno
7 and e.empno=p_empno;


اخي أو أختي الكريمة ممكن توضح سؤالك اكثر

هل تقصد لماذا استخدمت براميتر من نوع Out ....؟

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

او تقصد شيئ ثاني ....

أرجو التوضيح




:D ;) ;)

رابط هذا التعليق
شارك

موضوع وشرح بسيط واكثر من رائع
ربنا يكرمك على المجهود دا وعلى اسلوبك

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

انا بشكرك جدا

رابط هذا التعليق
شارك

الموضوع بسيط جداااا أخي العزيز

اولا لنتذكر ما هو السؤال ...؟

السؤال كان ...

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

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

اريد اسم الموظف واريد اسم قسم الموظف وللأسف اسم الموظف

في جدول واسم قسمه في جدول اذا ما العمل .

الحل بسيط نأتي باسم الموظف من جدول الموظفين ونأتي بأسم قسمه

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

القسم اذا انا رقم القسم في جدول الاجسام هو عبارة عن primary key وفي

جدول الموظفين هو عبارة عن Foriegn key



select ename,dname	 هنا طلبنا اسم الموظف وأسم القسم
 from emp e ,dept d	هنا حددنا اسم الجدولين  وقمنا بوضع رمز بديل عن اسم الجدوال ونتعامل مع هذين الرمزين كما نتعامل مع الجدوال 
 where e.deptno=d.deptno هنا قمنا بعملية الربط بين الجدولين عن طريق رقم القسم
 and   e.empno=p_empno;هنا  وضعنا شرط رقم الموظف هو براميتر

رابط هذا التعليق
شارك

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

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

كود
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

بس لما وضعنا حرف كما في الاعلى طلع عندك error تاني غير اللي عندي وبالتالي لما اكتب انا exception برضوا مطلع عندي error
كالاتي

error at line 7:
ORA-06550 : line 7,line 6:
PLS-00201: identifier 'm' must be declare
ORA-06550: line 7, column 3:
PL\SQL: statment ignord




اعمل اية فيها يا باشا ؟؟؟؟

رابط هذا التعليق
شارك

باعتذر عن الخطأ البشع اللذي وقعت فية

علمت الحل لاني لم اضع الحرف في ' '

بعتذر وشكرا

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

رابط هذا التعليق
شارك

باعتذر عن الخطأ البشع اللذي وقعت فية

علمت الحل لاني لم اضع الحرف في ' '

بعتذر وشكرا

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



اهلا وسهلا بأخي العزيز masmas1001

ما في داعي للأسف كلنا نخطأ

وجلا من لا يسهو

أتمنى أخي العزيز ان تسفيد من هذه الدروس

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

رابط هذا التعليق
شارك

اشكرك يا اخي العزيز وجزاك الله خير على هذا الرد

عندي سؤال وانا احاول فهم موضوع parameter

انا مش فاهم معلش عملت لينا اية out
وثانيا لو احنا عملنا parameter out لازم في وقت invok procedure نعمل variable وانا بصراحة مش فاهمها بجد لو فية طريق افهم بيها جزاك الله خيرا

والجزء الثالث انا حاولت اعملها بالـ loop بدل من if وكتبتها والامر الاخر اذا استخدمت procedure print الذي تم عملة تماااام ولا اية

كالاتي

create or replace procedure get_name
(p_empno  in   number , p_ename   out   varchar2,  p_dname	out   varchar2)
is
cursor cur_emp
is 
select ename, dname
from emp e , dept  d
where e.deptno=d.deptno;
and e.empno= p_empno;
BEGIN
open cur_emp;
loop
fetch cur_emp
into p_ename, p_dname;
exit when cur_emp%notfound;
print (p_ename || 'NO E name' || p_dname || ' No D name'(;
end loop;
close cur_emp;
end;
/



هل هذه الطريق صحيحة هي لم تعطيني error وتمت بنجاح

وعند مرحلة الاستدعاء بالكود

declare 
v_ename   varchar2(100);
v_dname   varchar2(100);
begin
get_name (&p_empno, v_ename, v_dname);
print ('NAME : ' || v_ename || '   Dname : ' || v_dname);
end;
/



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

رابط هذا التعليق
شارك

يا أخي ممكن تشرح مثال الخاص بي المتغير
in out

وخاصة الجملة

p_num:='('||substr(p_num,1,3)||').'||substr(p_num,4);






اهلا بأخي العزيز Deamon

لنتذكر هذ السؤال مع بعض

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

لنحلل السؤال مع بعض ...

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

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

كما رأينا نريد ان نستخدم لنفس هذا الرقم براميترين واحد من نوع In والثاني من نوع Out

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

وهو البراميتر من نوع 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.





لنحلل هذا الجزء من الكود وهو عبارة عن الفورمات الذي نريده للعدد


p_num:='('||substr(p_num,1,3)||').'||substr(p_num,4);



اولا P_num هو رمز العدد

ثانيا Substr هو عبارة عن Function جاهزة من اوراكل

ووظيفتها عرض حروف معينه من الكلمه تبداء من ارقام محدده

( يعني مثل اقول اطبع لي الكلمه من حرف رقم1 الى الحرف رقم 5 )

مثال على ذلك :

اكتب استعلام يعرض لنا الحروف منالحرف رقم 3 الى الحرف رقم 7 ؟

الحل :

select substr(Ename,3,7)l



هنا يأتي بألاسماء بداية من حرف رقم 3 الى الحرف رقم 7

مثال ثاني للتوضيح

اكتب استعلام يعرض لنا الحروف من رقم 2 للنهاية



select substr(Ename,2)l



هنا يأتي بألاسماء بداية من حرف رقم 2 للنهاية بغض النظر عن طول الاسم


|| هذا الرمز اسمه concat ووظيفته جمع سلسلتين نصيتين في عمود واحد

مثال على ذلك :
اكتب استعلام يعرض عمود الاسماء وعمود الوظائف في عمود واحد؟
الحل :


Select Ename||sal
From Emp;






' ' هذا الرمز لاخراج الكتابة على الشاشة

مثال على ذلك :

اكتب استعلام يعرض عمود الاسماء وبجانبه كلمة Name Emplyee

الحل :



 
Select 'Name Emplyee'||ename
From Emp;




أتمنى ان اكون اوصلت الفكرة اخي العزيز





;) ;) :D

رابط هذا التعليق
شارك

اخي العزيز miash اتقوع في خطا ما في الكود الاستدعاء هذا لانة عند التجربة لا يخرج الفورمات المطلوبة
والاحظ انة لم يذكر اسم procedure الذي تم عملة phone فكيف سيتم اخراج النتيجة هذه من فضلك !!!!
==============================================================
طريقة أستدعاء 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.

====================================================
يخرج الرقم كما هو ولا تعديل علية ولا فورمة ؟؟؟؟

والف شكر على المجهود الرائع هذا

رابط هذا التعليق
شارك

اخي العزيز miash اتقوع في خطا ما في الكود الاستدعاء هذا لانة عند التجربة لا يخرج الفورمات المطلوبة
والاحظ انة لم يذكر اسم procedure الذي تم عملة phone فكيف سيتم اخراج النتيجة هذه من فضلك !!!!
==============================================================
طريقة أستدعاء 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.

====================================================
يخرج الرقم كما هو ولا تعديل علية ولا فورمة ؟؟؟؟

والف شكر على المجهود الرائع هذا



الله يبارك فيك اخي العزيز

كلامك صحيح :lol: ;) ;)

وانا أسف عل هذا الخطأ المطبعي :D ;) ;)

وهذا هو الاستدعاء الصحيح للــــ Procedure

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

(796).690462

PL/SQL procedure successfully completed.

رابط هذا التعليق
شارك

الله يبارك فيك وجزاك كل خير على هذا الشرح

انا احاول ان اتابعك خطوة بخطوة ويعجبني طريقت شرحك يا استاذي

ارجوا من حضرتك انك تشوف الاستفسار اللي ارسلتة لك قبل هذا من فضلك عن mod out كما طلبت من حضرتك


وبارك الله فيك

رابط هذا التعليق
شارك

اشكرك يا اخي العزيز وجزاك الله خير على هذا الرد
عندي سؤال وانا احاول فهم موضوع parameter
انا مش فاهم معلش عملت لينا اية out
وثانيا لو احنا عملنا parameter out لازم في وقت invok procedure نعمل variable وانا بصراحة مش فاهمها بجد لو فية طريق افهم بيها جزاك الله خيرا
والجزء الثالث انا حاولت اعملها بالـ loop بدل من if وكتبتها والامر الاخر اذا استخدمت procedure print الذي تم عملة تماااام ولا اية
كالاتي
create or replace procedure get_name
(p_empno  in   number , p_ename   out   varchar2,  p_dname out   varchar2)
is
cursor cur_emp
is 
select ename, dname
from emp e , dept  d
where e.deptno=d.deptno;
and e.empno= p_empno;
BEGIN
open cur_emp;
loop
fetch cur_emp
into p_ename, p_dname;
exit when cur_emp%notfound;
print (p_ename || 'NO E name' || p_dname || ' No D name'(;
end loop;
close cur_emp;
end;
/


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

declare 
v_ename   varchar2(100);
v_dname   varchar2(100);
begin
get_name (&p_empno, v_ename, v_dname);
print ('NAME : ' || v_ename || '   Dname : ' || v_dname);
end;
/


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



اهلا وسهلا باخي العزيز

اسف على التأخير في الرد

الموضوع بسيط أخي العزيز ....

نستخدم براميتر من نوع Out عندما اريد ان استخدم هذا المتغير خارج الــــــProcedure

يعني بعد انتهاء الـــ Procedure من عمله يوجد قيم اريد ان أستخدمها فيما بعد خارج هذا الــ Procedure

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

متى اقوم بتعريف هذه المتغيرات ...؟

اقوم بتعريفها عند أستدعاء الــ Procedure ....!!!

لماذا اقوم بتعريف المتغيرات عند أستدعاء الـــProcedure ...?

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

لذلك في كل مرة نقوم باستدعاء الـــProcedure نأخذ القيمة الجديدة ويضعها في المتغير الذي عرفناه في جملة الاستدعاء

اما بالنسبة للجزء الثالث أخي العزيز ...

الـــــــ If Statment الي انا كاتبها معناها اذا أدخل رقم موظف غير موجود اعطيه هذه القيم

p_ename:='No Name';
p_dname:='No Dname';




بعدين أخي العزيز وظيفة الـــــ Loop تختلف عن وظيفة الــــــ If Statment

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

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

وأستخدامات كل من الحلقات وجمل الشرط

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

وانا أنشاء الله جاهز لأي استفسار في اي وقت


بعدين أخي العزيز احنا ما تعرفنا على بعض

انا أسمي موسى فلسطيني وعايش في الاردن

رابط هذا التعليق
شارك

جزاك الله خيرا جزاك الله خيرا جزاك الله خيرا يا أخ موسى أنا شاكر جدا على هذا التوضييح الرائع بلا نزاع بارك الله فيك وكثر من أمثالك :D ;) ;) :lol:

تم تعديل بواسطة deamon
رابط هذا التعليق
شارك

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

وانا اسمي محمد سمير من مصر من القاهرة

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

رابط هذا التعليق
شارك

جزاك الله خيرا جزاك الله خيرا جزاك الله خيرا يا أخ موسى أنا شاكر جدا على هذا التوضييح الرائع بلا نزاع بارك الله فيك وكثر من أمثالك :lol: ;) ;) :lol:


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



وإن شاء الله ستفيد من هذه الدروس اكثر




:D ;) ;)

رابط هذا التعليق
شارك

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

وانا اسمي محمد سمير من مصر من القاهرة

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



الله يبارك فيك اخي محمد

انا الي الشرف اني تعرفت بيك اخي العزيز

اليوم إن شاء الله سأكمل شرح الـــــــــــ Procedure

رابط هذا التعليق
شارك

اخي العزيز 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;



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

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

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

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

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

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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