محمد باسلامة بتاريخ: 21 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2006 (معدل) السلام عليكم عندي مشكلة ارغب في ايجاد حل :معي دالة الارقام المتسلسلة في حالة حذف اي عمود يكو هناك ارقام متسلسلة غير مستغلة كيف يمكن ايجاد تلك الرقام الغير مستعملة ومن ضمن التسلسل بواسطة جملة استعلامMohammed Basalama تم تعديل 21 ديسمبر 2006 بواسطة محمد باسلامة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
هانى سند بتاريخ: 21 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2006 السلام عليكم عندي فكرة لعمل ما تحتاجه ممكن أن تفيدك و هو عمل جدول أخر به كل الاأرقام المتسلسة من الجدول الأصلي و بالطبع عند إضافة اي رقم تسلسلس جديد يتم إضافته في هذا الجدول ثم عند عمل أي حذف من الجدول المتسلسل يمكنك بعدها إيجاد الارقام المفقودة بجملية 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 صف و أرجو التفاعل مع الموضوع حيث أنه من المواضيع المهمة بالتوفيق 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jamal_rrkk بتاريخ: 21 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2006 السلام عليكم ورحمة الله وبركاتهيمكن انشاء جدول يحتوي علي عمود للتسلسل فقط وانشاء trigger عند كل عملية حذف يقوم بترحيل التسلسل المحذوف لهذا الجدول وعند اي عملية ادخال مطابقة لهذا التسلسل يقوم بحذف التسلسل من الجدل سؤال : هل من الممكن أن نعدل كود الحذف بحيث يقوم بعملية تعديل للبيانات وجعلها صفر أو null مع الابقاء علي التسلسل عند الضغط علي زر الحذفجزاكم الله كل خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mw_wageeh بتاريخ: 21 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2006 (معدل) السلام عليكمبجد مش عارف اقولك اية اخ 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 ; واى مشكلة انا ى الخدمة تم تعديل 21 ديسمبر 2006 بواسطة mw_wageeh اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
هانى سند بتاريخ: 21 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 21 ديسمبر 2006 (معدل) السلام عليكم الأخ محمد وجيه(mw_wageeh) أولا شكرا لنشاطك و عطائك في المنتدي فنحن محتاجين هذا النشاط فعلا ثانيا يا سيدي أنا أسبقك انت تسبق المهم الناس تستفيد و بقي في حوار أفكار و حلول و الكل يستفيد و عموما خيرها في غيرها يا سيدي بالنسبة للمشكلة و حلها أشكرك علي كلامك و أحب أن أوضح لك انه لست أعتقد انها مشكلة كبيرة في انك غير مسموح لك ان تقوم بانشاء جدول في الداتا بيز فأذا كان الديفلوبر غير مسموح له بذلك فأعتقد انه اذا طلب إنشاء جدول لأهداف الديفلوبمنت فلن يرفض طلبه بالنسبة للحل الذي أرسلته فقد كنت قد فكرت به و جربته و لكن به مشكلة صغيرة فاتت عليك و هي ماذا لو كان الرقم المحذوف هو اول رقم في التسلسل او اخر رقم او كلاهما في هذه الحالة فبعض الارقام لن تستطيع الحصول عليها او بالظبط هي اصغر رقم و اكبر رقم بمعني لو كان لدي 50 رقم و حذف منهم مثلا رقم 1 و رقم 50 ففي هذه الحالة سيبدا الcursor من رقم 2 الي رقم 49أليس كذلك؟و عموما هناك طريقة أخري لعمل ذلك و هي فقط عبارة عن جملة سيليكيت واحدة بدون إنشاء أي جداول اخري او او عمل فانكشن او كيرسور من اي نوعو هي تشترط فقط وجود جدول به عدد سجلات اكبر من السجلات الموجودة بجدول التسلسل و قد استخدمت فيها جدول all_objectsو لكن يمكن استخدام اي جدول اخر به عدد سجلات كاف و هي مناسب اكثر لجداول التسلسل ذات عدد السجلات القليلة او عند التأكد من وجود جدول به عدد سجلات كاف و هي موجودة في هذا الرابط كيفية الاستعلام عن الارقام المفقودة من التسلسلو هذا يذكرني ان أذكر دائما بضرورة البحث قبل كتابة مواضيع جديدة شكرا لتفاعلك و نشاطك بالتوفيق تم تعديل 21 ديسمبر 2006 بواسطة hanon_OCP اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
walid99 بتاريخ: 22 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 22 ديسمبر 2006 (معدل) السلام عليكمانا عندي هالحل ان شاء الله يكون صحcreate or replace function get_no return numberistot number;eno number;eno1 number;rtn_val number;cnt number : = 0cursor c is select empno from emp order by empno;beginselect count(*) into tot from emploopcnt := cnt + 1;fetch c into eno;exit when c%notfoundfetch c into eno1;if eno <> 1 and cnt = 1 thenrtr_val := 1;exit;elsif ((eno1 is not null) and (eno1-eno>1)) or eno1 is null thenrtr_val := eno + 1exit;end if;end loop;if rtr_val is null and cnt : = 1 thenrtr_val := 1;end if;if (rtr_val is null and cnt > 1) or (rtr_val is null and eno := 1) thenrtr_val := eno + 1end if;return rtr_val;end; تم تعديل 22 ديسمبر 2006 بواسطة walid99 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
محمد باسلامة بتاريخ: 23 ديسمبر 2006 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 23 ديسمبر 2006 السلام عليكم ورحمت الله وبركاتة اشكركم جميع على الرد والفعالية التي كنت غير متوقعها بشكل هذا واخص الاخ hanon والاخ MW_WAGEEH والافكار في منتهى الروعة وانا الان بصدد تطبيقهاRegradsBasalama اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
amsh بتاريخ: 29 ديسمبر 2006 تقديم بلاغ مشاركة بتاريخ: 29 ديسمبر 2006 بسم الله الرحمن الرحيمالسلام عليكم جميعاٌأما عن سؤالك فقد فهمت منك أنك تريد استخدام 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 وتقبل الله طاعتكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmed Al-Bin Shaikh بتاريخ: 23 مارس 2014 تقديم بلاغ مشاركة بتاريخ: 23 مارس 2014 الله يعطيك العافيه مشاركه قيمه حسب فهمي إذا فهمت قصدك ان مثلا لو عندي 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 بشوفها تضبط ولا لا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
HELL-BOY بتاريخ: 23 مارس 2014 تقديم بلاغ مشاركة بتاريخ: 23 مارس 2014 جرب الجمله دي مع تغير الرقم 100 حسب اخر رقم في التسلسل عندك او ممكن تشيلها وتكتب بدلها select count(*) from your_table select rownum from dual connect by level<=100 minus select number from your_table اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.