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

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

صورة
- - - - -

سؤال عن ال Update مع ال For


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

#1 awn78

awn78

    عضو نشط

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

تاريخ المشاركة 03 April 2008 - 01:17 PM

اخواني اعضاء المنتدى
السلام عليكم ورحمة الله وبركاته

عندي جدول اسمه test يحتوي على الرقم والاسم والراتب عمود الرقم والاسم يحتوو على 3 ريكورد لكن عمود الراتب لسا فاضي ما دخلت فيه بيانات
اريد عن طريق جملة ال for ان اقوم بإدخال 3 ريكورد الي عمود الراتب يعني مثلا

for i in 1..3 loop
update test set sal=i*1000 where id=&dd
end loop;
end;

جربت هاذي الطريقه ولكن كان ينفذ نفس الريكورد 3 مرات دون ان ينتقال الى الريكورد التالي فما هو السبب

ارجو ان تساعدوني

وشكرا لكم
صورة

#2 hanyfreedom

hanyfreedom

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

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 03 April 2008 - 02:52 PM

ده اللى مفروض عندك :-

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



اتمنى ان تكون الاجابة واضحة .... و بالتوفيق

تم التعديل بواسطة hanyfreedom, 03 April 2008 - 02:56 PM.


#3 gero

gero

    عضو

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

تاريخ المشاركة 04 April 2008 - 01:42 PM

السلام عليكم

بص انا اعرف ان لما تعمل loop في الريكورد وفي كزا ريكورد لازم تضيف حاجة صغيرة بغض النظر في الupdate او query او اي حاجة

تعمل كده
[codebox]first_record;
for i in 1..3 loop
update test set sal=i*1000 where id=&dd
next_record;
end loop;
end[/codebox]

بس كده
Ocp Developer
Junior Oracle Developer

تم التعديل بواسطة gero, 04 April 2008 - 01:42 PM.

إن الله لايضيع أجر من أحسن عملا


ORACLE APPLICATION DEVELOPER

LETS SEE WHO IS THE BEST

#4 awn78

awn78

    عضو نشط

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

تاريخ المشاركة 06 April 2008 - 10:36 PM

شكرا لكل من حاول مساعدتي والحل الصحيح والمنطقي على حسب اعتقادي هو
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;

صورة

#5 hanyfreedom

hanyfreedom

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

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 06 April 2008 - 11:06 PM

بالنسبة للأخ gero

فأعتقد انه قد خلط ما بين الداتابيز و الديفلوبر ......... لأن على حد علمى ال

first_record;
next_record;

فى الفورمز وليس الداتابيز .

بالنسبة لأخى awn78

فحله الاخير جيد و ممتاز
but it's not only the right and logical solution in this thread

have a nice day

#6 saleh_albatati

saleh_albatati

    عضو

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

تاريخ المشاركة 23 May 2008 - 01:18 PM

أعتقد أن الموضوع جداً بسيط بإمكانك إستخدام curosr على النحو التالي :

cursor c is select id from test;

begin
for rec in c loop
update test set sal=1500
where
id=rec.id;
end loop;
commit;
end;