الجمعة، 10 أبريل 2009

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

إنشاء الحزم

Create Packages

تعرف الحزمة بأنها عبارة عن تجميع منطقي للأنواع Types والعناصر items والبرامج الجزئية في PL/SQL .

تتألف الحزمة من قسمين :

التوصيف specification : وهو عبارة عن واجهة لتطبيقك , حيث يتم في هذا القسم التصريح عن المتحولات والأنماط والثوابت والاستثناءات والمؤشرات والبرامج الجزئية المتوفرة للاستخدام كما تحتوي على ما يسمى PRAGRMAs والتي تقوم بعملية التوجيه إلى المترجم Compiler .

الجسم body : في هذا الجسم تتم عملية تنفيذ التوصيف أي يتم هنا تعريف المؤشرات والبرامج الجزئية .

الحزم لا يمكن أن تستدعى invoked أو تمرر كبارامتر أو أن تكون متداخلة nested , إن تنسيق الحزم يشبه تماما البرامج الجزئية procedures and functions وذلك في حال تمت كتابتها وترجمتها تستطيع أن تشاركها بين التطبيقات .

مثال : بفرض لدينا حزمة باسم حزمة الموارد البشرية بحيث بالإمكان أن تحتوي هذه الحزمة على

Hiring and firing procedures أي إجرائيات التوظيف وإنهاء الخدمة

Commission and bonus functions توابع المهمات والمكافآت

Tax exemption variables متحولات إعفاء الضريبة.

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

عندما تقوم باني construct الحزمة للمرة الأولى فإنه يتم تحميل كامل الحزمة إلى الذاكرة ولذلك عندما تقوم باستدعاء الباني مرة أخرى فإنه لن يتطلب إجراء عملية Input/Output وذلك لأن الحزمة محملة في الذاكرة .

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

مكونات الحزمة :

كما تكلمنا سابقا لدينا قسمين في كل حزمة زالان نشرح ماذا يحتوي كل قسم بالتفصيل

سأقوم بشرح مصطلحين هامين عند إنشاء الحزم :

Public package constructs:

وهي عبارة عن المتحولات والبرامج الجزئية التي يتم التصريح declare عنها في قسم التوصيف ويتم تعريفها في جسم الحزمة .

ميزة هذا النوع أنك تستطيع أن تشير إلية أي بيئة مخدم أوراكل لأنها عامه كما في هي مسماه .

Private package constructs:

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

ملاحظة : يقوم oracle server بتخزين توصيف الحزمة وجسمها بشكل منفصل في قاعدة البيانات وهذا يتيح لد تعديل تعريف البواني constructs في جسم الحزمة من دون أن يبطل الإستدعاءات التي تقوم بها أغراض المستخدم أو schema objects على هذه الحزمة.

سنتحدث الآن رؤية أو شفافية البواني أو ما يسمى visibility of construct وهما نوعان :

Local or Private package items :

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

Global package items: وهي عبارة عن المتحولات أو البرامج الجزئية التي يمكن أن يشار لها أو تغير من خارج الحزمة وبالتالي هي مرئية للمستخدمين الخارجيين ولكي تكون هذه المتحولات global فأنه لا بد من التصريح عنها في قسم توصيف الحزمة.

سوف أقوم بشرح كل هذا بمثال ولكن في وقت لاحق .

كيف أنشئ حزمة :

هناك ثلاث خطوات أساسية لإنشاء حزمة :

- قم بكتابة التعليمات التي تقوم بإنشاء توصيف هذه الحزمة ومن ثم قم بتنفيذ هذا الكود وسوف يتم ترجمة هذا الكود وتخزينه في data dictionary

- قم بكتابة التعليمات التي تقوم بإنشاء جسم الحزمة ومن ثم قم بتنفيذ الكود وسوف يتم تخزينه في data dictionary .

- قسم باستدعاء البواني العامة أو public construct من بيئة مخدم أوراكل .

ملاحظة : يمكن أن يكون توصيف الحزمة موجود من دون جسم الحزمة والعكس غير صحيح وذلك لأنه في قسم التوصيف يتم التصريح فقط من دون التعريف الكامل للـ constructs .

كيف أقوم بإنشاء توصيف الحزمة أو package specification

الصيغة العامة :

CREATE [OR REPLACE] PACKAGE package_name

IS | AS

Public type and item declarations

Subprograms specifications

END package_name;

الشرح :

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

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

إن المتحولات التي يتم التصريح عنها إذا لم تعطى قيمة افتراضيه فإنها تهيئ بالقيمة NULL .

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

Package_name : يمثل اسم الحزمة

Public type and item declarations : التصريح عن المتحولات أو الثوابت أو المؤشرات أو الأنماط أو الاستثناءات العامة .

Subprograms specifications : التصريح عن برامج جزئية (توابع أو إجرائيات)

مثال :

CREATE OR REPLCAE PACKAGE comm_package IS

g_comm NUMBER :=0.10;

PROCEDURE reset_comm (p_comm IN NUMBER);

END comm_package;

كما تلاحظ في الكود أعلاه فإنه تم إنشاء حزمة باسم comm_package وهذا التوصيف التابع لها فكما تلاحظون أنه لدينا متحول من نمط عدد صحيح وهو متحول عام (عالمي) public (global) لأنه تم التصريح عنه في توصيف الحزمة وكذلك تم تهيئته بقيمة افتراضية , وكما تلاحظون أنه لدينا كذلك إجرائية عامة public procedure وهي reset_comm , ومن هذا نستنتج أن الإجرائية السابقة هي إجرائية عامة أي نستطيع استدعاءها تكرارا من البواني constructs الأخرى في نفس الحزمة أو من خارج الحزمة.

كيف أقوم بإنشاء جسم الحزمة package body ؟

الصيغة العامة :

CREATE [OR REPLACE] PACKAGE BODY package_name

IS | AS

Private type and item declarations

Subprograms bodies

END package_name;


الشرح : يقوم الكود السابق بإنشاء جسم الحزمة والذي يتم فيه تعريف كل البواني الخاصة والعامة public and private constructs

إن كلمة replace والموجود ضمن قوسين اختيارية وفي حال تم كتابتها فإنه إذا كان جسم الحزمة موجود مسبقا فسيتم استبداله وإذا لم تكن موجودة وكان الجسم موجود في قاعدة البيانات فسوف تلاحظ رسالة خطأ تخبرك أن جسم الحزمة موجودة مسبقا .

هنا سنقوم بتعريف كل المتحولات والبرامج الجزئية ولكن كيف سترتب التعريف والقاعدة تقول : يجب أن تعرف المتحولات والبرامج الجزئية قبل تلك التي تستدعيها بمعنى لو كان لدينا تابعين التابع الثاني يستدعي التابع الأول لذا لا بد من تعريف التابع الأول أولا ومن ثم التابع الثاني , وهذا ينطبق على المتحولات كذلك .

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

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

Package_name : اسم الحزمة ولا بد أن يكون نفس الاسم الذي كتبته في التوصيف.

Private type and item declarations : التصريح عن المتحولات أو الثوابت أو المؤشرات أو الأنماط أوالإستثناءات الخاصة.

Subprograms specifications :يتم تعريف البرامج الجزئية (توابع أو إجرائيات) الخاصة أو العامة.

مثال تطبيق : نستخدم التوصيف الذي كتبناه سابقا لانشاء جسم الحزمة :

CREATE OR REPLACE PACKAGE BODY comm_package

IS

FUNCATION validate_comm(p_comm IN NUMBER) RETURN BOOLEAN

IS

v_max_comm NUMBER;

BEGIN

SELECT MAX(commission_pct)

INTO v_max_comm

FROM employees;

IF p_comm > v_max_comm THEN RETRUN (FALSE);

ELSE RETURN(TRUE);

END IF;

END validate_comm;

PROCEDURE reset_comm(p_comm IN NUMBER)

IS

BEGIN

IF validate_comm(p_comm) THEN

g_comm :=p_comm;

ELSE

RAISE_APPLICATION_ERROR(-20210,’Invalid commission’);

END reset_comm;

END comm._package;

الشرح : كما تلاحظ عزيزي القارئ أننا قمنا بكتابة الكود الخاص بجسم الحزمة والذي يحتوي على :

التابع validate_comm وهو تابع خاص تم التعريف عنه في جسم البرنامج لذلك يمكن استخدامه ضمن الحزمة فقط وسنرى ذلك لاحقا , هذا التابع يقوم بالـتأكد من أن قيمة المتحول الممرر له ليس أكبر من أكبر قيمة للعمولة التي يأخذها الموظفين في الجدول employees فإذا كانت أكبر يعيد قيمة منطقية وهي false وإذا لم تكن أكبر فأنه يعيد true , إذا قمنا بتعريف متحول محلي v_max_comm ضمن التابع ولا يمكن استخامه خارج التابع ومن ثم حصلنا على أكبر قيمة للعمولة من جدول الموظفين وقمنا باسناد هذه القيمة للمتحول اللي عرفناه وبعدها قمنا بعمل فحص للقيمة المررة للتابع p_comm إذا كانت أكبر من قيمة v_max_comm فإن ننعيد القيمة false وإن ام يكن أكبر نعيد true .

ومن ثم قمنا بتعريف الاجرائية العامة reset_comm والتي صرحنا عنها في توصيف البرنامج , حيث كتبنا التعريف لكامل لها وتم استخدام التابع الذي شرحناها سابقا وكما تلاحظون أننا قمنا بتعريف التابع قبل أن نستخدمه وهذا ما قصدته عندما شرحت هذه الحالة , إذا الاجرائية تقبل بارامتر من نمط صحيح ونقيم بفحصه بإستخدام التابع السابق لنرى فيما إذا كان أكبر من أكبر عمولة يأخذ الموظف في الجدول employees فإذا أعاد التابع true فأننا سوف نقوم بإعطاء المتحول العام g_comm والذي صرحنا عنه في قسم التوصيف القيمة الممررة للإجرائية وهي p_comm وإذا إعاد التابع القيمة false فأننا نعيد رسالة خطأ كما تلاحظ في الكود في قسم elseأنن

.

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

كيف يتم استدعاء الإجرائية العامة في الحزمة comm_package :

مثال 1 :

Execute comm_package.reset_comm(0.15);

مثال2 : بفرض أن هذه الحزمة تم إنشاءها في المستخدم hr فإذا أردنا استدعاء الاجرائية من المستخدم scott بشرط أن تقوم بمنحة صلاحية استخدام الحزمة التابعة hr :

Execute hr.comm_package.reset_comm(0.15);

كما ذكرنا سابقا أنك تستطيع التصريح عن توصيف الحزمة من دون أن يكون هناك جسم لهذه الحزمة وسوف أوضح ذلك بمثال : تستطيع التصريح عن متحولات عامة أو عالمية والتي تكون موجودة خلال جلسة المستخدم , حيث أن هذا النوع سوف يحتوي على متحولات أو أنماط أو ثوابت أو استثناءات ولذلك فإن جسم الحزمة ليس ضروريا هنا ويكون ضروريا عن يتم التصريح عن توابع أو إجرائيات في قسم توصيف الحزمة إليك المثال التالي :

CREATE OR REPLACE PACKAGE global_consts Is

Mile_2_kilo CONSTANT NUMBER :=1.6093;

Kilo_2_mile CONSTANT NUMBER :=0.6214;

Yard_2_meter CONSTANT NUMBER :=0.9144

Meter_2_yard CONSTANT NUMBER :=1.0963;

END global_consts;

الشرح : تم إنشاء حزمة بتنفيذ لبتوصيف فقط والذي يقوم يحوي قيم ثوابت للتحويل من ميل إلى كيلو وبالعكس ومن ياردة إلي متر وبالعكس لاستخدام الحزمة سنقوم بالتالي :

Execute DBMS_OUTPUT.PUT_LINE(’20 miles = ‘ ||20* global_consts.mile_2_kilo|}’ km’);

ستجد النتيجة التالية :

20 miles = 32.186 km

في حال أردنا أستخدام الحزمة السابقة في procedure إليك المثال :

CREATE OR REPLACE PROCEDURE meter_to_yard(p_meter IN NUMBER , p_yard OUT NUMBER)

IS

BEGIN

P_yard := p_meter * global_consts.meter_2_yard;

END meter_to_yard;

/

كما تلاحظ أننا أنشأنا إجرائية وتحوي بارامترين الأول دخل ويحوي القيمة المراد تحويلها والبارامتر الثاني خرج التحويل وضمنها أشرنا للثابت meter_2_yard الموجود في الحزمة global_consts لتنفيذ الإجرائية :

VARIABLE yard NUMBER

EXECUTE meter_to_yard(1,:yard)


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

كيف تقوم بحذف حزمة :

لحذف حزمة إليك الصيغة العامة :

DROP PACKAGE package_name;

مثال :


DROP PACKAGE comm_package;

بهذه التعليمة سيتم حذف التوصيف والجسم معاً.

أما إذا أردت الاحتفاظ بالتوصيف وحذف الجسم قم بالتالي :

DROP PACKAGE BODY comm_package;

فوائد الحزم :

- modularity المعيارية بحيث تمكنك الحزم من التغليف المنطقي لبنى البرامج المتعلقة ببعضها ضمن نموذج واحد module , وبالتالي كل حزمة ستكون سهلة الفهم .

- سهولة في تصميم التطبيقات .

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

- Added functionality وظائفية مضافة حيث أن المتحولات والمؤشرات العامة تستمر خلال جلسة المستخدم .وبالتالي يمكن أن تشارك بين كل البرامج الجزئية التي تنفذ في البيئة

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

- Overloading التحميل الزائد : في الحزم تستطيع أن تقوم بالتحميل الزائد للتوابع والاجرائيات والذي يعني أنك تستطيع إنشاء عدة برامج جزئية بنفس الاسم في نفس الحزمة بحيث أن كل تابع أو إجرائية تأخذ عدد مختلف من البارامترات أو مختلف في نمط البيانات .

أتمنى أن أكون قد أعطيت الموضوع حقه , سأكون سعيداً بتلقي تعليقاتكم على هذا الموضوع .

المصطلحات في هذه المقالة :

الحزمة Package

الأنماط Types

العناصر Items

البرامج الجزئية Subprograms

المؤشر Cursor

الثوابت Constants

المتحولات variables

الاستثناءات Exceptions

التصريح declare

التوصيف specification

الجسم Body

خاص Private

عامة public

هناك 3 تعليقات:

  1. كيف يمكن انشاء جدول من داخل PL/SQL Block؟

    ردحذف
  2. شكراً لصحاب الدرس تناول الموضوع بطريقه أكثر من رائعه

    ردحذف
  3. مرحبا بك أخي ولا شكر على واجب

    ردحذف

Powered By Blogger