Oracle حزمة PL/SQL: النوع والمواصفات والنص [مثال]

ما هي الحزمة في Oracle?

حزمة PL/SQL عبارة عن تجميع منطقي لبرنامج فرعي (إجراء/وظيفة) مرتبط في عنصر واحد. يتم تجميع الحزمة وتخزينها ككائن قاعدة بيانات يمكن استخدامه لاحقًا.

مكونات الحزم

تحتوي حزمة PL/SQL على مكونين.

  • حزمة المواصفات
  • جسم الحزمة

حزمة المواصفات

مواصفات الحزمة تتكون من إعلان لجميع الجمهور المتغيراتوالمؤشرات والكائنات والإجراءات والوظائف والاستثناءات.

فيما يلي بعض خصائص مواصفات الحزمة.

  • يمكن الوصول إلى العناصر التي تم الإعلان عنها جميعًا في المواصفات من خارج الحزمة. تُعرف هذه العناصر بالعنصر العام.
  • مواصفات الحزمة هي عنصر مستقل مما يعني أنها يمكن أن توجد بمفردها بدون نص الحزمة.
  • كلما قامت الحزمة بإحالة مثيل للحزمة، يتم إنشاء مثيل لهذه الجلسة المحددة.
  • بعد إنشاء المثيل للجلسة، تكون كافة عناصر الحزمة التي تم بدؤها في هذا المثيل صالحة حتى نهاية الجلسة.

بناء الجملة

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

يوضح بناء الجملة أعلاه إنشاء مواصفات الحزمة.

جسم الحزمة

وهو يتألف من تعريف كافة العناصر الموجودة في مواصفات الحزمة. يمكن أيضًا أن تحتوي على تعريف للعناصر التي لم يتم التصريح عنها في المواصفات، وتسمى هذه العناصر بالعناصر الخاصة ويمكن استدعاؤها فقط من داخل الحزمة.

وفيما يلي خصائص جسم الحزمة.

  • يجب أن يحتوي على تعريفات لجميع البرامج الفرعية/المؤشرات التي تم الإعلان عنها في المواصفات.
  • يمكن أن يحتوي أيضًا على المزيد من البرامج الفرعية أو العناصر الأخرى التي لم يتم الإعلان عنها في المواصفات. وتسمى هذه العناصر الخاصة.
  • إنه كائن يمكن الاعتماد عليه، ويعتمد على مواصفات الحزمة.
  • تصبح حالة نص الحزمة "غير صالحة" عندما يتم تجميع المواصفات. لذلك، يجب إعادة ترجمتها في كل مرة بعد تجميع المواصفات.
  • يجب تعريف العناصر الخاصة أولاً قبل استخدامها في نص الحزمة.
  • الجزء الأول من الحزمة هو جزء الإعلان العالمي. يتضمن ذلك المتغيرات والمؤشرات والعناصر الخاصة (إعلان إعادة التوجيه) المرئية للحزمة بأكملها.
  • الجزء الأخير من الحزمة هو جزء تهيئة الحزمة الذي يتم تنفيذه مرة واحدة عند إحالة الحزمة لأول مرة في الجلسة.

بناء الجملة:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>
  • يوضح بناء الجملة أعلاه إنشاء نص الحزمة.

الآن سنرى كيفية إحالة عناصر الحزمة في البرنامج.

الرجوع إلى عناصر الحزمة

بمجرد الإعلان عن العناصر وتعريفها في الحزمة، نحتاج إلى إحالة العناصر لاستخدامها.

يمكن الإشارة إلى جميع العناصر العامة للحزمة عن طريق استدعاء اسم الحزمة متبوعًا باسم العنصر مفصولاً بنقطة، أي ' . '.

يمكن أيضًا استخدام المتغير العام للحزمة بنفس الطريقة لتعيين وجلب القيم منها، أي ' . '.

إنشاء حزمة في PL/SQL

في PL/SQL، عندما تتم إحالة/استدعاء حزمة في جلسة ما، سيتم إنشاء مثيل جديد لتلك الحزمة.

Oracle يوفر وسيلة لتهيئة عناصر الحزمة أو تنفيذ أي نشاط في وقت إنشاء هذا المثيل من خلال "تهيئة الحزمة".

هذه ليست سوى كتلة تنفيذ مكتوبة في نص الحزمة بعد تحديد جميع عناصر الحزمة. سيتم تنفيذ هذه الكتلة عندما تتم إحالة الحزمة لأول مرة في الجلسة.

بناء الجملة

إنشاء حزمة في PL/SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • يوضح بناء الجملة أعلاه تعريف تهيئة الحزمة في نص الحزمة.

التصريحات إلى الأمام

