الانتقال إلى المحتوى
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.

معرفة الارقام الغير ضمن الارقام متسلسلة واستغلالها

Featured Replies

بتاريخ:

السلام عليكم عندي مشكلة ارغب في ايجاد حل :
معي دالة الارقام المتسلسلة في حالة حذف اي عمود يكو هناك ارقام متسلسلة غير مستغلة كيف يمكن ايجاد تلك الرقام الغير مستعملة ومن ضمن التسلسل بواسطة جملة استعلام

Mohammed Basalama

تم تعديل بواسطة محمد باسلامة

بتاريخ:

السلام عليكم
عندي فكرة لعمل ما تحتاجه ممكن أن تفيدك

و هو عمل جدول أخر به كل الاأرقام المتسلسة من الجدول الأصلي
و بالطبع عند إضافة اي رقم تسلسلس جديد يتم إضافته في هذا الجدول
ثم عند عمل أي حذف من الجدول المتسلسل
يمكنك بعدها إيجاد الارقام المفقودة بجملية SELECT بسيطة
و يمكن إذا كنت تريد إستغلال هذه الأرقام بعمل إدخال لها مرة أخري إن كنت تريد عن طريق الإختيارمنها
و هذا مثال بسيط يشرح الفكرة

SQL> CREATE TABLE  SERIAL (SERIAL_NO NUMBER);

تم تكوين جدول.

SQL> BEGIN
 2  FOR I IN  1..50 LOOP
 3  INSERT INTO SERIAL  VALUES(I);
 4  END  LOOP;
 5  COMMIT;
 6  END;
 7  /

تم بنجاح إجراء PL/SQL

SQL> SELECT *  FROM  SERIAL;

SERIAL_NO																	  
----------																	  
	 1																	  
	 2																	  
	 3																	  
	 4																	  
	 5																	  
	 6																	  
	 7																	  
	 8																	  
	 9																	  
	10																	  
	11																	  

SERIAL_NO																	  
----------																	  
	12																	  
	13																	  
	14																	  
	15																	  
	16																	  
	17																	  
	18																	  
	19																	  
	20																	  
	21																	  
	22																	  

SERIAL_NO																	  
----------																	  
	23																	  
	24																	  
	25																	  
	26																	  
	27																	  
	28																	  
	29																	  
	30																	  
	31																	  
	32																	  
	33																	  

SERIAL_NO																	  
----------																	  
	34																	  
	35																	  
	36																	  
	37																	  
	38																	  
	39																	  
	40																	  
	41																	  
	42																	  
	43																	  
	44																	  

SERIAL_NO																	  
----------																	  
	45																	  
	46																	  
	47																	  
	48																	  
	49																	  
	50																	  

تم اختيار 50 صف

SQL> CREATE TABLE  MISSED_SERIAL  AS SELECT *  FROM  SERIAL;

تم تكوين جدول.

SQL>   DELETE SERIAL  WHERE  SERIAL_NO IN  (10,12,15,49,26,23,6,25,32);

تم حذف 9 صف

SQL> COMMIT;

تم التثبيت

SQL> select  s2.serial_no
 2	  from  serial s1, missed_serial s2
 3	  where  s1.SERIAL_NO(+)=s2.SERIAL_NO
 4	  AND  S1.SERIAL_NO  IS  NULL
 5	 ;

SERIAL_NO																	  
----------																	  
	 6																	  
	10																	  
	12																	  
	15																	  
	23																	  
	25																	  
	26																	  
	32																	  
	49																	  

تم اختيار 9 صف


و أرجو التفاعل مع الموضوع حيث أنه من المواضيع المهمة
بالتوفيق

بتاريخ:

السلام عليكم ورحمة الله وبركاته

يمكن انشاء جدول يحتوي علي عمود للتسلسل فقط

وانشاء trigger عند كل عملية حذف يقوم بترحيل التسلسل المحذوف لهذا الجدول

وعند اي عملية ادخال مطابقة لهذا التسلسل يقوم بحذف التسلسل من الجدل


سؤال : هل من الممكن أن نعدل كود الحذف بحيث يقوم بعملية تعديل للبيانات وجعلها صفر أو null

مع الابقاء علي التسلسل عند الضغط علي زر الحذف


جزاكم الله كل خير

بتاريخ:

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

انة اوقات احنا مبيبقاش مسموح لنا اننا نعمل تيبل فى الداتا بيز

فأحنا عاوزين نحلها من غير منعمل اى تيبل

الاول هنعمل كيرسور يجيب كل التسلسل

ثانيا نجيب اصغر قيمة واكبر قيمة فى التسلسل بدالة
Min and max
نفتح الكيرسور ونضع اول قيمة فى الكيرسور فى متغير

بعد كدة نعمل فورة بدايتها ال Min ونهايتها ال max
وتحتها نعمل جملة if

لو القيمة الحالية للفورة تساوى القيمة اللى جات من الكيرسور
نعملة جملة fetch اخرى

لو لاتساوى المتغير دة نطبع القيمة دى



معلشى انا عارف انى شرحى مش هتفهموة

هسهل عليكم واقرأو الكود بتاع الفانكش دى

set serveroutput on ;

create or replace procedure missing
is
v_min number(5) ;
v_max number(5) ;
v_empno number(5) ;
cursor c_empno is
select empno from emp ;
begin select min(empno),max(empno)
into v_min,v_max from emp; open c_empno ;
fetch c_empno into v_empno ;
for x in v_min..v_max loop
if x = v_empno then
fetch c_empno into v_empno ;
else
dbms_output.put_line(x) ;
end if ;
end loop ;
end ;



واى مشكلة انا ى الخدمة

تم تعديل بواسطة mw_wageeh

بتاريخ:

