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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

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


2 رد (ردود) على هذا الموضوع

#1 nimo2000

nimo2000

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 343 مشاركة

تاريخ المشاركة 07 June 2006 - 02:09 PM

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



تحياتى
احمد خليل

ملفات مرفقة


وفقنا الله جميعا لتعلم العلم النافع ونشره والعمل بـــه

ارحب باستقبال رسائلكم على البريد الالكترونى
Nimo20012001@yahoo.com
---------------------------------------------------------------------------------------------------

#2 hobaa

hobaa

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 980 مشاركة

تاريخ المشاركة 07 June 2006 - 07:00 PM

مشكور اخى على هذا الشرح البسيط و المتمكن

ايهاب وجدى


Oracle Developer

Oracle DBA
Oracle Instructor

Egypto-Soft



#3 m_dba

m_dba

    عضو نشط

  • الأعضــاء
  • 238 مشاركة
  • الاسم الأول:Ahmad
  • اسم العائلة:Zaki
  • البـلـد: Country Flag

تاريخ المشاركة 28 June 2006 - 06:20 AM

مشكور اخي وبارك الله فيك
امسح ذنوبك في دقيقتين - بس دقيقتين وشوف

http://www.shbab1.com/2minutes.htm