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

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

صورة
- - - - -

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


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

#1 mohamed mansour

mohamed mansour

    عضو

  • الأعضــاء
  • 12 مشاركة

تاريخ المشاركة 27 December 2005 - 05:36 AM

السلام عليكم ورحمة الله
أنا كنت محتاج خبرتكم فى عمل لوب داخل لوب
أول لوب بيجيب المرتب للموظف ويقسمه على الف(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;

#2 هانى سند

هانى سند

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 27 December 2005 - 12:24 PM

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

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, 27 December 2005 - 12:25 PM.


#3 mohamed mansour

mohamed mansour

    عضو

  • الأعضــاء
  • 12 مشاركة

تاريخ المشاركة 27 December 2005 - 03:01 PM

جزاك الله خير
أنا متشكر جدا على مساعدتك :)