الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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

عندي جدول اسمه 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 شهر...
بتاريخ:

أعتقد أن الموضوع جداً بسيط بإمكانك إستخدام 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;

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.