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

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


awn78

Recommended Posts

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

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

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

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

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

وشكرا لكم

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

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

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
رابط هذا التعليق
شارك

السلام عليكم

بص انا اعرف ان لما تعمل 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

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

شكرا لكل من حاول مساعدتي والحل الصحيح والمنطقي على حسب اعتقادي هو

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;

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

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

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

first_record;
next_record;

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

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

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

have a nice day
رابط هذا التعليق
شارك

  • بعد 1 شهر...

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

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

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

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

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

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

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