GOALONE بتاريخ: 30 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 30 مارس 2008 أنا عندي جدول فيه عمود واحد فيه القيم المتسلسله دية 60 - 61 - 62 - 64 - 65 لاجظ مفيش القيمه 63 انا عايز جملة سيكول على العمود طول مالتسلسل ماشي كويس مفيش مشكله المطلوب يعني نطلع القيمه الناقصه من التسلسل والمفروض ان احنا اصلا مش عارفين القيم والقيم دية مترتبه بس فيه قيمه ناقصه ياريت نعرفهابس يا شباب يكون جملة سيكول الحل يلريت ساعدوني اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 30 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 30 مارس 2008 الاول هعمل جدول و فى عمود ذى ما انت وصفت :- create table v ( id number ); insert into v values (1); insert into v values (2); insert into v values (4); insert into v values (5); insert into v values (6); insert into v values (8); insert into v values (9); insert into v values (10); insert into v values (11); insert into v values (12); SQL> select * from v; ID ---------- 1 2 4 5 6 8 9 10 11 12 10 rows selected. SQL> commit; Commit complete. بعد كده هنعمل كود بال PL/SQL علشان نحدد القيم الناقصة ( اللى هى ال 3 وال 7 فى الكود السابق ذكره ) ...... من الصعب عمل select query علشان نحدد القيم الناقصة ... ده على حد علمى المتواضع .هذا هو الكود الذى سيجد القيم الناقصة :- DECLARE v_cursor INTEGER; v_cur1 INTEGER; v_val NUMBER; v_ret INTEGER; v_tab VARCHAR2(200) := '&Table_Name'; v_pkey VARCHAR2(100) := '&Primary_key'; v_where VARCHAR2(5000) := nvl('&Where_Clause',' '); v_next_num NUMBER := 1; v_sql VARCHAR2(6000) := 'SELECT a.'||v_pkey||'+'||v_next_num|| ' FROM '||v_tab||' a, '||v_tab||' b WHERE a.'||v_pkey||'+'||v_next_num||' = b.'||v_pkey||' (+) AND b.'||v_pkey||' IS NULL AND a.'||v_pkey||' <> (SELECT max(z.'||v_pkey||') FROM '||v_tab||' z) '||v_where||' ORDER BY '||'a.'||v_pkey; v_new_sql VARCHAR2(8000); v_value NUMBER; v_ignore INTEGER; v_new_value NUMBER; BEGIN v_cursor := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_cursor,v_sql,DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(v_cursor,1,v_value); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE('Missing Values'); DBMS_OUTPUT.PUT_LINE('--------------'); DBMS_OUTPUT.PUT_LINE(' '); v_ignore := DBMS_SQL.EXECUTE(v_cursor); LOOP v_ret := DBMS_SQL.FETCH_ROWS(v_cursor); EXIT WHEN v_ret = 0; DBMS_SQL.COLUMN_VALUE(v_cursor,1,v_value); v_next_num:=1; v_new_value:=v_value-1; LOOP v_next_num:=v_next_num+1; v_new_sql:='SELECT a.'||v_pkey||'+'||v_next_num||' FROM '||v_tab||' a, '||v_tab||' b WHERE a.'||v_pkey||'+'||v_next_num||' = b.'||v_pkey||' (+) AND b.'||v_pkey||' IS NULL AND a.'||v_pkey||' <> (SELECT max(z.'||v_pkey||') FROM ' ||v_tab||' z) AND a.'||v_pkey||' = '||v_new_value; v_cur1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_cur1,v_new_sql,DBMS_SQL.NATIVE); v_ignore:=DBMS_SQL.EXECUTE(v_cur1); v_ret:=DBMS_SQL.FETCH_ROWS(v_cur1); DBMS_SQL.CLOSE_CURSOR(v_cur1); IF v_ret = 0 THEN IF v_next_num = 2 THEN DBMS_OUTPUT.PUT_LINE(to_char(v_value)); IF DBMS_SQL.IS_OPEN(v_cur1) THEN DBMS_SQL.CLOSE_CURSOR(v_cur1); END IF; EXIT; END IF; DBMS_OUTPUT.PUT_LINE(to_char(v_value)||'-'||to_char(v_new_value+v_next_num-1)); IF DBMS_SQL.IS_OPEN(v_cur1) THEN DBMS_SQL.CLOSE_CURSOR(v_cur1); END IF; EXIT; END IF; END LOOP; END LOOP; DBMS_SQL.CLOSE_CURSOR(v_cursor); END; / المصدر من هذا الرابط :-http://www.oracle.com/technology/oramag/co...003/090703.htmlبس الكود فيه مشكلة فى الموقع .... و انا صلحتها ..... انت ممكن تجرب الكود اللى فى الموقع و كودى المرفق ( او اللى مكتوب فى هذه المشاركة ) و انت تتأكد من كلامى .فى حاجه كمان انت بعد تنفيذ الكود .... هيطلب منك 3 حاجات .... الاول اسم الجدول و الثانى اسم العمود و ثالث حاجه ابقى دوس Enter على طول من لوحة المفاتيح ..... كما فى الشكل التالى :- SQL> @missing_number.sql Enter value for table_name: v old 7: v_tab VARCHAR2(200) := '&Table_Name'; new 7: v_tab VARCHAR2(200) := 'v'; Enter value for primary_key: id old 8: v_pkey VARCHAR2(100) := '&Primary_key'; new 8: v_pkey VARCHAR2(100) := 'id'; Enter value for where_clause: old 9: v_where VARCHAR2(5000) := nvl('&Where_Clause',' '); new 9: v_where VARCHAR2(5000) := nvl('',' '); Missing Values -------------- 3 7 PL/SQL procedure successfully completed. الفكرة فى المطلب الثالث فى انك لو عاوز تحدد القيم الناقصة من رقم اللى رقم معين ، مش على كل العمود .ارجو ان تكون الفكرة وضحة .و بالتوفيق . missing_number.txt اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 30 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 30 مارس 2008 الأخ / هاني شكرا لك .. على مشاركاتك الايجابية بالمنتدى .. وسرعة الاستجابة لاسئلة الاعضاء ... جزاك الله خيرا للمشاركة معك .. وجدت مشاركات سابقة بالمنتدى ... للتعامل مع هذا الموضوع ... ارجوا ان تفيد الجميع إضغط هنا : معرفة الفواتير الساقطة من السيريلوهذه المشاركة ايضا إضغط هنا : معرفة الارقام الغير ضمن الارقام متسلسلة واستغلالهامع التحية اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ebnalqym بتاريخ: 31 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 دا اسهل حل وباستخدام SQL فقط CREATE TABLE T1 ( C1 NUMBER); INSERT INTO T1 VALUES(60); INSERT INTO T1 VALUES(61); INSERT INTO T1 VALUES(62); INSERT INTO T1 VALUES(64); INSERT INTO T1 VALUES(65); INSERT INTO T1 VALUES(66); COMMIT; وبمنتهي البساطة select v.cc from (select t1.C1+1 cc from t1 where t1.C1 not in (select max(t1.C1) from t1 ) )v , t1 m where v.cc = m.c1 (+) and m.c1 is null وشكرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 31 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 اخى العزيز ebnalqymشكراً لمشاركتك ...... و لكن كودك غير دقيق للأسف ....... حيث لم يأتى بالقيم المتتالية الناقصة ..... بمعنى :- SQL> select * from v; -- ID ---------- 1 2 4 5 6 8 9 10 11 12 13 ID ---------- 14 18 19 20 15 rows selected. SQL> SELECT h.cc 2 FROM (SELECT v.id + 1 cc 3 FROM v 4 WHERE v.id NOT IN (SELECT MAX (v.id) 5 FROM v)) h, 6 v m 7 WHERE h.cc = m.id(+) AND m.id IS NULL; CC ---------- 3 15 7 SQL> @missing_number.sql Enter value for table_name: v old 7: v_tab VARCHAR2(200) := '&Table_Name'; new 7: v_tab VARCHAR2(200) := 'v'; Enter value for primary_key: id old 8: v_pkey VARCHAR2(100) := '&Primary_key'; new 8: v_pkey VARCHAR2(100) := 'id'; Enter value for where_clause: old 9: v_where VARCHAR2(5000) := nvl('&Where_Clause',' '); new 9: v_where VARCHAR2(5000) := nvl('',' '); Missing Values -------------- 3 7 15-17 PL/SQL procedure successfully completed. انا ضفت قيم متسلسلة لجدولى مع اسقاط ال 15 ، 16 ، 17 ........ كودك جاب رقم 15 لكن لم يحدد الأرقام الاخرى الناقصةلكن الكود الذى احضرته من موقع اوراكل دقيق للغاية حيث حدد القيم الناقصة كما رأيت ( 15-17 ) .بالتوفيق للجميع .و شكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ebnalqym بتاريخ: 31 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 الاخ الكريمانا كنت بجاوب السؤال اللى الاخ GOALONE كاتبه حرفياهو عاوز اول قيم بتضرب لما يحصل على خلل في التسلسلواعتقد ان الكود الصغير دا كافيولكن اجابتك ممتازة مقلتش حاجة وبتجيب كل القيم امفقودة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mohamedhanyhekal بتاريخ: 31 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 31 مارس 2008 الأخوة الأعزاء شكرا علي هذا الكود لكن ماذا اذا اردت عمل ذلك في اي تقرير وهوا معروف في عدة إدارات مثل المخازن(نواقص السيريال (أذون الصرف والإضافة)) قريبا سوف ارسل لكم نسخة تقرير لهذا الموضوع وشكرا(اللهم لا علم إلا ماعملتنا إنك أنت العليم الخبير) اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
llord بتاريخ: 1 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 السلام عليكم----------------------بإستخدام مثال الاخ هانى ممكن عمل هذا الاستعلام ليحدد القيم الناقصة SELECT ROWNUM missing_values FROM dict WHERE ROWNUM < (SELECT MAX (ID) FROM v) MINUS SELECT ID FROM v; ولكن مع ملاحظة استخدام جدول يحتوع على صفوف كتيرة ( فى هذا المثال اسخدمت dict او dictionary )-------------------------------------------- اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hanyfreedom بتاريخ: 1 أبريل 2008 تقديم بلاغ مشاركة بتاريخ: 1 أبريل 2008 أخى الكريم llordشكراً لكودك الجيد ..... و لكن ماذا اذا كانت عدد صفوف العمود الذى به القيم الناقصة اكثر من صفوف جدول ال Dictionary !!!!!!!!انا عندى حل لكودك ....... ده كودك بعد معالجته بالطريقة الملائمة :- SELECT ROWNUM missing_values FROM DUAL CONNECT BY LEVEL < (SELECT MAX (ID) FROM v) MINUS SELECT ID FROM v; و شكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
GOALONE بتاريخ: 2 أبريل 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 أبريل 2008 شكرا جزيلا يا مهندسين على الحلول والمناقشات الرائعه والتي قد افادتني كثيرا واتمنى التوفيق لكم جميعل واعذروني لعدم المشاركه المستمره هذه الأيام بسبب ظروف الامتحانات . سلامي الى الجميع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.