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

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


محمد باسلامة

Recommended Posts

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

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

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

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

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

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

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

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

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