Oracle البرنامج التعليمي لأنواع كائنات PL/SQL مع الأمثلة
ما هو نوع الكائن في PL/SQL؟
البرمجة الموجهة للكائنات مناسبة بشكل خاص لبناء مكونات قابلة لإعادة الاستخدام وتطبيقات معقدة. فهي منظمة حول "الكائنات" بدلاً من "الإجراءات"، أي أن البرامج مصممة للعمل والتفاعل مع الكائن بالكامل بدلاً من الإجراء الفردي. يسمح هذا المفهوم للمبرمج بملء التفاصيل والتلاعب بها على مستوى كيانات الكائن.
توضح الصورة أدناه مثالاً لنوع الكائن الذي يعتبر فيه الحساب البنكي كيانًا كائنًا. تتضمن سمات الكائن الأشياء التي تحتفظ ببعض قيم السمات، على سبيل المثال في الحساب البنكي؛ إنه رقم الحساب والرصيد البنكي وما إلى ذلك بينما تصف أساليب الكائن أشياء مثل حساب سعر الفائدة وإنشاء كشف حساب مصرفي وما إلى ذلك مما يتطلب إكمال عملية معينة.
تعتمد البرمجة الشيئية في PL/SQL على أنواع الكائنات.
يمكن أن يمثل نوع الكائن أي كيان في العالم الحقيقي. سنناقش المزيد من أنواع الكائنات في هذا الفصل.
مكونات أنواع الكائنات
PL / SQL يحتوي نوع الكائن بشكل أساسي على مكونين.
- السمات
- الأعضاء/الأساليب
السمات
السمات هي العمود أو الحقل الذي يتم تخزين البيانات فيه. سيتم تعيين كل سمة إلى نوع البيانات الذي يحدد نوع المعالجة والتخزين لتلك السمة. يمكن أن تكون السمة صالحة نوع البيانات بل/SQLأو يمكن أن يكون من نوع كائن آخر.
الأعضاء/الأساليب
الأعضاء أو الأساليب هي برامج فرعية تم تعريفها في نوع الكائن. ولا يتم استخدامها لتخزين أي بيانات. يتم استخدامها بشكل أساسي لتحديد العملية داخل نوع الكائن. للحصول على أمثلة التحقق من صحة البيانات قبل نشر نوع الكائن. تم الإعلان عنها في قسم نوع الكائن وتم تعريفها في قسم نص نوع الكائن الخاص بنوع الكائن. قسم الجسم في نوع الكائن هو جزء اختياري. إذا لم يكن هناك أي أعضاء، فلن يحتوي نوع الكائن على أي جزء من الجسم.
إنشاء كائن في Oracle
لا يمكن إنشاء نوع الكائن على مستوى البرنامج الفرعي، بل يمكن إنشاؤه فقط على مستوى المخطط. بمجرد تعريف نوع الكائن في المخطط، يمكن استخدام نفس الشيء في البرامج الفرعية. يمكن إنشاء نوع الكائن باستخدام "CREATE TYPE". لا يمكن إنشاء نص الكتابة إلا بعد إنشاء نوع الكائن الخاص به.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
شرح بناء الجملة:
- يُظهر بناء الجملة أعلاه إنشاء "OBJECT" بالسمات و"OBJECT-BODY" بالطرق.
- يمكن أيضًا تحميل الأساليب بشكل زائد في نص الكائن.
تهيئة الإعلان عن نوع الكائن
مثل المكونات الأخرى في PL/SQL، يلزم أيضًا الإعلان عن أنواع الكائنات قبل استخدامها في البرنامج.
بمجرد إنشاء نوع الكائن، يمكن استخدامه في القسم التعريفي للبرنامج الفرعي للإعلان عن متغير من نوع الكائن هذا.
عندما يتم الإعلان عن أي متغير في البرنامج الفرعي كنوع كائن، سيتم إنشاء مثيل جديد لنوع الكائن في وقت التشغيل، ويمكن إحالة هذا المثيل المنشأ حديثًا إلى اسم المتغير. بهذه الطريقة، يمكن لنوع كائن واحد تخزين قيم متعددة ضمن مثيلات مختلفة.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
شرح بناء الجملة:
- يُظهر بناء الجملة أعلاه تعريف المتغير كنوع كائن في القسم التعريفي.
بمجرد إعلان المتغير كنوع كائن في برنامج فرعي، فسوف يكون فارغًا ذريًا، أي أن الكائن بأكمله سيكون فارغًا. يجب تهيئته بالقيم لاستخدامه في البرنامج. يمكن تهيئته باستخدام المنشئين.
المُنشئون هم الطريقة الضمنية للكائن الذي يمكن الإشارة إليه بنفس اسم نوع الكائن. يوضح بناء الجملة أدناه تهيئة نوع الكائن.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
شرح بناء الجملة:
- يُظهر بناء الجملة أعلاه تهيئة مثيل نوع الكائن بقيمة فارغة.
- الآن الكائن نفسه ليس خاليًا كما تمت تهيئته، ولكن السمات الموجودة داخل الكائن ستكون فارغة لأننا لم نخصص أي قيم لهذه السمات.
الصانعين
المُنشئون هم الطريقة الضمنية للكائن الذي يمكن الإشارة إليه بنفس اسم نوع الكائن. عندما تتم الإشارة إلى الكائن لأول مرة، سيتم استدعاء هذا المنشئ ضمنيًا.
يمكننا أيضًا تهيئة الكائنات باستخدام هذه المُنشئة. يمكن تعريف المنشئ بشكل صريح عن طريق تحديد العضو في نص نوع الكائن الذي يحمل نفس اسم نوع الكائن.
مثال 1:في المثال التالي، سنستخدم عضو نوع الكائن لإدراج السجل في جدول emp بالقيم ('RRR'، 1005، 20000، 1000) و('PPP'، 1006، 20000، 1001). بمجرد إدراج البيانات، سنعرضها باستخدام عضو نوع الكائن. سنستخدم أيضًا المنشئ الصريح لملء معرف المدير افتراضيًا بقيمة 1001 للسجل الثاني.
سنقوم بتنفيذ ذلك في الخطوات أدناه.
- Step1:
- إنشاء نوع الكائن
- جسم نوع الكائن
- الخطوة 2: إنشاء كتلة مجهولة لاستدعاء نوع الكائن الذي تم إنشاؤه من خلال المُنشئ الضمني لـ emp_no 1005.
- الخطوة 3: إنشاء كتلة مجهولة لاستدعاء نوع الكائن الذي تم إنشاؤه من خلال مُنشئ صريح لـ emp_no 1006.
الخطوة 1) إنشاء نوع الكائن وجسم نوع الكائن
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
CREATE OR REPLACE TYPE BODY emp_object AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_output.put_line(’Constructor fired..');
SELF.emp_no:=p_emp_no;|
SELF.emp_name:=p_emp_name;
SELF.salary:=p_salary;
SELF.managerial:=1001;
RETURN;
END:
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_name,salary,manager);
END
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_output.put_line('Employee Name:'||emp_name);
Dbms_output.put_line('Employee Number:'||emp_no);
Dbms_output.put_line('Salary':'||salary);
Dbms_output.put_line('Manager:'||manager);
END:
END:
/
شرح الكود
- سطر الكود 1-9: إنشاء نوع الكائن "emp_object" بأربع سمات و4 أعضاء. أنه يحتوي على تعريف المنشئات مع 3 معلمات فقط. (سيحتوي المنشئ الضمني الفعلي على عدد من المعلمات يساوي عدد السمات الموجودة في نوع الكائن)
- سطر الكود 10: إنشاء نوع الجسم.
- سطر الكود 11-21: تحديد المنشئ الصريح. تعيين قيمة المعلمة للسمات وتعيين قيمة السمة "المدير" بالقيمة الافتراضية "1001".
- سطر الكود 22-26: تحديد العضو "insert_records" الذي يتم فيه إدراج قيم السمات في جدول "emp".
- سطر الكود 27-34: تعريف العضو 'display_records' الذي يتم فيه عرض قيم سمات نوع الكائن.
الناتج
تم إنشاء النوع
نوع الجسم الذي تم إنشاؤه
الخطوة 2) إنشاء كتلة مجهولة لاستدعاء نوع الكائن الذي تم إنشاؤه من خلال مُنشئ ضمني لـ emp_no 1005
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,’RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
شرح الكود
- سطر الكود 37-45: إدراج السجلات باستخدام المنشئ الضمني. يحتوي استدعاء المنشئ على العدد الفعلي لقيم السمات.
- سطر الكود 38:يعلن guru_emp_det كنوع الكائن 'emp_object'.
- سطر الكود 41:تم استدعاء العبارة 'guru_emp_det.display_records' لوظيفة العضو 'diplay_records' ويتم عرض قيم السمات
- سطر الكود 42: البيان 'guru_emp_det.insert_records' يسمى وظيفة العضو 'insert_records' ويتم إدراج قيم السمات في الجدول.
الناتج
اسم الموظف: RRR
رقم الموظف: 1005
الراتب: 20000
المدير: 1000
الخطوة 3) إنشاء كتلة مجهولة لاستدعاء نوع الكائن الذي تم إنشاؤه من خلال مُنشئ صريح لـ emp_no 1006
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
الناتج
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
شرح الكود:
- سطر الكود 46-53: إدراج السجلات باستخدام المنشئ الصريح.
- سطر الكود 46:يعلن guru_emp_det كنوع الكائن 'emp_object'.
- سطر الكود 50:تم استدعاء العبارة 'guru_emp_det.display_records' لدالة العضو 'display_records' ويتم عرض قيم السمات
- سطر الكود 51: البيان 'guru_emp_det.insert_records' يسمى وظيفة العضو 'insert_records' ويتم إدراج قيم السمات في الجدول.
الوراثة في نوع الكائن
تسمح خاصية الوراثة لنوع الكائن الفرعي بالوصول إلى جميع السمات وأعضاء نوع الكائن الفائق أو نوع الكائن الأصلي.
يُسمى نوع الكائن الفرعي بنوع الكائن الموروث، ويسمى نوع الكائن الفائق بنوع الكائن الأصلي. يوضح بناء الجملة أدناه كيفية إنشاء نوع الكائن الأصل والموروث.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
شرح بناء الجملة:
- يوضح بناء الجملة أعلاه إنشاء نوع SUPER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
شرح بناء الجملة:
- يوضح بناء الجملة أعلاه إنشاء نوع SUB. أنه يحتوي على كافة الأعضاء والسمات من نوع الكائن الأصل.
Example1: في المثال أدناه، سنستخدم خاصية الميراث لإدراج السجل الذي يحمل معرف المدير "1002" للسجل التالي ('RRR'، 1007، 20000).
سنقوم بتنفيذ البرنامج المذكور أعلاه بالخطوات التالية
- الخطوة 1: إنشاء نوع SUPER.
- الخطوة 2: إنشاء نوع SUB ونصه.
- الخطوة 3: إنشاء كتلة مجهولة لاستدعاء النوع SUB.
الخطوة 1) قم بإنشاء نوع SUPER أو نوع الأصل.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
شرح الكود:
- سطر الكود 1-9: إنشاء نوع الكائن "emp_object" بأربع سمات و4 أعضاء. أنه يحتوي على تعريف المنشئات مع 3 معلمات فقط. لقد تم الإعلان عنه على أنه "ليس نهائيًا" لذا فهو من النوع الأصلي.
الخطوة 2) قم بإنشاء نوع SUB ضمن النوع SUPER.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name:salary,manager): END; END; /
شرح الكود:
- سطر الكود 10-13: إنشاء sub_emp_object كنوع موروث مع سمة إضافية واحدة "default_manager" وإعلان إجراء العضو.
- سطر الكود 14: إنشاء نص لنوع الكائن الموروث.
- سطر الكود 16-21: تحديد إجراء العضو وهو إدراج السجلات في جدول "emp" مع القيم من نوع الكائن "SUPER"، باستثناء قيمة المدير. بالنسبة لقيمة المدير، فهو يستخدم "default_manager" من النوع "SUB".
الخطوة 3) إنشاء كتلة مجهولة لاستدعاء النوع SUB
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
شرح الكود:
- سطر الكود 25: الإعلان عن "guru_emp_det" كنوع "sub_emp_object".
- سطر الكود 27: تهيئة الكائن باستخدام المنشئ الضمني. يحتوي المنشئ على 5 معلمات (4 سمات من النوع PARENT وسمتين من النوع SUB). تحدد المعلمة الأخيرة (2) قيمة السمة default_manager
- سطر الكود 28: استدعاء العضو "insert_default_mgr" لإدراج السجلات بمعرف المدير الافتراضي الذي تم تمريره في المُنشئ.
المساواة بين كائنات PL/SQL
يمكن مقارنة مثيل الكائن الذي ينتمي إلى نفس الكائنات لتحقيق المساواة. لهذا، نحتاج إلى طريقة خاصة في نوع الكائن تسمى طريقة "ORDER".
يجب أن تكون طريقة "ORDER" هذه هي الوظيفة التي تُرجع النوع الرقمي. يأخذ معلمتين كمدخلات، (المعلمة الأولى: معرف مثيل الكائن الذاتي، المعلمة الثانية: معرف مثيل كائن آخر).
تتم مقارنة معرف مثيل الكائنين، ويتم إرجاع النتيجة رقمية.
- تمثل القيمة الموجبة أن مثيل كائن SELF أكبر من مثيل آخر.
- تمثل القيمة السالبة أن مثيل الكائن SELF أقل من مثيل آخر.
- يمثل الصفر أن مثيل كائن SELF يساوي مثيلًا آخر.
- إذا كان أي من الحالات فارغة، فسوف ترجع هذه الوظيفة فارغة.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
RETURN INTEGER IS
BEGIN
IF <attribute_name>parameter <attribute_name>THEN
RETURN -1; --any negative number will do
ELSIF id>c.id THEN
RETURN 1; —any positive number will do
ELSE
RETURN 0;
END IF;
END;
.
.
);
/
شرح بناء الجملة:
- يُظهر بناء الجملة أعلاه وظيفة ORDER التي يجب تضمينها في نص النوع للتحقق من المساواة.
- يجب أن تكون معلمة هذه الوظيفة مثيلًا لنفس نوع الكائن.
- يمكن تسمية الدالة أعلاه باسم "obj_instance_1.match(obj_instance_2)" وسيقوم هذا التعبير بإرجاع القيمة الرقمية كما هو موضح، حيث obj_instance_1 وobj_instance_2 هما مثيل object_type_name.
Example1:في المثال التالي سنرى كيفية مقارنة كائنين. سنقوم بإنشاء مثيلين وسنقارن السمة 'salary' بينهما. سنقوم بتنفيذ خطوتين int.
- الخطوة 1: إنشاء نوع الكائن وجسمه
- الخطوة 2: إنشاء كتلة مجهولة للاتصال بمثيل الكائن.
الخطوة 1) إنشاء نوع الكائن والجسم.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF: END; END; /
شرح الكود:
- سطر الكود 1-4: إنشاء نوع الكائن "emp_object_equality" بسمة واحدة وعضو واحد.
- سطر الكود 6-16:تعريف دالة ORDER التي تقارن بين سمة "salary" لمثيل SELF ونوع مثيل المعلمة. وترجع قيمة سالبة إذا كان راتب SELF أقل أو موجبة إذا كان راتب SELF أكبر و0 إذا كانت الرواتب متساوية.
إخراج الكود:
تم إنشاء النوع
الخطوة 2) إنشاء كتلة مجهولة للاتصال بمثيل الكائن.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equalS(l_obj_2)>0 THEN Dbms_output.put_line(’Salary of first instance is greater’): ELSIF l_obj_l.equalS(l_obj_2)<0 THEN Dbms_output.put_line(’Salary of second instance is greater’); ELSE Dbms_output.put_line(’Salaries are equal’); END IF; END; /
الناتج
Salary of second instance is greater
شرح الكود:
- سطر الكود 20: الإعلان عن l_obj_1 من نوع emp_object_equality.
- سطر الكود 21: الإعلان عن l_obj_2 من نوع emp_object_equality.
- سطر الكود 23: تهيئة l_obj_1 بقيمة الراتب "15000"
- سطر الكود 24: تهيئة l_obj_1 بقيمة الراتب "17000"
- سطر الكود 25-33: اطبع الرسالة بناءً على رقم الإرجاع من وظيفة ORDER.
ملخص
لقد رأينا في هذا الفصل نوع الكائن وخصائصه. لقد ناقشنا أيضًا حول المنشئين والأعضاء والسمات والميراث والمساواة في كائنات PL/SQL.


