إن الإعلان/المرجع الأمامي في الحزمة ليس سوى إعلان العناصر الخاصة بشكل منفصل وتحديدها في الجزء الأخير من نص الحزمة.

لا يمكن إحالة العناصر الخاصة إلا إذا تم الإعلان عنها بالفعل في نص الحزمة. لهذا السبب، يتم استخدام الإعلان إلى الأمام. ولكن من غير المعتاد استخدامه لأنه في معظم الأوقات يتم الإعلان عن العناصر الخاصة وتعريفها في الجزء الأول من نص الحزمة.

الإعلان الأمامي هو خيار مقدم من Oracle، إنه ليس إلزاميًا واستخدامه وعدم استخدامه يعود إلى متطلبات المبرمج.

التصريحات إلى الأمام

بناء الجملة:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

يوضح بناء الجملة أعلاه الإعلان الأمامي. يتم الإعلان عن العناصر الخاصة بشكل منفصل في الجزء الأمامي من الحزمة، وقد تم تعريفها في الجزء اللاحق.

استخدام المؤشرات في الحزمة

على عكس العناصر الأخرى، يجب على المرء توخي الحذر عند استخدام المؤشرات داخل الحزمة.

إذا تم تعريف المؤشر في مواصفات الحزمة أو في الجزء العام من نص الحزمة، فسيستمر المؤشر بمجرد فتحه حتى نهاية الجلسة.

لذلك يجب دائمًا استخدام سمات المؤشر '%ISOPEN' للتحقق من حالة المؤشر قبل إحالته.

الحمولة الزائدة

التحميل الزائد هو مفهوم وجود العديد من البرامج الفرعية بنفس الاسم. ستختلف هذه البرامج الفرعية عن بعضها البعض بعدد المعلمات أو أنواع المعلمات أو نوع الإرجاع، أي برنامج فرعي يحمل نفس الاسم ولكن بعدد مختلف من المعلمات، ويعتبر النوع المختلف من المعلمات أو إعادة الكتابة المختلفة بمثابة تحميل زائد.

يكون هذا مفيدًا عندما تحتاج العديد من البرامج الفرعية إلى القيام بنفس المهمة، ولكن يجب أن تكون طريقة استدعاء كل منها مختلفة. في هذه الحالة، سيتم الاحتفاظ بنفس اسم البرنامج الفرعي للجميع وسيتم تغيير المعلمات وفقًا لبيان الاستدعاء.

مثال 1: في هذا المثال، سنقوم بإنشاء حزمة للحصول على قيم معلومات الموظف وتعيينها في جدول "emp". ستعيد الدالة get_record مخرجات نوع السجل لرقم الموظف المحدد، وسيقوم إجراء set_record بإدراج سجل نوع السجل في جدول emp.

الخطوة 1) إنشاء مواصفات الحزمة

الحمولة الزائدة

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set:
/

الإخراج:

Package created

شرح الكود

  • سطر الكود 1-5: إنشاء مواصفات الحزمة لـ guru99_get_set بإجراء واحد ووظيفة واحدة. وهذان العنصران الآن عنصران عامان في هذه الحزمة.

الخطوة 2) تحتوي الحزمة على نص الحزمة، حيث سيتم تعريف كافة الإجراءات والوظائف الفعلية. في هذه الخطوة، يتم إنشاء نص الحزمة.

الحمولة الزائدة

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS	
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no
RETURN l_emp_rec;
END get_record;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

الإخراج:

Package body created

شرح الكود

  • سطر الكود 7: إنشاء نص الحزمة.
  • سطر الكود 9-16: تحديد العنصر "set_record" المعلن عنه في المواصفات. وهذا هو نفس تعريف الإجراء المستقل في PL/SQL.
  • سطر الكود 17-24: تحديد العنصر "get_record". إنه نفس تعريف الوظيفة المستقلة.
  • سطر الكود 25-26: تحديد جزء تهيئة الحزمة.

الخطوة 3) إنشاء كتلة مجهولة لإدراج السجلات وعرضها من خلال الرجوع إلى الحزمة التي تم إنشاؤها أعلاه.

الحمولة الزائدة

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms output.put line(‘Insert new record for employee 1004');
l_emp_rec.emp_no:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_emp_rec);
dbms_output.put_line(‘Record inserted');
dbms output.put line(‘Calling get function to display the inserted record'):
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);
dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);
dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');
dbms output.put line(‘Employee manager:‘||1_get_rec.manager);		
END:
/

الإخراج:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

