sors بتاريخ: 28 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 28 يناير 2012 create or replace function get_job(p_person_id number ) return varchar2 is cursor s is select jbt.name from per_all_assignments_f asg, per_assignment_status_types ast, per_assignment_status_types_tl astl, hr_all_organization_units org, hr_all_organization_units_tl orgtl, pay_all_payrolls_f ppa, per_jobs_tl jbt, per_grades_tl gdt, pay_people_groups ppg, /* hr_positions pos,*/ hr_locations loc, per_all_people_f peo, hr_lookups hrl, hr_lookups hrl2, hr_lookups hrl3, hr_lookups hrl4 where asg.assignment_status_type_id = ast.assignment_status_type_id and ast.assignment_status_type_id = astl.assignment_status_type_id and astl.language = userenv('LANG') and asg.organization_id = org.organization_id and org.organization_id = orgtl.organization_id and orgtl.language = userenv('LANG') and asg.payroll_id = ppa.payroll_id (+) and asg.job_id = jbt.job_id (+) and jbt.language(+) = userenv('LANG') and asg.grade_id = gdt.grade_id (+) and gdt.language(+) = userenv('LANG') and asg.people_group_id = ppg.people_group_id (+) /* and asg.position_id = pos.position_id (+)*/ and asg.location_id = loc.location_id (+) and asg.supervisor_id = peo.person_id (+) -- and hrl.lookup_type (+) = 'FREQUENCY' and hrl.lookup_code (+) = asg.frequency and hrl2.lookup_type (+) = 'QUALIFYING_UNITS' and hrl2.lookup_code (+) = asg.probation_unit and hrl3.lookup_type (+) = 'YES_NO' and hrl3.lookup_code (+) = asg.manager_flag and hrl4.lookup_type (+) = 'YES_NO' and hrl4.lookup_code (+) = asg.primary_flag and asg.person_id= p_person_id; begin for cur in s loop return cur.name; end loop; end get_job; لما بجى استخدمها فى اى كويرى بتطلعلى ora-06503ومش عارف سببهاممكن مساعدة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmed.arafa بتاريخ: 28 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 28 يناير 2012 السلام عليكماخى يجب ان تحتوى ال function على جمله return statementلان function يجب ان تسترجع بيانات وان كنت لا تريد استرجاع قيمه معينه استعمل ال procedure اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 28 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 28 يناير 2012 السلام عليكم ورحمة اللهكما ذكر الأخ / احمد ... انه لا توجد قيمة ناتجة عن تنفيذ جملة ال select داخل ال cursorسبب الرسالة : انه لا توجد قيمة ناتجة عن تنفيذ الأوامر الموجودة بالcursorيمكنك اضافة شرط للتأكد من وجود قيمة ناتجة من تنفيذ اوامر ال select .... يمكن أن تضع قيمة ثابته مثل "9999" فى حالة عدم تحقق ناتج من تنفيذ الأوامرويمكنك استخدام ال EXCEPTION فى حالة وجود خطأ غير معرف اثناء تنفيذ أمر الselect داخل الcursorاليك هذا المثال : منقول Error: ORA-06503: PL/SQL: Function returned without value Cause: You tried to call a PLSQL function, but the function was missing a RETURN statement. Action: The options to resolve this Oracle error are: Try re-writing the function to include a RETURN statement. Or if you don't want to return a value, re-write your function as a procedure . Every function must return a value. The following is an example of a function called FindCourse that returns a number. The code "RETURN cnumber" ensures that a value is returned from this function CREATE OR REPLACE Function FindCourse ( name_in IN varchar2 ) RETURN number IS cnumber number; cursor c1 is select course_number from courses_tbl where course_name = name_in; BEGIN open c1; fetch c1 into cnumber; if c1%notfound then cnumber := 9999; end if; close c1; RETURN cnumber; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); END; جرب واخبرنا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
gamal_orcl بتاريخ: 29 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 29 يناير 2012 سؤال بس هو إيه معني (+)شكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mahmoud kurdy بتاريخ: 29 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 29 يناير 2012 الاخ الكريم :في مثل هذه الحالة يفضل ان تجرب ناتج تعليمة الاستعلام لوحدها ونتاكد انه تعيد نتيجة ام لا (واعتقد من ان تعليمة الاستعلام معقدة جدا فهي تقوم بالربط بين أكثر من جدول وهناك ربط خارجي لذا فأحتمال كبير أنها لا تعيد أي قيمة ) .والامر الثاني هو وضع تعليمة return ضمن الحلقة لا فائدة منه لأن الخرج هنا سيكون دائما هي آخر عملية fetch , أي أنه هنا لن يتم إعادة كل قيمة من المشيرة فقط آخر عملية إحضار ستم إعادتها .لذا فوضع التعليمة داخل الحلقة او خارجها له نفس النتيجة ( مع ملاحظة في حال وضع التعليمة خارج الحلقة يجب تعريف متحول جديد لأن السجل cur معرف بشكل ضمني صمن الحلقة )لذا فإن التابع هنا بأحسن الاحوال لن يعيد اكثر من قيمة واحدة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmed.arafa بتاريخ: 29 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 29 يناير 2012 سؤال بس هو إيه معني (+)شكراً هو كده عامل right outer join اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmed.arafa بتاريخ: 29 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 29 يناير 2012 سؤال بس هو إيه معني (+)شكراً and asg . payroll_id = ppa . payroll_id (+) هو كده عامل left outer joinوالright العكسhttp://www.java2s.com/Tutorial/Oracle/0140__Table-Joins/0080__Outer-Joins-Left-Right.htm اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
gamal_orcl بتاريخ: 29 يناير 2012 تقديم بلاغ مشاركة بتاريخ: 29 يناير 2012 سؤال بس هو إيه معني (+)شكراً and asg . payroll_id = ppa . payroll_id (+) هو كده عامل left outer joinوالright العكسhttp://www.java2s.co...-Left-Right.htm يا باشا متشكر علي الرد و التوضيح جداً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sors بتاريخ: 23 فبراير 2012 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 23 فبراير 2012 function get_job(p_person_id number ) return varchar2 is cursor s is select distinct nvl(jbt.name,'')job from per_all_assignments_f asg, per_assignment_status_types ast, per_assignment_status_types_tl astl, hr_all_organization_units org, hr_all_organization_units_tl orgtl, pay_all_payrolls_f ppa, per_jobs_tl jbt, per_grades_tl gdt, pay_people_groups ppg, /* hr_positions pos,*/ hr_locations loc, per_all_people_f peo, hr_lookups hrl, hr_lookups hrl2, hr_lookups hrl3, hr_lookups hrl4 where asg.assignment_status_type_id = ast.assignment_status_type_id and ast.assignment_status_type_id = astl.assignment_status_type_id and astl.language = userenv('LANG') and asg.organization_id = org.organization_id and org.organization_id = orgtl.organization_id and orgtl.language = userenv('LANG') and asg.payroll_id = ppa.payroll_id (+) and asg.job_id = jbt.job_id (+) and jbt.language(+) = userenv('LANG') and asg.grade_id = gdt.grade_id (+) and gdt.language(+) = userenv('LANG') and asg.people_group_id = ppg.people_group_id (+) /* and asg.position_id = pos.position_id (+)*/ and asg.location_id = loc.location_id (+) and asg.supervisor_id = peo.person_id (+) -- and hrl.lookup_type (+) = 'FREQUENCY' and hrl.lookup_code (+) = asg.frequency and hrl2.lookup_type (+) = 'QUALIFYING_UNITS' and hrl2.lookup_code (+) = asg.probation_unit and hrl3.lookup_type (+) = 'YES_NO' and hrl3.lookup_code (+) = asg.manager_flag and hrl4.lookup_type (+) = 'YES_NO' and hrl4.lookup_code (+) = asg.primary_flag and asg.person_id= p_person_id; j varchar2(300); begin open s ; fetch s into j; if s%notfound then j:='no'; end if; close s; انا استخدمت الحل المكتوب وحاولت اعمل exceptionاو استخدم nvl وبرضه نفس المشكلة ارجو المساعدةضرورى جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sors بتاريخ: 24 فبراير 2012 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 24 فبراير 2012 ارجو المساعدة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.