lo2lo2a بتاريخ: 28 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 28 مارس 2008 السلام عليكم ورحمة الله وبركاته كيف حالكم يا اعضاء هذا المنتدى الرائع عندي مساله وتعبت كتير في حلها وما توصلتش لنتيجه مفيده في الاخر اتمنى منكم مساعدتي عندي جدول فيه عمود بيشيل ارقام التليفونات من النوع VARCHAR2وعند ادخال ارقام تليفونات تم ادخال بعض الحروف معاها السؤال عايزه فانكشن تمشي على كل ROW وتعرفني ان كان يحتوي على حروف ام لا على اساس اني بعد ما اميز الصف الي فيه حروف اقدر اعالجه بعد كده بحاجه تانيه وانفذ الفانكشن من خلال جملة SELECT وجزاكم الله كل خير يارب اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 28 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 28 مارس 2008 (معدل) 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 فانكشن ، الأولي لمعرفة هل الرقم المدخل قيمة رقمية كاملة أم أنه يتضمن أي قيمة نصية ، أما الفانكشن الثاني فيستدعي الفانكشن الأول ويرسل مفتاح مفتاح ، وفي حالة أن المفتاح المرسل مفتاح نصي لا يتم قبولة لذلك يرتجع القيمة الرقمية فقط لا غير !!!أما إذا كنت ترغب في جمع أو طرح أو ضرب أو قسمة فبنفس العملية تقريباً..................... وهكذاشكراً تم تعديل 28 مارس 2008 بواسطة MMA اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 31 مارس 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 السلام عليكم ورحمة الله وبركاته جزاك الل خيرا الاجابه بسيطه ورائعه بس كان عندي تعليق على ال Function Is_Number اثناء تنفيذها في جملة SELECT يتوجب عليا ادخال قيمه معينه وبيطلع النتج على اساسها مش بتطلع نتايج وفقالقيم الجدول يعني انا لو عملت على الجدول SELECT IS_NUMBER('150J'),PHONE FROM TABLE حيدني القيمه صفر مع كل صف في الجدول مع وجود صفوف تحتوي على ارقام فقط المطلوب امام كل صف في الجدول يديني الناتج صفر او واحد على حسب قيمة هذا الحقل اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 31 مارس 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 انا كان عندي بعض المحاولات لانشاء ال 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 يعدي على كل صف ويعطي النتيجه بناء على قيمة الصف في الجدول ارجو ان المساله تكون واضحه وما اكونش عقدتها وجزاكم الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 31 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 الأخ الكريم ، تحية طيبة وبعد ،الغرض 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; / بمعني أدق وظيفتها الرئيسية هو الإختبار فقط لا غيرشكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 1 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 جزاك الله خيرا الان وصلت المعلومه بس كان عندي سؤال عن رقم ال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 لا يمكن وعذرا على الازعاج اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 1 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 (معدل) . تم تعديل 1 أبريل 2008 بواسطة MMA اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 1 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 بس كان عندي سؤال عن رقم ال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 خارج المدي أو غير صحيحشكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 1 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 انا انشاءت الFUNCTION اللي فوق تمام وعند التنفيذ SELECT GET_NUMBER(PHONE),PHONE FROM HOMEWORK; PHONE اسم عمود رقم التليفون اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 1 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 (معدل) فهمت أخي ، أنت تعاملت مع 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 شكراً تم تعديل 1 أبريل 2008 بواسطة MMA اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 3 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 3 أبريل 2008 شكرا على تعبك معايا وجعله الله في ميزان حسناتك بس انا كان سؤالي غير انا بالفعل عملت ال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 errorORA-06512: at "SCOTT.GET_NUMBER", line 9 مع اني نفذت كل حاجه مثل ما حضرتك كاتبها تمام عذرا على الازعاج وكثرة الاسئله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 3 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 3 أبريل 2008 غريبة أخي !!!معني الرسالة أن القيمة الرقمية غير سليمة ، معني ذلك أن الـ 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; / وحددلي النتيجة شكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
lo2lo2a بتاريخ: 4 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 4 أبريل 2008 السلام عليكم ورحمة الله وبركاته الان اشتغلت وطلعت الناتج صحيح حتى في الكود الاول المشكله كانت غلطه عندي اكتشفتها مؤخرا اما بالنسبه للكود الاول والثاني في IS_NUMBER و GET _ NUMBER فهما شغالين تمام جزاك الله خيرا وعذرا على الازعاج اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 4 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 4 أبريل 2008 السلام عليكم ورحمة الله وبركاته الان اشتغلت وطلعت الناتج صحيح حتى في الكود الاول المشكله كانت غلطه عندي اكتشفتها مؤخرا اما بالنسبه للكود الاول والثاني في IS_NUMBER و GET _ NUMBER فهما شغالين تمام جزاك الله خيرا وعذرا على الازعاج لا يا أخي ، حصل خير ،بس كان نفسي أعرف ما هو الخطأ الذي وقعت فية ، حتي ينتبه إلية كل من يقرأ الموضوعشكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.