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

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

صورة
- - - - -

مساعده في Function


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

#1 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 28 March 2008 - 11:57 AM

السلام عليكم ورحمة الله وبركاته
كيف حالكم يا اعضاء هذا المنتدى الرائع
عندي مساله وتعبت كتير في حلها وما توصلتش لنتيجه مفيده في الاخر
اتمنى منكم مساعدتي
عندي جدول فيه عمود بيشيل ارقام التليفونات من النوع VARCHAR2
وعند ادخال ارقام تليفونات تم ادخال بعض الحروف معاها
السؤال عايزه فانكشن تمشي على كل ROW وتعرفني ان كان يحتوي على حروف ام لا
على اساس اني بعد ما اميز الصف الي فيه حروف اقدر اعالجه بعد كده بحاجه تانيه
وانفذ الفانكشن من خلال جملة SELECT
وجزاكم الله كل خير يارب


نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#2 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 28 March 2008 - 02:36 PM

1- قم بإدراج الغرض Function التالي :

Create Or Replace Function Is_Number(ID_Number In VarChar2) Return Number
As
   p_Number	 Number;
   Err_Number  Exception;
   Pragma Exception_INIT(Err_Number,-06502);
Begin
   p_Number := To_Number(ID_Number);
   Return 1;
Exception
   When Err_Number Then
	  Return 0;
End;
/

2- قم بإستدعائة كما يلي :

Select Is_Number('150') From Tab Where RowNum <= 2;
Select Is_Number('150M') From Tab Where RowNum <= 2;

حيث أنه سيقوم بإرتجاع قيمة من الإثنين ، الأول رقم ( 1 ) في حالة أن القيمة المدخلة قيمة رقمية ، أما ( 0 ) في حالة أن القيمة المدخلة قيمة غير رقمية .


أما في حالة إرسال قيمة رقمية ونصية ومن ثم إرتجاع القيم الرقمة فقط لا غير مثلاً ( A129854DVCS5 ) يمكن كما يلي :

Create Or Replace Function Get_Number(ID_String  VarChar2) Return Number
As
  ID_Loop   Number;
  p_Number  VarChar2(4000);
Begin
  p_Number := '';
  
  For ID_Loop In 1 .. Length(ID_String)
  Loop
	If(Is_Number(SubStr(ID_String,ID_Loop,1)) = 1)Then
	  p_Number := p_Number || SubStr(ID_String,ID_Loop,1);
	End If;
  End Loop;
  
  Return To_Number(p_Number);
End;
/

ومن ثم إذا أرسلت القيمة ( Ahmed150XXX60 ) سيتم إرتجاع القيمة التالية ( 15060 ) وذلك كما يلي :

Select Get_Number('Ahmed150XXX60') From Tab;

إذاً فلدينا 2 فانكشن ، الأولي لمعرفة هل الرقم المدخل قيمة رقمية كاملة أم أنه يتضمن أي قيمة نصية ، أما الفانكشن الثاني فيستدعي الفانكشن الأول ويرسل مفتاح مفتاح ، وفي حالة أن المفتاح المرسل مفتاح نصي لا يتم قبولة لذلك يرتجع القيمة الرقمية فقط لا غير !!!

أما إذا كنت ترغب في جمع أو طرح أو ضرب أو قسمة فبنفس العملية تقريباً


..................... وهكذا


شكراً

تم التعديل بواسطة MMA, 28 March 2008 - 03:07 PM.

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#3 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 31 March 2008 - 08:11 AM

السلام عليكم ورحمة الله وبركاته
جزاك الل خيرا
الاجابه بسيطه ورائعه
بس كان عندي تعليق على ال Function Is_Number اثناء تنفيذها في جملة SELECT
يتوجب عليا ادخال قيمه معينه وبيطلع النتج على اساسها مش بتطلع نتايج وفقالقيم الجدول
يعني انا لو عملت على الجدول
SELECT IS_NUMBER('150J'),PHONE FROM TABLE

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

