NoorAdiga بتاريخ: 21 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 21 يوليو 2008 السلام عليكمالمطلوب مني هو المقارنة بين recordsفي جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال ifولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecordsفي الجدول الاول ... واقارن كل ريكور بالجدول التاني واذا لما اجد ال recordفي الجدول الثاني .. اريد ان اعرض viewان هذا الريكورد ناقص بدون ان اعمل editوعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record من الجدول الاول والغير موجودة في لجدول التاني فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..record by record ?????اتمنى وجود بعض المساعدة لانه اول برنامج pl sqlاريد كتابته شكرا للجميع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sameh bakkar بتاريخ: 21 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 21 يوليو 2008 رجاء التوضيح أكثر من ذلك .. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mohooo81 بتاريخ: 21 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 21 يوليو 2008 السلام عليكمالمطلوب مني هو المقارنة بين recordsفي جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال ifولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecordsفي الجدول الاول ... واقارن كل ريكور بالجدول التاني واذا لما اجد ال recordفي الجدول الثاني .. اريد ان اعرض viewان هذا الريكورد ناقص بدون ان اعمل editوعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record من الجدول الاول والغير موجودة في لجدول التاني فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..record by record ?????اتمنى وجود بعض المساعدة لانه اول برنامج pl sqlاريد كتابته شكرا للجميع انا مش فاهم ولا كلمة اللى انتة عايزة دة اورراكل صح؟؟؟؟؟؟؟؟؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
NoorAdiga بتاريخ: 22 يوليو 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 صباح الخير .... اوك راح اعيد المشكلة بتفصيل اكثر ... وان شا الله بمشي الحالبداية عنا مؤسسة اسمها x بتخزن بيانات خاصة فيها بجدول اسمه x.xوفي مؤسسة ثانية متعاقدة مع المؤسسة الاولى لتاخد البيانات منها وتعملها interfaceباستعمال جدول اخر باسماء column مختلفينوطريقة توزيع البيانات مختلفة بين الجدولين ...يعني قد يكون ريكورد واحد في x.xانتقل ل 2 recordsعلى ال interface tableالسبب برجع لطريقة توزيع pkالمطلوب انه اثناء نقل البيانات ... في جزء من ال recordsما انتقل من الجدول x.x لل interfaceانا ما بهمني غير اني اوجد هي الريكوردز اللي مش منتقلة ما بهمني صحة اللي انتقل او اذا ال interfaceفيه بيانات اكتر من الجدول x.xيعني اتجاه التدقيق بس منx.x الى interfaceبتخيل هيك وضحكت المشكلة ..... انا فكرت باستعمال SQLلاعرض الريكورد اللي ما انتقلو ... وضيعت وقتي ع الفاضي بهي القصة لما سالت حكولي لازم استعمل plsqlواعمل مؤشر يمشي من الجدول x.xويقارن الداتا بال interface انا ما عندي خبرة بال pl sqlانما بعرف اعمل مؤشر ومش عارفة لما الاقي record مش موجود بال interfaceبقدر اعرضه مباشرة او اخزنه بمكان ؟ وازا بدي اخزنه .. كيف ؟؟مشـــــــــــــكورين .... شكرا ... شكرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 22 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 والله يا أخي أنا كذلك مش فاهم ، بس هحاول أترجم ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecordsفي الجدول الاول ... واقارن كل ريكور بالجدول التاني أنت تقصد أنك عايز تعمل 2 Cursor ، بحيث أن كل كيرسور يرتجع مجموعة معينة من السجلات من جدول مناسب ، وطبعاً كل كيرسور يحتوي علي نفس أعمدة الكيرسور الآخر علشان تتم عملية المقارنة !!!أوك ، نفرض أننا لدينا جدولين ، الأول Emp1 والثاني Emp2 ، كما يحتويان علي حقلين Emp_No, Emp_Name .... علشان تقارن بين الجدولين إليك الطريقة الصحيحة :Declare Cursor C1 Is Select * From Emp1 Order By Emp_No; Cursor C1 Is Select * From Emp2 Order By Emp_No; ID_No1 Emp1.Emp_No%Type; ID_Name1 Emp1.Emp_Name%Type; ID_No2 Emp2.Emp_No%Type; ID_Name2 Emp2.Emp_Name%Type; Begin Open C1; Open C2; Fetch C1 Into ID_No1, ID_Name1; Fetch C2 Into ID_No2, ID_Name2; While C1%Found Loop Fetch C1 Into ID_No1, ID_Name1; If(C2%NotFound)Then Fetch C2 Into ID_No2, ID_Name2; End If; If(ID_No1 = ID_No2)Then DBMS_Output.Put_Line(ID_No1); End If; If(ID_Name1 = ID_Name2)Then DBMS_Output.Put_Line(ID_Name1); End If; End Loop; Close C1; Close C2; End; / واذا لما اجد ال recordفي الجدول الثاني .. اريد ان اعرض viewان هذا الريكورد ناقص بدون ان اعمل edit الذي فهمته من هذا الكلام أنك عايز ترتجع القيم المتساوية علي هيئة سجلات يمكنك إستخدامها في أي وقت من خارج القاعدة !!!لكن المثال السابق الذي أدرجته لك لا يقوم بهذه المهمة ، بل كل مهمته هو عرض ناتج التساوي مباشرتاً علي نافذة الـ SQL*Plus ، لكنها لا ترتجع مجموعة سجلات !!!الحل في هذه الحالة أنك تعمل Function يقوم بإرتجاع الجدول المطلوب ( أبحث بالمنتدي فستجد أمثلة متعددة ) ... عموماً هذا هو التعديل علي المثال السابق :Create Or Replace Type O_Emp Is Object(Emp_No Number(10), Emp_Name VarChar2(20)); / Create Or Replace Type T_Emp Is Table Of O_Emp; / Create Or Replace Function Get_Emp Return T_Emp As Cursor C1 Is Select * From Emp1 Order By Emp_No; Cursor C1 Is Select * From Emp2 Order By Emp_No; ID_No1 Emp1.Emp_No%Type; ID_Name1 Emp1.Emp_Name%Type; ID_No2 Emp2.Emp_No%Type; ID_Name2 Emp2.Emp_Name%Type; P_Return T_Emp := T_Emp(); Begin Open C1; Open C2; Fetch C1 Into ID_No1, ID_Name1; Fetch C2 Into ID_No2, ID_Name2; While C1%Found Loop Fetch C1 Into ID_No1, ID_Name1; If(C2%NotFound)Then Fetch C2 Into ID_No2, ID_Name2; End If; If(ID_No1 = ID_No2) And (ID_Name1 = ID_Name2)Then P_Return(P_Return.Count) := O_Emp(ID_No1,ID_Name); End If; End Loop; Close C1; Close C2; Return P_Return; End; / ولإستدعاء هذا الفنكشن يمكنك كما يلي : Select * From Table(Get_Emp); وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record من الجدول الاول والغير موجودة في لجدول التاني من واضح أنك عايز تبحث في الجدول الثاني ، لو كان السجل مش موجود في الجدول الأول تأخذ البيانات من الجدول الثاني وتدرجة في الجدول الأول ( بس أنت كدة شقلبت السؤال ، وشقلبت دماغي كمان ) علي العموم لو كان هذا ما تقصدة غير الكود السابق كما يلي : If(ID_No1 = ID_No2) And (ID_Name1 = ID_Name2)Then Insert Into Emp1(Emp_No1, Emp_Name1) Values(ID_No1,ID_Name); Commit; End If; ولكن بالطبع بتلغي عملية الإرتجاع كجدول ، يعني تلغي الـ Function وتجعلة Procedure !!! يارب أكون عرفت أترجم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
NoorAdiga بتاريخ: 24 يوليو 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 24 يوليو 2008 شكـــــــــــــــــرا كتير كتير كتير ع الرد المميز ... كتير استفدت من الكود اللي بعتلي اياه انا حبيت احط المشكلة بالتفصيل مع حلها مشان اي حد تاني يستفيد ان شا الله بداية ... عندي جدولين ... بدي اقارن الrecords فيهمواطلع السجلات الناقصة ... وبس اعرضها بال outputهو الصعوبة بالموضوع انو ممكن سجل جوا ال banner يماثل من سجل لخمسة جوا ال khحسب الايام ... هي طريقة ضعيفة لانشاء جدول .. انما الجدول موجود جاهز وعلينا نتعايش معهاول خطوة ... بدي اعمل الجدولين على SQL create table banner( term_code varchar2(10), crn varchar2(10), building varchar2(6), room varchar2(6), start_time number(4)not null, end_time number(4)not null, u varchar2(1), m varchar2(1), t varchar2(1), w varchar2(1), s varchar2(1), primary key(term_code,crn,building,room,start_time,end_time)) ; create table kh( term_code varchar2(10), crn varchar2(10), building varchar2(6), room varchar2(6), start_time number(4)not null, end_time number(4)not null, weekday number(1)not null, primary key(term_code,crn,building,room,start_time,end_time,weekday)); تاني خطوة ... بندخل بيانات جواتهم .. بصير شكلهم كالتاليTERM_CODE CRN BUILDI ROOM START_TIME END_TIME U M T W S---------- ---------- ------ ------ ---------- ---------- - - - - -200910 10003 MQ17 104 900 1215 U T200910 10003 MQ12 104 800 9000 U T200910 12345 MQ23 123 1100 1250 M W200910 12099 MQ23 103 800 900 STERM_CODE CRN BUILDI ROOM START_TIME END_TIME WEEKDAY---------- ---------- ------ ------ ---------- ---------- ----------200910 10003 MQ17 104 900 1215 1200910 10003 MQ17 104 900 1215 2200910 12099 MQ23 103 800 900 5200910 10003 MQ12 104 800 9000 2200910 10003 MQ12 104 800 9000 4200910 12099 MQ23 M103 800 900 1واخر خطوة هي pl sql declare /*declare the counters for banner and for kh */ kh_counter number := default Null; banner_counter number(3); /* declare banner cursor */ cursor banner_cur is select * from banner where term_code= '200910'; /* declare banner record */ banner_rec banner_cur%ROWTYPE; /* declare kh cursor which is a cursor with parameter */ cursor kh_cur (p_term_code varchar2, p_crn varchar2, p_building varchar2, p_start_time number, p_end_time number) is select * from kh where term_code= p_term_code and crn= p_crn and building = p_building and start_time = p_start_time and end_time= p_end_time; /* declare kh record */ kh_rec kh_cur%ROWTYPE; BEGIN DBMS_output.PUT_LINE('Lets start'); /* open the banner cursor if its not already opened */ IF NOT banner_cur%ISOPEN THEN open banner_cur; END IF; /* fetch the banner cursor into the banner record and then start the loop */ loop FETCH banner_cur INTO banner_rec; EXIT WHEN banner_cur%NOTFOUND; /* we want to know that this record how many record it will present in kh table depending on the days the we store this value in the banner_counter*/ banner_counter := 0; /* intialize the counter to zerp */ IF banner_rec.u = 'U' /* if the value is null then it will be treated as false*/ Then :banner_counter := banner_counter +1 ; END IF; IF banner_rec.m = 'M' Then :banner_counter := banner_counter +1 ; END IF; IF banner_rec.t = 'T' Then :banner_counter := banner_counter +1 ; END IF; IF banner_rec.w = 'W' Then :banner_counter := banner_counter +1 ; END IF; IF banner_rec.s = 'S' Then :banner_counter := banner_counter +1 ; END IF; /* open the kh cursor and passing it's argument from banner record to make sure we have the same records in the ACTIVE SET to the current record in banner */ open kh_cur (banner_rec.term_code, banner_rec.crn, banner_rec.building, banner_rec.start_time, banner_rec.end_time); /*intialize the kh counter for the match records to zero then we will start a counter to fetch all the records in the active set till the active set is empty and the number of records are stored int he kh_counter*/ kh_counter := 0; loop FETCH kh_cur INTO kh_rec; EXIT WHEN kh_cur%NotFOUND; :kh_counter := kh_counter +1 ; END LOOP; close kh_cur; /* now 2 check for missing record all what we need to do is to compare the two counters value */ IF banner_counter > kh_counter THEN DBMS_output.PUT_LINE( 'The CRN = ' || banner_rec.crn ||'have missing record/records in khadamat table '); END IF; END LOOP; CLOSE banner_cur; END; ارفقت صورتين لتوضيح طريقة عمل الكود .... اي سؤال او استفسار انا جاهزة ومرة تانية ... شكرا لكل اللي رد على سؤالي نـــــــــــــــــور اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.