شرح الكود:

  • سطر الكود 34-37: نشر البيانات لمتغير نوع السجل في كتلة مجهولة لاستدعاء عنصر "set_record" الخاص بالحزمة.
  • سطر الكود 38: تم إجراء الاتصال بـ "set_record" لحزمة guru99_get_set. تم الآن إنشاء مثيل للحزمة وستستمر حتى نهاية الجلسة.
  • يتم تنفيذ جزء تهيئة الحزمة نظرًا لأن هذا هو الاستدعاء الأول للحزمة.
  • تم إدراج السجل بواسطة عنصر "set_record" في الجدول.
  • سطر الكود 41: استدعاء عنصر 'get_record' لعرض تفاصيل الموظف المدرج.
  • تتم إحالة الحزمة للمرة الثانية أثناء استدعاء 'get_record' للحزمة. ولكن لم يتم تنفيذ جزء التهيئة هذه المرة حيث تمت تهيئة الحزمة بالفعل في هذه الجلسة.
  • سطر الكود 42-45: طباعة بيانات الموظف.

التبعية في الحزم

نظرًا لأن الحزمة عبارة عن تجميع منطقي للأشياء ذات الصلة، فإنها تحتوي على بعض التبعيات. فيما يلي التبعيات التي يجب الاهتمام بها.

  • المواصفات هي كائن مستقل.
  • يعتمد جسم الحزمة على المواصفات.
  • يمكن تجميع نص الحزمة بشكل منفصل. كلما تم تجميع المواصفات، يحتاج الجسم إلى إعادة ترجمة لأنه سيصبح غير صالح.
  • يجب تعريف البرنامج الفرعي في نص الحزمة الذي يعتمد على عنصر خاص فقط بعد إعلان العنصر الخاص.
  • يجب أن تكون كائنات قاعدة البيانات المشار إليها في المواصفات والنص في حالة صالحة في وقت تجميع الحزمة.

حزمة معلومات

بمجرد إنشاء معلومات الحزمة، تصبح معلومات الحزمة مثل مصدر الحزمة وتفاصيل البرنامج الفرعي وتفاصيل التحميل الزائد متاحة في Oracle جداول تعريف البيانات

يوضح الجدول أدناه جدول تعريف البيانات ومعلومات الحزمة المتوفرة في الجدول.

اسم الطاولة الوصف سؤال
ALL_OBJECT يعطي تفاصيل الحزمة مثل object_id وتاريخ الإنشاء وlast_ddl_time وما إلى ذلك. وسوف يحتوي على الكائنات التي أنشأها جميع المستخدمين. SELECT * FROM all_objects حيث object_name =' '
USER_OBJECT يعطي تفاصيل الحزمة مثل object_id وتاريخ الإنشاء وlast_ddl_time وما إلى ذلك. وسوف يحتوي على الكائنات التي أنشأها المستخدم الحالي. حدد * من كائنات المستخدم حيث اسم_الكائن =' '
ALL_SOURCE يعطي مصدر الكائنات التي أنشأها جميع المستخدمين. حدد * من all_source حيث الاسم = ' '
USER_SOURCE يعطي مصدر الكائنات التي أنشأها المستخدم الحالي. حدد * من user_source حيث الاسم = ' '
جميع الإجراءات يعطي تفاصيل البرنامج الفرعي مثل object_id وتفاصيل التحميل الزائد وما إلى ذلك التي أنشأها جميع المستخدمين. حدد * من كافة الإجراءات
حيث object_name =' '
USER_PROCEDURES يعطي تفاصيل البرنامج الفرعي مثل object_id وتفاصيل التحميل الزائد وما إلى ذلك التي أنشأها المستخدم الحالي. حدد * من إجراءات المستخدم
حيث object_name =' '

ملف UTL – نظرة عامة

ملف UTL هو حزمة الأدوات المساعدة المنفصلة التي يوفرها Oracle لأداء مهام خاصة. يستخدم هذا بشكل أساسي لقراءة وكتابة ملفات نظام التشغيل من حزم PL/SQL أو البرامج الفرعية. يحتوي على وظائف منفصلة لوضع المعلومات والحصول على المعلومات من الملفات. كما يسمح بالقراءة/الكتابة في مجموعة الأحرف الأصلية.

يمكن للمبرمج استخدام هذا الأمر لكتابة ملفات نظام التشغيل من أي نوع، وسيتم كتابة الملف مباشرة إلى خادم قاعدة البيانات. وسيتم ذكر الاسم ومسار الدليل في وقت الكتابة.

الملخص

لقد تعلمنا الآن الحزم الموجودة في PL / SQLويجب أن تكون الآن قادرًا على العمل فيما يلي.

  • حزم PL/SQL ومكوناتها
  • خصائص الحزم
  • الإشارة والتحميل الزائد لعناصر الحزمة
  • إدارة التبعيات في الحزم
  • عرض معلومات الحزمة
  • ما هو ملف UTL