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

مشكلة فى عمل لوب


mohamed mansour

Recommended Posts

السلام عليكم ورحمة الله
أنا كنت محتاج خبرتكم فى عمل لوب داخل لوب
أول لوب بيجيب المرتب للموظف ويقسمه على الف(1000) وبيقربوا لقرب رقم صحيح وبيضعه فى متغير رقم 1
وتانى لوب بياخد قيمة هذا المتغيررقم 1
وبيلوب على حسب عدد قيمة المتغير وبيضع فى كل مرة لوب علامه الاستركس فى متغير جديد رقم (2) وفى النهاية انا بدخل قيمة هذا المتغير رقم (2) فى كولم
انا مشكلتى انى مش عارف ازاى احدد انهى اى لوب الاول وازاى اخرج من اى لوب
هو الكود بيشتغل بس لاول 3 او 4 موظفين لان الكولم فى الجدول مبيقدرش يشيل عدد الاستركس لان المتغيررقم (2) اللى بضع فيه قيمة الاستركس بيحتفظ بالقيم السابقة جواه وبالتالى قيمته بتزيد ومافيش حجم كولم يقدر يحتفظ بيه ومش عارف ازاى اخلى المتغير رقم (2) يمسح القيمه الموجوده فيه قبل ميدخل فى لوب جديد
ياريت اهل النصيحة يرشدونى
انا بشتغل على اسكيمه hr وعامل جدول ذى جدول
الموظفين employees اسمه emp ومزود كولم فيه اسمه stars
وبدخل فيه عدد الاستركس التى مساوية لقيمة المتغير رقم 2
انا بادى اول لوب 100 حتى 206 لان دى أرقام الموظفين عندى

declare
v_stars emp.stars%type :=null;
v_sal emp.salary%type;
begin
<<outer >>
for i in 100..206 loop
select nvl(round(salary/1000),0)
into v_sal from emp
where employee_id=i;
<<inner >>
for i in 1..v_sal loop
v_stars :=v_stars||'*';
end loop inner;
update emp set stars=v_stars
where employee_id=i;
exit outer;
end loop outer;
end;

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

السلام عليكم
هذا هو الكود لعمل ما تريد


DECLARE
  CURSOR emp_cur
  IS
     SELECT *
       FROM emp;

  v_stars   emp.stars%TYPE    := NULL;
  v_sal     emp.salary%TYPE;
BEGIN
  FOR i IN emp_cur
  LOOP
     SELECT NVL (ROUND (salary / 1000), 0)
       INTO v_sal
       FROM emp
      WHERE employee_id = i.employee_id;

     FOR i IN 1 .. v_sal
     LOOP
        v_stars := v_stars || '*';
     END LOOP;

     UPDATE emp
        SET stars = v_stars
      WHERE employee_id = i.employee_id;

     v_stars := NULL;
  END LOOP;
END;


و التعديلات هي
اولا
عمل كيرسور
يجيب كل الموظفين و عمل اللوب به و عندما ينتهي من كل الموظفين سيخرج من اللو ب بمفرد ولا داعي لتحديدي عدد مرات معينة او الخروج من اللوب عن طريق كلمة EXIT
ثانيا
بعد ان تقوم بعمل جملة الابديت
يكفي ان تقوم فقط بكتابة الجملة التالية
V_STARS:=NULL;
حتي يفرغ من قيمته و يستقبل القيمة الجديدة و تستطيع الحصول علي نتأئج صحيحة و عمل جملة الابديت بشكل صحيح
ملحوظة اخيرة
إسمها استرسك و ليست استركس :)


بالتوفيق

تم تعديل بواسطة hanon_OCP
رابط هذا التعليق
شارك

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

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

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

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

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

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

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