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

مساعدة لكود باستعمال المؤشر


NoorAdiga

Recommended Posts

السلام عليكم
المطلوب مني هو المقارنة بين records
في جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال if
ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecords
في الجدول الاول ... واقارن كل ريكور بالجدول التاني
واذا لما اجد ال record
في الجدول الثاني .. اريد ان اعرض view
ان هذا الريكورد ناقص بدون ان اعمل edit
وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record
من الجدول الاول والغير موجودة في لجدول التاني
فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..
record by record
?????

اتمنى وجود بعض المساعدة لانه اول برنامج pl sql
اريد كتابته :rolleyes:
شكرا للجميع
:rolleyes:

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

السلام عليكم
المطلوب مني هو المقارنة بين records
في جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال if
ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecords
في الجدول الاول ... واقارن كل ريكور بالجدول التاني
واذا لما اجد ال record
في الجدول الثاني .. اريد ان اعرض view
ان هذا الريكورد ناقص بدون ان اعمل edit
وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record
من الجدول الاول والغير موجودة في لجدول التاني
فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..
record by record
?????

اتمنى وجود بعض المساعدة لانه اول برنامج pl sql
اريد كتابته :rolleyes:
شكرا للجميع
:rolleyes:



انا مش فاهم ولا كلمة اللى انتة عايزة دة اورراكل صح؟؟؟؟؟؟؟؟؟
رابط هذا التعليق
شارك

صباح الخير .... اوك راح اعيد المشكلة بتفصيل اكثر ... وان شا الله بمشي الحال

بداية عنا مؤسسة اسمها 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
بقدر اعرضه مباشرة او اخزنه بمكان ؟ وازا بدي اخزنه .. كيف ؟؟


مشـــــــــــــكورين .... شكرا ... شكرا

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

والله يا أخي أنا كذلك مش فاهم ، بس هحاول أترجم :D :D

ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض ال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
من الجدول الاول والغير موجودة في لجدول التاني


من واضح أنك عايز تبحث في الجدول الثاني ، لو كان السجل مش موجود في الجدول الأول تأخذ البيانات من الجدول الثاني وتدرجة في الجدول الأول ( بس أنت كدة شقلبت السؤال ، وشقلبت دماغي كمان ) :rolleyes: :rolleyes: :rolleyes:

علي العموم لو كان هذا ما تقصدة غير الكود السابق كما يلي :

	  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 !!!



يارب أكون عرفت أترجم

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

شكـــــــــــــــــرا كتير كتير كتير ع الرد المميز ... كتير استفدت من الكود اللي بعتلي اياه :lol:
:D :) :D :)
انا حبيت احط المشكلة بالتفصيل مع حلها مشان اي حد تاني يستفيد ان شا الله

بداية ... عندي جدولين ... بدي اقارن ال
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 T
200910 10003 MQ12 104 800 9000 U T
200910 12345 MQ23 123 1100 1250 M W
200910 12099 MQ23 103 800 900 S


TERM_CODE CRN BUILDI ROOM START_TIME END_TIME WEEKDAY
---------- ---------- ------ ------ ---------- ---------- ----------
200910 10003 MQ17 104 900 1215 1
200910 10003 MQ17 104 900 1215 2
200910 12099 MQ23 103 800 900 5
200910 10003 MQ12 104 800 9000 2
200910 10003 MQ12 104 800 9000 4
200910 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;




ارفقت صورتين لتوضيح طريقة عمل الكود .... اي سؤال او استفسار انا جاهزة
ومرة تانية ... شكرا لكل اللي رد على سؤالي
:D

نـــــــــــــــــور

post-67597-1216880722_thumb.jpg

post-67597-1216881048_thumb.jpg

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

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

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

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

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

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

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

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