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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
* * * * * 1 صوت

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


138 رد (ردود) على هذا الموضوع

#31 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 05 January 2010 - 02:18 PM

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

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

انا بشكرك جدا

#32 miash80

miash80

    عضو مميز

  • الأعضــاء
  • 794 مشاركة
  • الاسم الأول:mousa
  • اسم العائلة:hamdallah
  • البـلـد: Country Flag
  • الاهتمامات:Read
  • المنصب الحالي:Analyst Assistant

تاريخ المشاركة 05 January 2010 - 02:27 PM

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

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

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

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

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

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

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

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

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

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

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




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

اللهم أغفر للمسلمين والمسلمات والمؤمينين والمؤمينات ألاحياء منهم وألاموات الى يوم الدين


موضوع قرأتة فأعجبني
http://www.shbab1.com/2minutes.htm

اذا عجبك موضوع من مواضيعي..لا تقل لي شكراً
و لكن أدعو لي (في ظهر الغيب) بالآتي

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين و لكم بالمثل ان شاء الله
ارجو من الله ان يكون ما انقله لكم من ضمن حسناتى
 356663087.jpg

 

لا تأســــفنَّ عـلى غــــــدرِ الزمــانِ لطالــمـا

رقصـــــــت على جثــــثِ الأســــــــودِ كلابا

لا تحسبن برقصـــــها تعلوا على أســــيادها
تبقى الأســــودُ أسوداً والكـــــلابُ كِــــــلابا


#33 deamon

deamon

    عضو

  • الأعضــاء
  • 10 مشاركة

تاريخ المشاركة 05 January 2010 - 02:37 PM

مشكور علم يا سيدي

#34 deamon

deamon

    عضو

  • الأعضــاء
  • 10 مشاركة

تاريخ المشاركة 05 January 2010 - 02:40 PM

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

وخاصة الجملة

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


#35 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 05 January 2010 - 03:52 PM

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

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

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


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

#36 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 05 January 2010 - 04:03 PM

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

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

بعتذر وشكرا

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

#37 miash80

miash80

    عضو مميز

  • الأعضــاء
  • 794 مشاركة
  • الاسم الأول:mousa
  • اسم العائلة:hamdallah
  • البـلـد: Country Flag
  • الاهتمامات:Read
  • المنصب الحالي:Analyst Assistant

تاريخ المشاركة 06 January 2010 - 01:41 PM

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

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

بعتذر وشكرا

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



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

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

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

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

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


اللهم أغفر للمسلمين والمسلمات والمؤمينين والمؤمينات ألاحياء منهم وألاموات الى يوم الدين


موضوع قرأتة فأعجبني
http://www.shbab1.com/2minutes.htm

اذا عجبك موضوع من مواضيعي..لا تقل لي شكراً
و لكن أدعو لي (في ظهر الغيب) بالآتي

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين و لكم بالمثل ان شاء الله
ارجو من الله ان يكون ما انقله لكم من ضمن حسناتى
 356663087.jpg

 

لا تأســــفنَّ عـلى غــــــدرِ الزمــانِ لطالــمـا

رقصـــــــت على جثــــثِ الأســــــــودِ كلابا

لا تحسبن برقصـــــها تعلوا على أســــيادها
تبقى الأســــودُ أسوداً والكـــــلابُ كِــــــلابا


#38 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 06 January 2010 - 02:41 PM

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

عندي سؤال وانا احاول فهم موضوع 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;
/

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

#39 miash80

miash80

    عضو مميز

  • الأعضــاء
  • 794 مشاركة
  • الاسم الأول:mousa
  • اسم العائلة:hamdallah
  • البـلـد: Country Flag
  • الاهتمامات:Read
  • المنصب الحالي:Analyst Assistant

تاريخ المشاركة 06 January 2010 - 03:00 PM

يا أخي ممكن تشرح مثال الخاص بي المتغير
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


اللهم أغفر للمسلمين والمسلمات والمؤمينين والمؤمينات ألاحياء منهم وألاموات الى يوم الدين