#4 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 31 March 2008 - 08:25 AM

انا كان عندي بعض المحاولات لانشاء ال FUNCTION وكان فيها اخطاء لما ستطع اكتشافها تمنع من اتمام انشاءها

SHOW ERRORS
CREATE OR REPLACE FUNCTION F1 (VPHONE VARCHAR2)
RETURN VARCHAR2
IS
TYPE AA IS TABLE OF VARCHAR2(15)
INDEX BY BINARY_INTEGER;
VPHONE AA;
N NUMBER (2) :=0;
RESULT CHAR(20);
LOLO VARCHAR2(20);
BEGIN SELECT PHONE BULK COLLECT INTO VPHONE FROM HOMEWORK;

FOR I IN 1..15 LOOP
LOLO := SUBSTR (VPHONE(1),1,I) ;
END LOOP;

IF LOLO BETWEEN '0' AND '9' THEN
RESULT := 'NO CHAR';
ELSE
RESULT := 'YES';
END IF;

RETURN (RESULT);
END;


دي تجربه على اول صف فقط ولو نجحت ممكن امشيها على بقية الصفوف ب LOOP
بس الاخطاء اللي بتطلع مش فاهمها
فيه محاولات اخرى بالCURSOR وغيرها
على اساس يكون فيه PARAMETER يعدي على كل صف ويعطي النتيجه بناء على قيمة الصف في الجدول
ارجو ان المساله تكون واضحه وما اكونش عقدتها
وجزاكم الله خيرا
نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#5 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 31 March 2008 - 04:19 PM

الأخ الكريم ، تحية طيبة وبعد ،

الغرض IS_NUMBER ليس الهدف منه إرتجاع قيمة رقمية ولكن إرتجاع قيمة من الإثنين إما 0 أو 1 ، فلو كان القيمة المرتجعة ( 0 ) في هذه الحالة يكون الرقم المدخل غير رقمي ، أما إذا كان القيمة المرتجعة 1 في هذه الحالة يكون القيمة المدخلة رقمية !!!

حيث أن القيمة 0 تمثل False والقيمة 1 تمثل True

ففي هذه الحالة يمكننا إستخدامة كما يلي :

Select (Case When IS_NUMBER(Field_Name) = 1,Field_Name,0) From TableName

وهذا هو ما أنا أقصدة !!!

ولكن إذا أحببت إرتجاع القيمة المدخلة يمكنك تعديل الـ Function كما يلي :

Create Or Replace Function Is_Number(ID_Number In VarChar2) Return Number
As
   p_Number	 Number;
   Err_Number   Exception;
   Pragma Exception_INIT(Err_Number,-06502);
Begin
   p_Number := To_Number(ID_Number);
   Return p_Number;
Exception
   When Err_Number Then
	  Return 0;
End;
/

بحيث إذا تم إدخال القيمة ('150') يرتجع القيمة ( 150 ) ، أما إذا أدخلنا علي سبيل المثال القيمة ('AD150S20') يتم إرتجاع قيمة ( 0 ) !!!


أما بالنسبة للطريقة الأولي فهي ممتازة في حالة بناء قطع برمجية أو procedure, Function !!!

مثال :

Create Or Replace Procedure Insert_Emp(EmpNo VarChar2,EName VarChar2,Sal VarChar2)
As
Begin
   If(Is_Number(EmpNo) = 0)Then
	  Raise_Application_Error(-20000,'رقم الموظف المدخل غير سليم');
   End If;
   If(Is_Number(Sal) = 0)Then
	  Raise_Application_Error(-20000,'الراتب المدخل غير سليم');
   End If;

   Insert Into Emp(EmpNo,Ename,Sal) Values(EmpNo,Ename,Sal);
End;
/

بمعني أدق وظيفتها الرئيسية هو الإختبار فقط لا غير



