moab157 بتاريخ: 10 نوفمبر 2009 تقديم بلاغ مشاركة بتاريخ: 10 نوفمبر 2009 في البداية السلام عليكم ... انا بحاجة ل Function يقوم بعمل لتحليل لعملية حسابية كالآتيالفنكشن يستقبل نص عبارة عن varchar2 كالاتي '5*2.54+4/2-1*10*2/4' ويقوم بارجاع ناتج العملية الحسابية مع الاخذ بعين الاعتبار الاولويات للقسمة والضرب اولا ثم الجمع والطرح ثانيا ايهما يبدأ من اليسار أولا .. علما بان النص لا يحتوي على الاقواس ,, اخواني من عندو فكرة عن الموضوع الرجاء اسعافي بها واكون لكم من الشاكرين وجزاكم الله خيرا.... مستعجل .... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 10 نوفمبر 2009 تقديم بلاغ مشاركة بتاريخ: 10 نوفمبر 2009 السلام عليكم يعني هل تريد الفانكشن بضبط الاوليات كأنها تتضع أقواس مثلالو أخذنا مثالك السابق كيف تريده أن يكونأقصد أريد تحليله أنت وان شاء الله نحاول فيها معا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
moab157 بتاريخ: 10 نوفمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 نوفمبر 2009 '5*2.54+4/2-1*10*2/4'هنا العملية الاولى هو بعث بارميتر هذه المعادلة كنص الى الفنكشنداخل الفانكشن يحلل هذه المعادلة من نص باي طريقة كانت ويقوم بحساب عمليات الضرب والقسمة في البداية ايهما يبدأ من اليسار لليمين:1-) 4/2=2 5*2.54+4/2-1*10*22-)10*2=20 5*2.54+4/2-1*203-)20*1=20 5*2.54+4/2-204-) 2/4=0.5 5*2.54+0.5-205-)5*2.54=12.7 12.7+0.5-206-) 20-0.5=19.57-)12.7+19.5=32.2 32.2 اخي العزيز تبدأ المعادلة بالنص اعلاه ثم يرجع لنا الفنكشن الرقم الاخير 32.2 , المعادلة لا تحتوي على الاقواس فقط اربع عمليات قسمة وضرب وطرح وجمع وياخد بعين الاعتبارات الاولويات مثلا الضرب والقسمة نفس الاولوية واذا احتوت المعادلة على ضرب وقسمة نبدأ بحلها من اليسار واليمين , ثم اولوية الجمع والطرح واذا تساون من اليسار لليمين .وشكرا لك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
moab157 بتاريخ: 12 نوفمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 نوفمبر 2009 اعزائي وجدت الحل وهو كالتالي PROCEDURE CALC_FORMULA(CALC VARCHAR2) IS source VARCHAR2(500); V_OUTPUT NUMBER; source_cursor INTEGER; IGNORE INTEGER; BEGIN source_cursor := dbms_sql.open_cursor; DBMS_SQL.PARSE(source_cursor, 'SELECT '||CALC||' FROM DUAL', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, V_OUTPUT); ignore := DBMS_SQL.EXECUTE(source_cursor); IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN DBMS_SQL.COLUMN_VALUE(source_cursor, 1, V_OUTPUT); DBMS_OUTPUT.PUT_LINE(V_OUTPUT); END IF; EXCEPTION WHEN OTHERS THEN IF DBMS_SQL.IS_OPEN(source_cursor) THEN DBMS_SQL.CLOSE_CURSOR(source_cursor); END IF; END; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.