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

سجلات pl-sql المعنى وكيفية الاستخدام


nimo2000

Recommended Posts

الاخوة الاعزاء
تحية طيبة وبعد
اليكم شرح مبسط عن السجلات وكيفية التعامل معها
السجل هو تركيب من الداتا يسمح لنا بجمع انواع مختلفة من الداتا ترتبط فيما بينها كوحدة افتراضية واحدة 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

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

  • بعد 3 أسابيع...

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

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

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

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

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

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

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