awn78 بتاريخ: 3 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 3 أبريل 2008 اخواني اعضاء المنتدىالسلام عليكم ورحمة الله وبركاتهعندي جدول اسمه test يحتوي على الرقم والاسم والراتب عمود الرقم والاسم يحتوو على 3 ريكورد لكن عمود الراتب لسا فاضي ما دخلت فيه بياناتاريد عن طريق جملة ال for ان اقوم بإدخال 3 ريكورد الي عمود الراتب يعني مثلاfor i in 1..3 loopupdate test set sal=i*1000 where id=&ddend loop;end;جربت هاذي الطريقه ولكن كان ينفذ نفس الريكورد 3 مرات دون ان ينتقال الى الريكورد التالي فما هو السببارجو ان تساعدوني وشكرا لكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 3 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 3 أبريل 2008 (معدل) ده اللى مفروض عندك :- SQL> create table test (id number primary key , 2 name varchar2(15), 3 sal number); Table created. SQL> desc test Name Null? Type ----------------------------------------- -------- ------------ ID NOT NULL NUMBER NAME VARCHAR2(15) SAL NUMBER SQL> insert into test values (1,'qq',null); 1 row created. SQL> insert into test values (2,'ww',null); 1 row created. SQL> insert into test values (3,'ee',null); 1 row created. SQL> commit; Commit complete. انت بتقول :- ولكن كان ينفذ نفس الريكورد 3 مرات دون ان ينتقال الى الريكورد التالي يبقى كده معناه انك عاوز الاوراكل يعملك prompt عند ال ID لكل موظف عندك علشان تحط المرتب .ده الكود اللى انت عاوزه :- update test set sal = &salary where ID = &ID; و ده الناتج :- SQL> update test 2 set sal = &salary 3 where ID = &ID; Enter value for salary: 1111 old 2: set sal = &salary new 2: set sal = 1111 Enter value for id: 1 old 3: where ID = &ID new 3: where ID = 1 1 row updated. SQL> / Enter value for salary: 2222 old 2: set sal = &salary new 2: set sal = 2222 Enter value for id: 2 old 3: where ID = &ID new 3: where ID = 2 1 row updated. SQL> / Enter value for salary: 3333 old 2: set sal = &salary new 2: set sal = 3333 Enter value for id: 3 old 3: where ID = &ID new 3: where ID = 3 1 row updated. SQL> select * from test ; ID NAME SAL ---------- --------------- ---------- 1 qq 1111 2 ww 2222 3 ee 3333 اما فى حالة اذا كنت عاوز تحط نفس المرتب للكل يبقى ده الكود اللى انت عاوزه :- update test set sal = 1000; اما اذا كنت عاوز تحط قيم مختلفة للمرتبات بدون prompt فده مش هينفع اللا من خلال ال for .. loop و كمان لازم تعمل sequence فى الاول ، و خلى بالك القيم دى هتبقى متسلسلة ..... ذى كده :- create sequence hany increment by 1000; Sequence created. begin for i in 1..3 loop update test set sal = hany.nextval; end loop; end; / PL/SQL procedure successfully completed. select * from test; -- ID NAME SAL ---------- --------------- ---------- 1 qq 6001 2 ww 7001 3 ee 8001 اتمنى ان تكون الاجابة واضحة .... و بالتوفيق تم تعديل 3 أبريل 2008 بواسطة hanyfreedom اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
gero بتاريخ: 4 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 4 أبريل 2008 (معدل) السلام عليكمبص انا اعرف ان لما تعمل loop في الريكورد وفي كزا ريكورد لازم تضيف حاجة صغيرة بغض النظر في الupdate او query او اي حاجةتعمل كده first_record; for i in 1..3 loop update test set sal=i*1000 where id=&dd next_record; end loop; end بس كدهOcp Developer Junior Oracle Developer تم تعديل 4 أبريل 2008 بواسطة gero اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
awn78 بتاريخ: 6 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 6 أبريل 2008 شكرا لكل من حاول مساعدتي والحل الصحيح والمنطقي على حسب اعتقادي هو declare cursor emp_sal is select id,salary from test; emp_sal1 emp_sal%rowtype; begin open emp_sal; for i in 1..3 loop fetch emp_sal into emp_sal1; update test set salary=i*100 where id=emp_sal1.id; end loop; end; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 6 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 6 أبريل 2008 بالنسبة للأخ geroفأعتقد انه قد خلط ما بين الداتابيز و الديفلوبر ......... لأن على حد علمى ال first_record;next_record; فى الفورمز وليس الداتابيز .بالنسبة لأخى awn78فحله الاخير جيد و ممتاز but it's not only the right and logical solution in this thread have a nice day اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
saleh_albatati بتاريخ: 23 مايو 2008 تقديم بلاغ مشاركة بتاريخ: 23 مايو 2008 أعتقد أن الموضوع جداً بسيط بإمكانك إستخدام curosr على النحو التالي :cursor c is select id from test;beginfor rec in c loop update test set sal=1500whereid=rec.id;end loop;commit;end; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.