شكراً

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#6 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 01 April 2008 - 11:35 AM

جزاك الله خيرا الان وصلت المعلومه
بس كان عندي سؤال عن رقم الERROR -06502 بيدل عى ايه خطا وبعرف الرقم ده منين ؟ هل معقوله علشان اعرف رقم الخطأ اجربه ؟؟
وبالنسبه للفانكشن اللي بتحول وبتديني الرقم فقط انا جربتها وكانت بتديني الخطا ده عند تنفيذها على العمود في الجدول
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SCOTT.GET_NUMBER", line 10

ولما حاولت معالجة رقم الخطا اداني خطا اخر
ERROR at line 1:
ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "SCOTT.GET_NUMBER", line 21
لا يمكن


وعذرا على الازعاج
نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#7 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 01 April 2008 - 04:10 PM

.

تم التعديل بواسطة MMA, 01 April 2008 - 04:13 PM.

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#8 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 01 April 2008 - 04:11 PM

بس كان عندي سؤال عن رقم الERROR -06502 بيدل عى ايه خطا وبعرف الرقم ده منين ؟ هل معقوله علشان اعرف رقم الخطأ اجربه ؟؟


والله يا أخي أنا أيضاً أفعل ذلك ، لكن أخي هناك جدول System يمكنك من خلالة إيجاد كافة أرقام الأخطاء ، لأن بالمنطق لكل لغة برمجة أو قواعد بيانات تحتوي علي قاعدة معرفة خاصة بها . ومن قبل قد وجدت إسم الجدول في قسم DBA ولكنني حالياً لم أتذكرة .

علي العموم ، أنا أيضاً أستخدم هذا الأسلوب .


ولما حاولت معالجة رقم الخطا اداني خطا اخر
ERROR at line 1:
ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "SCOTT.GET_NUMBER", line 21
لا يمكن



أبعتلي الـ Function الذي وقع به الخطألعلي وعسي أن تكون أخطأت في شيء غير واضح ، أو يجوز أنك لم تقم بإجراء تنقيح للإجراء جيداً . بس من الواضح أن القيمة المرتجعة للغرض Return خارج المدي أو غير صحيح



شكراً

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#9 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 01 April 2008 - 04:59 PM

انا انشاءت الFUNCTION اللي فوق تمام
وعند التنفيذ
SELECT GET_NUMBER(PHONE),PHONE FROM HOMEWORK;

PHONE اسم عمود رقم التليفون
نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#10 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 01 April 2008 - 05:10 PM

فهمت أخي ، أنت تعاملت مع Get_Number وليس Is_Number الذي أدرجتة لك في أول مشاركة !!!

الأخ الكريم ، الدالة Get_Number تحتاج الي وجود Is_Number لأنني في الدالة Get_Number أختبر حرف حرف بالدالة Is_Number ، لذلك يجب عليك إدراج Is_Number في البداية ، ومن ثم إدراج Get_Number ثم إستدعاء الدالة Get_Number كما تشاء .

وإليك الكود للمرة الثانية :

Create Or Replace Function Is_Number(ID_Number In VarChar2) Return Number
As
   p_Number	 Number;
   Err_Number  Exception;
   Pragma Exception_INIT(Err_Number,-06502);
Begin
   p_Number := To_Number(ID_Number);
   Return 1;
Exception
   When Err_Number Then
	  Return 0;
End;
/

Create Or Replace Function Get_Number(ID_String  VarChar2) Return Number
As
  p_Number  VarChar2(4000);
Begin
  p_Number := '';
  
  For ID_Loop In 1 .. Length(ID_String)
  Loop
	If(Is_Number(SubStr(ID_String,ID_Loop,1)) = 1)Then
	  p_Number := p_Number || SubStr(ID_String,ID_Loop,1);
	End If;
  End Loop;
  
  Return To_Number(p_Number);
End;
/