السلام عليكم
الأخ محمد وجيه(mw_wageeh)

أولا شكرا لنشاطك و عطائك في المنتدي فنحن محتاجين هذا النشاط فعلا ;)

ثانيا يا سيدي أنا أسبقك انت تسبق المهم الناس تستفيد و بقي في حوار أفكار و حلول و الكل يستفيد ;)
و عموما خيرها في غيرها يا سيدي ;)

بالنسبة للمشكلة و حلها أشكرك علي كلامك
و أحب أن أوضح لك انه لست أعتقد انها مشكلة كبيرة في انك غير مسموح لك ان تقوم بانشاء جدول في الداتا بيز
فأذا كان الديفلوبر غير مسموح له بذلك فأعتقد انه اذا طلب إنشاء جدول لأهداف الديفلوبمنت فلن يرفض طلبه :o
بالنسبة للحل الذي أرسلته فقد كنت قد فكرت به و جربته و لكن به مشكلة صغيرة فاتت عليك
و هي ماذا لو كان الرقم المحذوف هو اول رقم في التسلسل او اخر رقم او كلاهما
في هذه الحالة فبعض الارقام لن تستطيع الحصول عليها او بالظبط هي اصغر رقم و اكبر رقم
بمعني لو كان لدي 50 رقم و حذف منهم مثلا رقم 1 و رقم 50 ففي هذه الحالة سيبدا الcursor من رقم 2 الي رقم 49
أليس كذلك؟
و عموما هناك طريقة أخري لعمل ذلك و هي فقط عبارة عن جملة سيليكيت واحدة بدون إنشاء أي جداول اخري او
او عمل فانكشن او كيرسور من اي نوع
و هي تشترط فقط وجود جدول به عدد سجلات اكبر من السجلات الموجودة بجدول التسلسل
و قد استخدمت فيها جدول all_objects
و لكن يمكن استخدام اي جدول اخر به عدد سجلات كاف
و هي مناسب اكثر لجداول التسلسل ذات عدد السجلات القليلة او عند التأكد من وجود جدول به عدد سجلات كاف و هي موجودة في هذا الرابط
كيفية الاستعلام عن الارقام المفقودة من التسلسل
و هذا يذكرني ان أذكر دائما بضرورة البحث قبل كتابة مواضيع جديدة
شكرا لتفاعلك و نشاطك
بالتوفيق

تم تعديل بواسطة hanon_OCP

بتاريخ:

السلام عليكم
انا عندي هالحل ان شاء الله يكون صح


create or replace function get_no return number
is
tot number;
eno number;
eno1 number;
rtn_val number;
cnt number : = 0
cursor c is select empno from emp order by empno;

begin
select count(*) into tot from emp

loop
cnt := cnt + 1;
fetch c into eno;
exit when c%notfound
fetch c into eno1;


if eno <> 1 and cnt = 1 then
rtr_val := 1;
exit;
elsif ((eno1 is not null) and (eno1-eno>1)) or eno1 is null then
rtr_val := eno + 1
exit;
end if;

end loop;

if rtr_val is null and cnt : = 1 then
rtr_val := 1;
end if;

if (rtr_val is null and cnt > 1) or (rtr_val is null and eno := 1) then
rtr_val := eno + 1
end if;

return rtr_val;
end;

تم تعديل بواسطة walid99

بتاريخ:
  • كاتب الموضوع

السلام عليكم ورحمت الله وبركاتة اشكركم جميع على الرد والفعالية التي كنت غير متوقعها بشكل هذا واخص الاخ hanon والاخ MW_WAGEEH والافكار في منتهى الروعة وانا الان بصدد تطبيقها

Regrads
Basalama

بتاريخ:

بسم الله الرحمن الرحيم
السلام عليكم جميعاٌ
أما عن سؤالك فقد فهمت منك أنك تريد استخدام SQL فقط هذا صعب لمثل هذه المقارنات ان لم يكن مستحيلاً.
أما أجوبة الشباب فهي الأفضل ولكن عندي فكرت بطريقة أخرى وأرجو أن تعجبك:

 

create or replace procedure count_gaps(p_first number,p_steep number)
as
v_prior number :=p_first;
v_steep number :=p_steep;
begin
if v_steep is null then
 v_steep:=1;
 end if;
if v_prior is null then
 v_prior:=0;
 end if;
v_prior:=v_prior-v_steep;
 for i in (select empno from emp order by empno)
loop
v_prior:=v_prior+v_steep;
While v_prior<>i.empno loop
 dbms_output.put_line(v_prior);
 v_prior:=v_prior+v_steep;
end loop;
 end loop;
end;



ولكن ستظهر مشكلة في البفر بالرسالة التالية

 

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes


وتقبل الله طاعتكم

  • بعد 7 سنة...
بتاريخ:

الله يعطيك العافيه مشاركه قيمه 

 

حسب فهمي إذا فهمت قصدك

 

ان مثلا لو عندي 50 موظف ومرقمهم بالتسلسل 

 

1-2-3-4-5-6-7-8-9-10

 

وحذفت 11 و 12 و 13 و14 و15

 

راح يكون التسلسل 

 

1-2-3-4-5-6-7-8-9-10-16-17-18-19-20-...... 50

 

 

هل بطريقتك هذه تعيد تقريم التسلسل

 

1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-...... 50 

 

؟؟

 

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

 

لان في بالي اشوف فكره 

 

sequence بشوفها تضبط ولا لا 

بتاريخ:

جرب الجمله دي مع تغير الرقم 100 حسب اخر رقم في التسلسل عندك او ممكن تشيلها وتكتب بدلها select count(*) from your_table 


select rownum from dual connect by level<=100
minus
select number from your_table

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

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

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

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

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

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.