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

⚡ ملخص ذكي

تجمع حزم PL/SQL الإجراءات والدوال والمتغيرات والمؤشرات والاستثناءات ذات الصلة في كائن مخطط واحد يتضمن مواصفات وجسمًا. تُعلن المواصفات عن الواجهة العامة، بينما يحتوي الجسم على التنفيذ الخاص، مما يُحسّن من قابلية التجزئة والأداء.

  • 📦 تعريف الحزمة: الحزمة هي مجموعة منطقيةping من البرامج الفرعية والكائنات ذات الصلة، يتم تجميعها وتخزينها ككائن قاعدة بيانات واحد.
  • 📋 مواصفات العبوة: يُعلن عن المتغيرات العامة والمؤشرات والأنواع والاستثناءات والإجراءات والوظائف التي يمكن الوصول إليها من خارج الحزمة.
  • 🧱 محتويات العبوة: يحدد كل عنصر تم الإعلان عنه في المواصفات، بالإضافة إلى العناصر الخاصة التي لا يمكن استدعاؤها إلا من داخل الحزمة.
  • 🔁 التحميل الزائد: قد تشترك عدة برامج فرعية في اسم واحد عندما يختلف عدد المعلمات أو أنواع المعلمات أو نوع الإرجاع الخاص بها.
  • 🔗 الإحالة والتبعية: يتم استدعاء العناصر العامة باسم package_name.element_name، ويبقى الجسم معتمدًا على المواصفات.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي مثل GitHub Copilot بصياغة مواصفات الحزم، والهياكل، والبرامج الفرعية المحملة بشكل زائد من تعليق.

Oracle مواصفات حزمة PL/SQL ونظرة عامة على بنية الجسم

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

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

مكونات الحزم

تتكون حزمة 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>
.
BEGIN
<Package Initialization> 
END <package_name>

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

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

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

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

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

تُظهر لقطة الشاشة أدناه كيفية تعريف عنصر خاص مسبقًا ثم تعريفه لاحقًا في نص الحزمة.

التصريح المسبق عن عنصر خاص في Oracle نص حزمة PL/SQL

بناء الجملة:

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) إنشاء مواصفات الحزمة

تُظهر لقطة الشاشة أدناه عملية إنشاء مواصفات حزمة guru99_get_set في Oracle.

إنشاء مواصفات حزمة guru99_get_set باستخدام set_record و get_record في Oracle

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

Code تفسير

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

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

تُظهر لقطة الشاشة أدناه تعريف نص حزمة guru99_get_set في Oracle.

تعريف جسم حزمة guru99_get_set باستخدام set_record و get_record وكتلة التهيئة

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;
BEGIN
dbms_output.put_line('Control is now executing the package initialization part');
END guru99_get_set;
/

الإخراج:

Package body created

Code تفسير

  • Code السطر 7: إنشاء محتوى الحزمة.
  • Code الأسطر 9-16: تعريف العنصر 'set_record' المُعلن عنه في المواصفات. وهذا يُشابه تعريف إجراء مستقل في لغة PL/SQL.
  • Code الأسطر 17-24: تعريف العنصر 'get_record'. وهو مماثل لتعريف دالة مستقلة.
  • Code الأسطر 25-26: تحديد جزء تهيئة الحزمة.

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

تُظهر لقطة الشاشة أدناه الكتلة المجهولة التي تستدعي الحزمة، بالإضافة إلى مخرجاتها في Oracle.

كتلة مجهولة تستدعي الدالة guru99_get_set لإدراج وعرض سجل موظف مع المخرجات

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:=1004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary:=20000;
l_emp_rec.manager:='BBB';
guru99_get_set.set_record(l_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:'||l_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

Code التفسير:

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

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

بما أن الحزمة عبارة عن مجموعة منطقيةping من بين الأمور ذات الصلة، توجد بعض التبعيات. فيما يلي التبعيات التي يجب مراعاتها.

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

حزمة معلومات

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

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

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

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

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

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

الأسئلة الشائعة

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

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

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

استخدم الأمر DROP PACKAGE لإزالة كلٍّ من المواصفات والمحتوى، أو DROP PACKAGE BODY لإزالة المحتوى فقط. أعد تجميع حزمة غير صالحة باستخدام الأمر ALTER PACKAGE package_name COMPILE، أو COMPILE BODY لإعادة بناء المحتوى فقط بعد التغييرات.

تُعلن السمة %ROWTYPE عن سجل تتطابق حقولها مع أعمدة جدول الموظفين. استخدام emp%ROWTYPE يحافظ على توافق معلمات get_record و set_record مع بنية الجدول، مما يقلل من الحاجة إلى تعديلات برمجية لتغييرات الأعمدة.

نعم. كل جلسة تشير إلى حزمة تحصل على نسختها الخاصة وحالة الحزمة، والتي تبقى طوال مدة تلك الجلسة. إعادة تجميع النص الأساسي يتجاهل الحالة ويُظهر الخطأ ORA-04068 في الاستدعاء التالي.

نعم. مساعد الطيار جيثب يقوم بصياغة مواصفات الحزمة، والأجسام المطابقة، والبرامج الفرعية المحملة بشكل زائد من تعليق، ويقترح معلمات %ROWTYPE. Revاطلع على الحدود المُنشأة، وكتلة التهيئة، ومعالجة الاستثناءات قبل النشر.

تقوم مساعدات الذكاء الاصطناعي بفحص الحزمة بحثًا عن حالات غير صالحة، وتعريفات مفقودة للمحتوى، وسلاسل تبعية تتعطل عند تغيير المواصفات. يُشير هذا الفحص القائم على التعلم الآلي إلى البرامج الفرعية المُحمّلة بشكل زائد والغامضة، ومخاطر إعادة التجميع قبل وصول الحزمة إلى مرحلة الإنتاج.

تلخيص هذه التدوينة بـ: