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

المطلوب نطلع القيمه الناقصه من التسلسل


GOALONE

Recommended Posts

أنا عندي جدول فيه عمود واحد فيه القيم المتسلسله دية 60 - 61 - 62 - 64 - 65 لاجظ مفيش القيمه 63 انا عايز جملة سيكول على العمود طول مالتسلسل ماشي كويس مفيش مشكله المطلوب يعني نطلع القيمه الناقصه من التسلسل والمفروض ان احنا اصلا مش عارفين القيم والقيم دية مترتبه بس فيه قيمه ناقصه ياريت نعرفها

بس يا شباب يكون جملة سيكول الحل يلريت ساعدوني

رابط هذا التعليق
شارك

الاول هعمل جدول و فى عمود ذى ما انت وصفت :-

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

رابط هذا التعليق
شارك

الأخ / هاني

شكرا لك .. على مشاركاتك الايجابية بالمنتدى .. وسرعة الاستجابة لاسئلة الاعضاء ... جزاك الله خيرا

للمشاركة معك .. وجدت مشاركات سابقة بالمنتدى ... للتعامل مع هذا الموضوع ... ارجوا ان تفيد الجميع

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

وهذه المشاركة ايضا

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

مع التحية

رابط هذا التعليق
شارك

دا اسهل حل
وباستخدام 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


وشكرا

رابط هذا التعليق
شارك

اخى العزيز 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 ) .

بالتوفيق للجميع .

و شكراً

رابط هذا التعليق
شارك

الاخ الكريم
انا كنت بجاوب السؤال اللى الاخ GOALONE كاتبه حرفيا
هو عاوز اول قيم بتضرب لما يحصل على خلل في التسلسل
واعتقد ان الكود الصغير دا كافي
ولكن اجابتك ممتازة مقلتش حاجة وبتجيب كل القيم امفقودة

رابط هذا التعليق
شارك

الأخوة الأعزاء
شكرا علي هذا الكود لكن ماذا اذا اردت عمل ذلك في اي تقرير وهوا معروف في عدة إدارات مثل المخازن(نواقص السيريال (أذون الصرف والإضافة)) قريبا سوف ارسل لكم نسخة تقرير لهذا الموضوع وشكرا

(اللهم لا علم إلا ماعملتنا إنك أنت العليم الخبير)

رابط هذا التعليق
شارك

السلام عليكم
----------------------

بإستخدام مثال الاخ هانى ممكن عمل هذا الاستعلام ليحدد القيم الناقصة

SELECT ROWNUM missing_values
 FROM dict WHERE ROWNUM < (SELECT MAX (ID)
                  FROM v) MINUS
SELECT ID
 FROM v;




ولكن مع ملاحظة استخدام جدول يحتوع على صفوف كتيرة ( فى هذا المثال اسخدمت dict او dictionary )
--------------------------------------------

رابط هذا التعليق
شارك

أخى الكريم llord

شكراً لكودك الجيد ..... و لكن ماذا اذا كانت عدد صفوف العمود الذى به القيم الناقصة اكثر من صفوف جدول ال Dictionary !!!!!!!!

انا عندى حل لكودك ....... ده كودك بعد معالجته بالطريقة الملائمة :-

SELECT     ROWNUM missing_values
     FROM DUAL CONNECT BY LEVEL < (SELECT MAX (ID)
                     FROM v) MINUS
SELECT ID
 FROM v;



و شكراً

رابط هذا التعليق
شارك

شكرا جزيلا يا مهندسين على الحلول والمناقشات الرائعه والتي قد افادتني كثيرا واتمنى التوفيق لكم جميعل واعذروني لعدم المشاركه المستمره هذه الأيام بسبب ظروف الامتحانات .
سلامي الى الجميع

رابط هذا التعليق
شارك

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

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

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

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

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

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

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