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

مساعده في Function


lo2lo2a

Recommended Posts

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


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

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

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
رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته
جزاك الل خيرا
الاجابه بسيطه ورائعه
بس كان عندي تعليق على ال Function Is_Number اثناء تنفيذها في جملة SELECT
يتوجب عليا ادخال قيمه معينه وبيطلع النتج على اساسها مش بتطلع نتايج وفقالقيم الجدول
يعني انا لو عملت على الجدول

SELECT IS_NUMBER('150J'),PHONE FROM TABLE


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

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

انا كان عندي بعض المحاولات لانشاء ال 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 يعدي على كل صف ويعطي النتيجه بناء على قيمة الصف في الجدول
ارجو ان المساله تكون واضحه وما اكونش عقدتها
وجزاكم الله خيرا

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

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

الغرض 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;
/



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



شكراً

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

جزاك الله خيرا الان وصلت المعلومه
بس كان عندي سؤال عن رقم ال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
لا يمكن


وعذرا على الازعاج

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

بس كان عندي سؤال عن رقم ال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 خارج المدي أو غير صحيح



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

فهمت أخي ، أنت تعاملت مع 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
رابط هذا التعليق
شارك

شكرا على تعبك معايا
وجعله الله في ميزان حسناتك
بس انا كان سؤالي غير
انا بالفعل عملت ال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
مع اني نفذت كل حاجه مثل ما حضرتك كاتبها تمام
عذرا على الازعاج وكثرة الاسئله

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

غريبة أخي !!!

معني الرسالة أن القيمة الرقمية غير سليمة ، معني ذلك أن الـ 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;
/



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



شكراً

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

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

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

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


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

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

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

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

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

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

×   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.

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

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

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