موضوع قرأتة فأعجبني
http://www.shbab1.com/2minutes.htm

اذا عجبك موضوع من مواضيعي..لا تقل لي شكراً
و لكن أدعو لي (في ظهر الغيب) بالآتي

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين و لكم بالمثل ان شاء الله
ارجو من الله ان يكون ما انقله لكم من ضمن حسناتى
 356663087.jpg

 

لا تأســــفنَّ عـلى غــــــدرِ الزمــانِ لطالــمـا

رقصـــــــت على جثــــثِ الأســــــــودِ كلابا

لا تحسبن برقصـــــها تعلوا على أســــيادها
تبقى الأســــودُ أسوداً والكـــــلابُ كِــــــلابا


#40 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 06 January 2010 - 03:37 PM

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

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

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

#41 miash80

miash80

    عضو مميز

  • الأعضــاء
  • 794 مشاركة
  • الاسم الأول:mousa
  • اسم العائلة:hamdallah
  • البـلـد: Country Flag
  • الاهتمامات:Read
  • المنصب الحالي:Analyst Assistant

تاريخ المشاركة 06 January 2010 - 03:56 PM

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

اللهم أغفر للمسلمين والمسلمات والمؤمينين والمؤمينات ألاحياء منهم وألاموات الى يوم الدين


موضوع قرأتة فأعجبني
http://www.shbab1.com/2minutes.htm

اذا عجبك موضوع من مواضيعي..لا تقل لي شكراً
و لكن أدعو لي (في ظهر الغيب) بالآتي

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين و لكم بالمثل ان شاء الله
ارجو من الله ان يكون ما انقله لكم من ضمن حسناتى
 356663087.jpg

 

لا تأســــفنَّ عـلى غــــــدرِ الزمــانِ لطالــمـا

رقصـــــــت على جثــــثِ الأســــــــودِ كلابا

لا تحسبن برقصـــــها تعلوا على أســــيادها
تبقى الأســــودُ أسوداً والكـــــلابُ كِــــــلابا


#42 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 06 January 2010 - 04:07 PM

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

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

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


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

#43 miash80

miash80

    عضو مميز

  • الأعضــاء
  • 794 مشاركة
  • الاسم الأول:mousa
  • اسم العائلة:hamdallah
  • البـلـد: Country Flag
  • الاهتمامات:Read
  • المنصب الحالي:Analyst Assistant

تاريخ المشاركة 06 January 2010 - 06:44 PM

اشكرك يا اخي العزيز وجزاك الله خير على هذا الرد
عندي سؤال وانا احاول فهم موضوع 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

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

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

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

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

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



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

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

اللهم أغفر للمسلمين والمسلمات والمؤمينين والمؤمينات ألاحياء منهم وألاموات الى يوم الدين


موضوع قرأتة فأعجبني
http://www.shbab1.com/2minutes.htm

اذا عجبك موضوع من مواضيعي..لا تقل لي شكراً
و لكن أدعو لي (في ظهر الغيب) بالآتي

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين و لكم بالمثل ان شاء الله
ارجو من الله ان يكون ما انقله لكم من ضمن حسناتى
 356663087.jpg

 

لا تأســــفنَّ عـلى غــــــدرِ الزمــانِ لطالــمـا

رقصـــــــت على جثــــثِ الأســــــــودِ كلابا

لا تحسبن برقصـــــها تعلوا على أســــيادها
تبقى الأســــودُ أسوداً والكـــــلابُ كِــــــلابا


#44 deamon

deamon

    عضو

  • الأعضــاء
  • 10 مشاركة

تاريخ المشاركة 07 January 2010 - 12:33 AM

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

تم التعديل بواسطة deamon, 07 January 2010 - 12:35 AM.


#45 masmas1001

masmas1001

    مشترك

  • الأعضــاء
  • 61 مشاركة

تاريخ المشاركة 07 January 2010 - 06:01 PM

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

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

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