nimo2000 بتاريخ: 7 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 7 يونيو 2006 الاخوة الاعزاءتحية طيبة وبعد اليكم شرح مبسط عن السجلات وكيفية التعامل معها السجل هو تركيب من الداتا يسمح لنا بجمع انواع مختلفة من الداتا ترتبط فيما بينها كوحدة افتراضية واحدة 0 ان اللغة تدعم ثلاثة انواع من السجلات ( التابل – الكيرسور- محدد من قبل المستخدم) 0يعتبر تركيب السجل متماثلا الى حد مع تركيب الصف فى جداول قاعدة البيانات حيث كل عنصر من عناصر السجل لها اسم محدد ويمكن ان تقبل نوعا معينا من البيانات فعلى سبيل المثال لو اردنا تجميع بيانات مختلفة عن شركة مثل ( الاسم – العنوان – عدد الموظفين 00 الخ ) يمثل كل بيان من تلك البيانات بعنصر من عناصر السجل بحيث يأتى تركيب السجل ممثلا لتلك البيانات كوحدة واحدة يسهل التعامل معها 0 تمكننا الخاصية %ROWTYPE من عمل سجلات من نوع التابل كما فى المثال التالىDECLARE course_rec course%ROWTYPE;BEGIN SELECT * INTO course_rec FROM course WHERE course_no = 25; DBMS_OUTPUT.PUT_LINE ('Course No: '|| course_rec.course_no); DBMS_OUTPUT.PUT_LINE ('Course Description: '|| course_rec.description); DBMS_OUTPUT.PUT_LINE ('Prerequisite: '|| course_rec.prerequisite);END; ان السجل المنشأ course_rec فى المثال السابق يماثل تركيب الصف فى الجدول COURSE وهكذا فانه لا يوجد اشارة الى حقل معين فى جملة select .ان السجل فى حد ذاته لا يوجد له قيمة ولكن كل عنصر من عناصر السجل لها قيمة محددة وعلى هذا لعرض محتويات عنصر من عناصر السجل على الشاشة يشار اليه بالنقطة (0) كما فى المثال السابق0 ان العبارة السابقة لها اهميتها الكبيرة " السجل بذاته لا توجد له قيمة " وعلى ذلك تعتبر الجمل التالية غير صحيحةIF course_rec IS NULL THEN …IF course_rec1 = course_rec2 THEN … والمثال التالى يوضح انشاء السجل بناء على كيرسور محددDECLARE CURSOR student_cur IS SELECT first_name, last_name, registration_date FROM student WHERE rownum <= 4; student_rec student_cur%ROWTYPE;BEGIN OPEN student_cur; LOOP FETCH student_cur INTO student_rec; EXIT WHEN student_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('Name: '|| student_rec.first_name||' '|| student_rec.last_name); DBMS_OUTPUT.PUT_LINE ('Registration Date: '|| student_rec.registration_date); END LOOP;END; لاحظ ان السجل student_rec متماثل تماما مع تركيب الكيرسور وعلى هذا فلا يوجد داعى للاشارة الى عنصر محدد بالذات فى جملة Fetch ونقطة هامة جدا وهو ان السجل ممنشأ بناء على كيرسور معين فيتعين لذلك تحديد وتعريف الكيرسور قبل عمل السجل والا ستعطى رسالة خطأ0السجلات المعرفة بواسطة المستخدم : الامر قد يتطلب فى بعض الاحيان تكوين سجلات بدون التقيد بالجداول او الكيرسور وهنا تعطى اللغة الحرية للمستخدم فى تكوين مثل تلك السجلات وتكون الصورة العامة لمثل ذلك النوع كما يلى TYPE type_name IS RECORD (field_name1 datatype1 [NOT NULL] [ := DEFAULT EXPRESSION], field_name2 datatype2 [NOT NULL] [ := DEFAULT EXPRESSION], ... field_nameN datatypeN [NOT NULL] [ := DEFAULT EXPRESSION]);record_name TYPE_NAME;ان بنية السجل تتحدد بالجملة TYPE بينما تشير TYPE_NAME الى اسم نوع السجل ثم فى مرحلة اخرى يتم انشاء السجل نفسه بناء على ذلك النوع 0 داخل الاقواس تحدد عناصر السجل ومن الممكن اضفة القيد Not Null لاى عنصر كما ان العنصر من الممكن ان يأخد قيمة افتراضية 0 انظر المثال التالى DECLARE TYPE time_rec_type IS RECORD (curr_date DATE, curr_day VARCHAR2(12), curr_time VARCHAR2(8) := '00:00:00'); time_rec TIME_REC_TYPE;BEGIN SELECT sysdate INTO time_rec.curr_date FROM dual; time_rec.curr_day := TO_CHAR(time_rec.curr_date, 'DAY'); time_rec.curr_time := TO_CHAR(time_rec.curr_date, 'HH24:MI:SS'); DBMS_OUTPUT.PUT_LINE ('Date: '||time_rec.curr_date); DBMS_OUTPUT.PUT_LINE ('Day: '||time_rec.curr_day); DBMS_OUTPUT.PUT_LINE ('Time: '||time_rec.curr_time);END;فى المثال السابق فان النوع time_rec_type محدد بواسطة المستخدم والذى يحتوى على ثلاثة عناصر او حقول 0 لاحظ فى المثال ان الحقل curr_time قد تم تحديده بقيمة معينة وهى TO_CHAR(time_rec.curr_date, 'HH24:MI:SS') ) وان السجل الفعلى time_rec قد تم انشاءه بناء على النوع المحدد 0 Nested Record ان لغة PL-SQL تسمح بتعريف سجلات متضمنة Nested وهى سجلات تحتوى سجلات اخرى فعلى سبيل المثال DECLARE TYPE name_type IS RECORD (first_name VARCHAR2(15), last_name VARCHAR2(30)); TYPE person_type IS (name name_type, street VARCHAR2(50), city VARCHAR2(25), state VARCHAR2(2), zip VARCHAR2(5)); person_rec person_type;ان ذلك الجزء من الكود يعرف سجلين والسجل الثانى يسمى person_type والذى هو ببساطة سجل متضمن لان حقل name هو من النوع name_type والذى هو السجل الاول 0والان انظر كيفية التعامل مع ذلك النوع من السجلات فى المثال التالىDECLARE TYPE name_type IS RECORD (first_name VARCHAR2(15), last_name VARCHAR2(30)); TYPE person_type IS RECORD (name name_type, street VARCHAR2(50), city VARCHAR2(25), state VARCHAR2(2), zip VARCHAR2(5)); person_rec person_type;BEGIN SELECT first_name, last_name, street_address, city, state, zip INTO person_rec.name.first_name, person_rec.name.last_name, person_rec.street, person_rec.city, person_rec.state, person_rec.zip FROM student JOIN zipcode USING (zip) WHERE rownum < 2; DBMS_OUTPUT.PUT_LINE ('Name: '|| person_rec.name.first_name||' '|| person_rec.name.last_name); DBMS_OUTPUT.PUT_LINE ('Street: '|| person_rec.street); DBMS_OUTPUT.PUT_LINE ('City: '|| person_rec.city); DBMS_OUTPUT.PUT_LINE ('State: '|| person_rec.state); DBMS_OUTPUT.PUT_LINE ('Zip: '|| person_rec.zip);END;تحياتى احمد خليل how_to_make_pl_sql_records.doc اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hobaa بتاريخ: 7 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 7 يونيو 2006 مشكور اخى على هذا الشرح البسيط و المتمكنايهاب وجدى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
m_dba بتاريخ: 28 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 28 يونيو 2006 مشكور اخي وبارك الله فيك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.