بتاريخ: 30 مارس 200817 سنة comment_125596 أنا عندي جدول فيه عمود واحد فيه القيم المتسلسله دية 60 - 61 - 62 - 64 - 65 لاجظ مفيش القيمه 63 انا عايز جملة سيكول على العمود طول مالتسلسل ماشي كويس مفيش مشكله المطلوب يعني نطلع القيمه الناقصه من التسلسل والمفروض ان احنا اصلا مش عارفين القيم والقيم دية مترتبه بس فيه قيمه ناقصه ياريت نعرفهابس يا شباب يكون جملة سيكول الحل يلريت ساعدوني تقديم بلاغ
بتاريخ: 30 مارس 200817 سنة comment_125629 الاول هعمل جدول و فى عمود ذى ما انت وصفت :- 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 تقديم بلاغ
بتاريخ: 30 مارس 200817 سنة comment_125634 الأخ / هاني شكرا لك .. على مشاركاتك الايجابية بالمنتدى .. وسرعة الاستجابة لاسئلة الاعضاء ... جزاك الله خيرا للمشاركة معك .. وجدت مشاركات سابقة بالمنتدى ... للتعامل مع هذا الموضوع ... ارجوا ان تفيد الجميع إضغط هنا : معرفة الفواتير الساقطة من السيريلوهذه المشاركة ايضا إضغط هنا : معرفة الارقام الغير ضمن الارقام متسلسلة واستغلالهامع التحية تقديم بلاغ
بتاريخ: 31 مارس 200817 سنة comment_125649 دا اسهل حل وباستخدام 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 وشكرا تقديم بلاغ
بتاريخ: 31 مارس 200817 سنة comment_125661 اخى العزيز 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 ) .بالتوفيق للجميع .و شكراً تقديم بلاغ
بتاريخ: 31 مارس 200817 سنة comment_125677 الاخ الكريمانا كنت بجاوب السؤال اللى الاخ GOALONE كاتبه حرفياهو عاوز اول قيم بتضرب لما يحصل على خلل في التسلسلواعتقد ان الكود الصغير دا كافيولكن اجابتك ممتازة مقلتش حاجة وبتجيب كل القيم امفقودة تقديم بلاغ
بتاريخ: 31 مارس 200817 سنة comment_125679 الأخوة الأعزاء شكرا علي هذا الكود لكن ماذا اذا اردت عمل ذلك في اي تقرير وهوا معروف في عدة إدارات مثل المخازن(نواقص السيريال (أذون الصرف والإضافة)) قريبا سوف ارسل لكم نسخة تقرير لهذا الموضوع وشكرا(اللهم لا علم إلا ماعملتنا إنك أنت العليم الخبير) تقديم بلاغ
بتاريخ: 1 أبريل 200817 سنة comment_125718 السلام عليكم----------------------بإستخدام مثال الاخ هانى ممكن عمل هذا الاستعلام ليحدد القيم الناقصة SELECT ROWNUM missing_values FROM dict WHERE ROWNUM < (SELECT MAX (ID) FROM v) MINUS SELECT ID FROM v; ولكن مع ملاحظة استخدام جدول يحتوع على صفوف كتيرة ( فى هذا المثال اسخدمت dict او dictionary )-------------------------------------------- تقديم بلاغ
بتاريخ: 1 أبريل 200817 سنة comment_125802 أخى الكريم llordشكراً لكودك الجيد ..... و لكن ماذا اذا كانت عدد صفوف العمود الذى به القيم الناقصة اكثر من صفوف جدول ال Dictionary !!!!!!!!انا عندى حل لكودك ....... ده كودك بعد معالجته بالطريقة الملائمة :- SELECT ROWNUM missing_values FROM DUAL CONNECT BY LEVEL < (SELECT MAX (ID) FROM v) MINUS SELECT ID FROM v; و شكراً تقديم بلاغ
بتاريخ: 2 أبريل 200817 سنة كاتب الموضوع comment_125874 شكرا جزيلا يا مهندسين على الحلول والمناقشات الرائعه والتي قد افادتني كثيرا واتمنى التوفيق لكم جميعل واعذروني لعدم المشاركه المستمره هذه الأيام بسبب ظروف الامتحانات . سلامي الى الجميع تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.