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

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

صورة
- - - - -

مساعدة فى رسالة خطأ :ORA-06503: PL/SQL: Function returned without value


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

#1 sors

sors

    عضو نشط

  • الأعضــاء
  • 449 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 28 January 2012 - 02:43 PM

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
ومش عارف سببها
ممكن مساعدة

#2 ahmed.arafa

ahmed.arafa

    عضو نشط

  • الأعضــاء
  • 266 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 28 January 2012 - 06:39 PM

السلام عليكم
اخى يجب ان تحتوى ال function على جمله return statement
لان function يجب ان تسترجع بيانات وان كنت لا تريد استرجاع قيمه معينه استعمل ال procedure

#3 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,559 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 28 January 2012 - 09:46 PM

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

كما ذكر الأخ / احمد ... انه لا توجد قيمة ناتجة عن تنفيذ جملة ال 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;


جرب واخبرنا

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#4 gamal_orcl

gamal_orcl

    مشترك

  • الأعضــاء
  • 61 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 29 January 2012 - 02:02 PM

سؤال بس هو إيه معني
(+)

شكراً

#5 mahmoud kurdy

mahmoud kurdy

    مشترك

  • الأعضــاء
  • 50 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 29 January 2012 - 04:50 PM

الاخ الكريم :

في مثل هذه الحالة يفضل ان تجرب ناتج تعليمة الاستعلام لوحدها ونتاكد انه تعيد نتيجة ام لا (واعتقد من ان تعليمة الاستعلام معقدة جدا فهي تقوم بالربط بين أكثر من جدول وهناك ربط خارجي لذا فأحتمال كبير أنها لا تعيد أي قيمة ) .

والامر الثاني هو وضع تعليمة return ضمن الحلقة لا فائدة منه لأن الخرج هنا سيكون دائما هي آخر عملية fetch , أي أنه هنا لن يتم إعادة كل قيمة من المشيرة فقط آخر عملية إحضار ستم إعادتها .لذا فوضع التعليمة داخل الحلقة او خارجها له نفس النتيجة ( مع ملاحظة في حال وضع التعليمة خارج الحلقة يجب تعريف متحول جديد لأن السجل cur معرف بشكل ضمني صمن الحلقة )
لذا فإن التابع هنا بأحسن الاحوال لن يعيد اكثر من قيمة واحدة

#6 ahmed.arafa

ahmed.arafa

    عضو نشط

  • الأعضــاء
  • 266 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 29 January 2012 - 07:18 PM

سؤال بس هو إيه معني
(+)

شكراً

هو كده عامل right outer join

#7 ahmed.arafa

ahmed.arafa

    عضو نشط

  • الأعضــاء
  • 266 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 29 January 2012 - 07:21 PM

سؤال بس هو إيه معني
(+)

شكراً



and

asg

.

payroll_id

=

ppa

.

payroll_id

(+)


هو كده عامل left outer join
والright العكس
http://www.java2s.co...-Left-Right.htm

#8 gamal_orcl

gamal_orcl

    مشترك

  • الأعضــاء
  • 61 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 30 January 2012 - 12:41 AM


سؤال بس هو إيه معني
(+)

شكراً



and

asg

.

payroll_id

=

ppa

.

payroll_id

(+)


هو كده عامل left outer join
والright العكس
http://www.java2s.co...-Left-Right.htm

يا باشا متشكر علي الرد و التوضيح جداً

#9 sors

sors

    عضو نشط

  • الأعضــاء
  • 449 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 23 February 2012 - 05:23 PM

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 وبرضه نفس المشكلة ارجو المساعدة
ضرورى جدا

#10 sors

sors

    عضو نشط

  • الأعضــاء
  • 449 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 24 February 2012 - 10:49 AM

ارجو المساعدة