Create Table Single
(
  Single_ID	Number(10),
  Single_Name  VarChar2(20),
  Single_Phone VarChar2(15),
  Constraint PK_Single Primary Key(Single_ID)
)
/

Insert Into Single Values(1,'Ahmed','45698214');
Insert Into Single Values(2,'Usif','52436987');
Insert Into Single Values(3,'Sara','32548952');
Insert Into Single Values(4,'Mahmod','5425XX64');
Insert Into Single Values(5,'Dalay','19845214');
Commit;


1- إختبار البيانات المدخلة :

Select Is_Number(Single_Phone) As Phone From Single;

Return Is :
-------------
1
1
1
0
1


2- إختبار البيانات وإرتجاع القيمة مباشرتاً بإستخدام Get_Number :

Select Get_Number(Single_Phone) As Phone From Single;

Return Is :
-------------
45698214
52436987
32548952
524214
19845214


3- إرتجاع الهاتف بصورة صحيحة :

Select (Case When Is_Number(Single_Phone) = 1 Then Single_Phone Else '0' End) As Phone 
From Single

Return Is :
-------------
45698214
52436987
32548952
0
19845214




شكراً

تم التعديل بواسطة MMA, 01 April 2008 - 05:23 PM.

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#11 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 03 April 2008 - 11:09 AM

شكرا على تعبك معايا
وجعله الله في ميزان حسناتك
بس انا كان سؤالي غير
انا بالفعل عملت الfunction is_number واشتغلت واتنفذت صحيح
وطلعت النتايج مضبوطه
وبعدها عملت الfunction get_number واتعملت تمام
بس عند تنفيذ get_number بالصوره التاليه
select get_number(phone) from homework;

بدل ما يديني نتايج مثل اللي حضرتك كتابها بيدني الخطا ده
select get_number(phone) from homework
*

ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SCOTT.GET_NUMBER", line 9
مع اني نفذت كل حاجه مثل ما حضرتك كاتبها تمام
عذرا على الازعاج وكثرة الاسئله
نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#12 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 03 April 2008 - 01:49 PM

غريبة أخي !!!

معني الرسالة أن القيمة الرقمية غير سليمة ، معني ذلك أن الـ Exception غير سليم ( ما السبب إذاً ، الله أعلم ) !!!

طب أخي ممكن تغير الغرض Is_Number الي ما يلي :

Create Or Replace Function Is_Number(ID_Number In VarChar2) Return Number
As
   p_Number	 Number;
Begin
   p_Number := To_Number(ID_Number);
   Return 1;
Exception
   When Others Then
	  Return 0;
End;
/

وحددلي النتيجة



شكراً

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#13 lo2lo2a

lo2lo2a

    عضو

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

تاريخ المشاركة 04 April 2008 - 02:16 PM

السلام عليكم ورحمة الله وبركاته
الان اشتغلت وطلعت الناتج صحيح حتى في الكود الاول
المشكله كانت غلطه عندي اكتشفتها مؤخرا
اما بالنسبه للكود الاول والثاني في IS_NUMBER
و GET _ NUMBER
فهما شغالين تمام
جزاك الله خيرا
وعذرا على الازعاج
نعيب زماننا والعيب فينا وما لزماننا عيب سوانا

#14 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 04 April 2008 - 02:43 PM

السلام عليكم ورحمة الله وبركاته
الان اشتغلت وطلعت الناتج صحيح حتى في الكود الاول
المشكله كانت غلطه عندي اكتشفتها مؤخرا
اما بالنسبه للكود الاول والثاني في IS_NUMBER
و GET _ NUMBER
فهما شغالين تمام
جزاك الله خيرا
وعذرا على الازعاج


لا يا أخي ، حصل خير ،

بس كان نفسي أعرف ما هو الخطأ الذي وقعت فية ، حتي ينتبه إلية كل من يقرأ الموضوع

شكراً

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )