السبت، 18 أبريل 2009

ماذا تعرف عن Transportable Tablespaces؟

أهلا بك عزيزي في هذا الموضوع الجديد والمثير والذي حييت أن أطرحه عليكم لتعم الفائدة ويستفيد الجميع من هذا الموضوع وهو هام لكل من يريد أن يحترف (DBA)

أولا سأضع مقدمة للموضوع ومن ثم سوف أشرح الموضوع بالتفصيل ؟

كل مستخدم لأوراكل يعلم أن هناك ما يسمى (Export and Import) ويعلم أننا نستطيع تصدير Export المعطيات من قاعدة بيانات ومن ثم نستوردها من قاعدة بيانات أخرى , كما أن هناك تصدير واستيراد على مستوى كامل full وهناك أيضا على مستوى الجدول وهناك أيضا على مستوى المستخدم وعلى مستوى tablespace .

ما قرأته سابقا عبارة عن نقل بيانات من قاعدة بيانات إلى أخرى ولكن ماذا إذا أردت نقل tablespace من قاعدة بيانات إلى أخرى (هذا هو لب موضوعنا)

إذا ما هو Transportable Tablespaces ؟

هو نوع خاص من التصدير export الذي لا يصدر أي معطيات فعلية (كيف ذلك؟)

عزيزي القارئ : لو تأملنا في أوراكل وبنيتها سنجد أن أوراكل لها بنية منطقية وبنية فيزيائية وكما تعلمون أن ال Tablespace عبارة عن بنية منطقية ليس لها أي وجود فيزيائي ولكنها تحتوي على بيانات ال datafile والتي تمثل البنية الفيزيائية , وكما تعلمون أن الـ metadata تخزن في ال data Dictionary وبالتالي ما سنقوم به هو تصدير ال metadata المرتبطة بالـ tablespace الذي نريد نقلة إلى dictionary file , كما تلاحظ أننا لن نصدر أي بيانات .

إذا ما سنقوم به هو أن نصدر الـ metadata المرتبطة بهذا ال tablespace إلى ملف Dictionary ومن ثم نقوم باستيراده إلى قاعدة البيانات الأخرى وكذلك سنقوم بنسخ ملفات datafiles المرتبطة بهذا ال tablespace إلى قاعدة البيانات الأخرى (فمثلا تستطيع استخدام ال FTP لنسخ هذه الملفات )

ملاحظة هامة : هذه الطريقة سوف تستخدم بين قاعدتي بيانات موجودة على أنظمة تشغيل متوافقة (فمثلا إذا كانت قاعدة البيانات الأولى موجودة على نظام تشغيل Unix Solaris لابد أن يكون نظام التشغيل الموجود على قاعدة البيانات الأخرى نفس نظام التشغيل )

لهذه الطريقة العديد من الفوائد التي تميزها عن الطرق الأخرى لنقل البيانات ومنها ان هذه الطريقة سريعة جدا مقارنة بطريقة export and import والسبب أننا لا نقوم بنقل محتويات ال tablespace وأنما نقوم بنقل tablespace metadata ونظرا لان حجمها صغير جدا مقارنة مع محتويات ال tablespace والتي قد تقدر بالجيجا بايت .

هناك بعض القيود عند استخدام هذه الطريقة :

1- كلا من قاعدتي البيانات المصدر والوجهة لا بد أن يكون لها نفس block size ولكي تعرف ذلك تستطيع الاستعلام عنها من ال data dictionary أو من ملف init.ora .

2- أن يكون لكلا قاعدتي البيانات نفس character set .

3- لا تستطيع نقل ال tablespace في حال كانت قاعدة البيانات الوجهة (destination)تحتوي على نفس اسم ال tablespace .

4- أن لا يحتوي ال tablespace المراد نقلة على replication objects or function-based indexes. .

5- المالك (owner & user) للأغراض الموجودة في ال tablespace المراد نقلة لا بد أن يكون موجود في قاعدة البيانات الوجهة (أي إذا لم يكن موجود لا بد أن تنشأه) مع ملاحظة أننا لن ننقل user metadata ما سننقله فقط tablespace Metadata .

خطوات لنقل ال tablespace من قاعدة بيانات إلى آخرى سهلة جدا ونلخصها بالتالي :

1- إختيار مجموعة ال tablespaces المراد نقلها بشرط ان لا تحتوي على أغراض مرتبطة ب tablespace غير موجود في المجموعة المختارة .

لشرح الفكرة : بفرض انك تريد نقل INVENTORY_DATA and INVENTORY_INDEXES tablespaces معا ولنفرض ان INVENTORY_INDEXES يحتوي على index مرتبط بالجدول employees والموجود على Employees tablespace في هذا السيناريو فأنك لن تستطيع نقل هذين الفضائين معا لان ال INVENTORY_INDEXES Tablespace يحتوي على index مرتبط بال Employees tablespace والذي لا نريد نقلة .

2- انشئ dictionary file باستخدام export utility .

3- انسخ الملف السابق مع datafiles المرتبطة بهذا بال tablespaces المراد نقلها إلى السيرفر الذي تتواجد علية قاعدة البيانات الوجهة .

4- قم باستيراد dictionary file إلى قاعدة البيانات الوجهة.

الطريقة العملية بالتفصيل :

الهدف : نقل ال tablespaces باستخدام export and import utility .

هذه الطريقة تستخدم لنقل ال tablespace من قاعدة بيانات إلى أخرى ولكن تستطيع محاكاتها على جهازك وان كنت تملك قاعدة بيانات واحدة فقط بفرض أن لديك tablespace مسمى RMAN فأنك تستطيع محاكة هذه الطريقة وذلك بتوليد Transport tablespace ومن ثم تقوم بحذف هذا ال tablespace ومن ثم استيراده مرة أخرى

لذا دعنا نبدأ :

قم بالدخول الى sqlplus بشرط ان يكون المستخدم sys ولدية الصلاحية SYSDBA

1- لمعرفة حالة RMAN tablepace قم بتنفيذ الاستعلام :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='WALEED';

ستجد ان هذا ال tablespace في حالةonline وهو متاح للاستخدام العام .

2- قبل نقل ال tablespace لا بد ان تكون متأكدا من أن الأغراض التي يحتويها لا ترتبط ب tablespace آخر وذلك باستخدام الاجرائية الموجودة في الحزمة DBMS_TTS كما ستلاحظ بالاسفل :

EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('WALEED',true);

ستجد رسالة تقول لك : procedure successfully complete

بعد الانتهاء من تنفيذ الاجرائية إذا كان هناك أي مشكلة ستقوم بتنفيذ الاستعلام التالي :

SELECT *

FROM transport_set_violations;

إذا كانت النتيجة (no row selected) فأنت في safe side وشغلك إلى الآن صحيح وفي حال أعاد الاستعلام أي نتيجة فهذا يعني أن هناك أغراض من هذه ال tablespace مرتبطة ب tablespace آخر وبالتالي لن تستطيع نقلة .

كما لاحظتم المثال الذي شرحته سابقا والتي قلنا لن تستطيع نقل ال tablespaces , الأصح انك تستطيع نقلها ولكن بعد أن تقوم بعمل disable للقيود constraints وهذا سوف يؤثر على استقرار البيانات .

3- بعد التأكد من عدم ارتباط أي غرض من ال tablespace المراد نقلة مع أي أغراض من tablespace آخر لا بد ان تضع ال tablespace المراد نقلة في وضع readonly

Alter tablespace waleed read only;

بعد تنفيذ التعليمة السابقة وللتأكد من ال rman tablespace في وضع read only قم بتنفيذ الاستعلام التالي :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

ولا بد أن تكون قيمة ال status هي read only .

4- قم بالخروج من sqlplus ومن ثم افتح command prompt فإذا كنت تستخدم ويندوز أكتب cmd في run

إذا ستقوم الآن بتوليد transportable tablespace export file بإستخدام هذا الأمر :

exp userid='sys/sys as sysdba' file=C:\app\tts_ora92_rman.dmp log=C:\app\tts_ora92_rman.log

transport_tablespace=y tablespaces=waleed

كما تلاحظ اننا استخدمنا exp ولا بد من ان ندخل اسم المستخدم وهو sys ولا ننسى كلمة السر ومن ثم نضع مسار للملف الذي سوف نقوم بتصديره وكما تلاحظ المسار وهو C:\079176\ وكذلك اسم الملف , ووضعنا ال log في نفس المسار .

لا بد أن تجد في السطر الأخير

Export terminated successfully without warnings.

بعد الانتهاء هذا الأمر سيتولد لنا هذا الملف tts_ora92_rman.dmp وفي حال كنا نريد نقلها الى سيرفر آخر ما علينا سوى نقل هذا الملف و datafiles الى السيرفر المتواجد عليها قاعدة البيانات الاخرى .

ولكن في حالتنا نحن نستخدم نفس ال database وبنفس الجهاز وبالتالي لا بد من حذف ال tablespace

باستخدام التعليمة التالية في sqlplus :

DROP TABLESPACE rman INCLUDING CONTENTS;

وللتأكد من أنه تم حذف ال tablespace بنجاح استخدم هذا الاستعلام :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

والنتيجة رح تكون No Row selected

5- الان ستقوم باستيراد الملف الذي قمت بتصديره سابقا ولا تنسى ان تضع مسار ال datafiles

imp userid='sys/password as sysdba'

file=C:\079176\tts_ora92_rman.dmp

log=C:\079176\ts_ora92_rman_imp.log

transport_tablespace=y tablespaces=rman

datafiles=D:\oracle\oradata\ora92\rman01.dbf

بعد تنفيذ هذا الأمر في command prompt إذا وجدت هذه الرسالة في السطر الأخير

Import terminated successfully without warnings.

فهذا يعني أن عملية الاستيراد تمت بنجاح .

وللتاكد من انه تم استيراد الtablespace بشكل صحيح نفذ هذا الاستعلام

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

والنتيجة ستجد ان تم اعادة هذا ال tablespace وحالتة status هي read only .

الآن لوضع ال tablespaces في وضع read write قم بتنفيذ هذه التعليمة :

Alter tablespace rman read write;

وبهذا تكون قد تمت عملية الاستيراد والتصدير بنجاح .

كما لاحظت عزيزي القارئ أننا قمنا بمحاكاة العملية على جهاز واحد ولدينا database واحدة لذا تستطيع أن تطبقها في حال أردت نقل ال tablespace إلى قاعدة بيانات موجودة على سيرفر آخر ولكن لا تنسى أن تنقل الملف الذي قمت يتصديره وكذلك ال datafiles المرتبطة بال tablespace لا بد من نقلها الى السيرفر المتواجد عليه قاعدة البيانات الوجهة وتحديد مسار الdatafiles في الأمر imp .

الجمعة، 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

Powered By Blogger