Professional Documents
Culture Documents
األوراكل
نتعرض في ھذا الفصل الى مقدمة في ادارة قواعد البيانات Databaseوخاصة قواعد بيانات
األوراكل والذي يعتبر أحد النظم القوية في قواعد البيانات Data Base Management
) System (DBMSلما له من مميزات مقارنة بقواعد البيانات االخرى .
االستعالم Query
ھو نظام استفساري لالستعالم عن بيانات معينة وغاليا ال يغير االستعالم في قاعدة البيانات حيث
إن غالبية نظم االستعالم عبارة عن قراءة فقط للبيانات
الدوال Function
عبارة عن مجموعة من تعليما ت أو أوامر تستخدم ضمن مسمى وظيفي الداء عملية محددة
وغالبا تعيد الدالة قيمة معينه بعد تنفيذھا
االجراء Procedure
مجموعة من التعليمات مثل تعليمات الدالة بھدف تنفيذ مھمة محددة لكن االجراء ال يعيد قيمة
مثل الدالة
مخطط Schema
عبارة عن مجموعة من الكائنات Objectsمرتبطة بقواعد البيانات ويتألف مخطط
Schemaمن كائنات مثل الجداول Tablesواالجراءات Procedureوالعروض Views
والفھارس Index
ويمكن ان يقوم مدير قواعد البيانات بالتخطيط لتطوير وتنمية النظام المطبق ،وتحديد
الحاجه لھذه التطورات المستقبلية .
moon
ويسعى فريق العمل الذي يتكون من مديري قواعد البيانات DBAللحفاظ على سير العمل داخل
الشركة بشكل متجانس .وتتم تجزئة المھام بين ھؤالء المديرين .
ھو عبارة عن مجموعة األدوات البرمجيه ) البرامج ( التي تدير وتنظم قاعدة البيانات وتوجد
عالقة ارتباط بين ھذه البيانات تسمى عالقة ) (Relationلذا احيانا يطلق عليھا RDBMSأي
نظام إدارة قواعد البيانات العالئقية ) االرتباطية (
يتميز نظام قاعدة البيانات أوراكل عن غيره من نظم إدارة قواعد البيانات األخرى باآلتي:
-١القدرة الفائقة على استيعاب كميات كبيرة من البيانات قد يصل عدد السجالت إلى
الماليين مع الحفاظ على المستوى العالي في األداء والسرعة عند استرجاع والتخزين
والحذف
-٢السرية التامة واألمن ال حتوائه على نظام الصالحيات والحقوق الذي يضمن تطبيق
الشروط القياسية واألمنية للحفاظ على قاعدة البيانات
-٣فعالية التحكم المركزي بالبيانات الذي يضمن :
• تقليل التكررات غير الالزمة في البيانات المدخلة )(No Repetition
• تجنب التناقض بين البيانات )(No Contradiction
• إمكانية التشارك في البيانات )(Data Sharing
• الحفاظ على تكامل البيانات فيما بينھا )(Data Integrity
-٤السيطرة التامة على عملية النسخ االحتياطي لقاعدة البيانات وحمايتھا من الفقدان أو
التلف مع امكانية استرجاعھا في أي لحظة
moon
تستخدم ھذه اللغة في تعريف وإنشاء الكائن ، Objectويمكن أن يكون الكائن ملفات
وجداول بيانات ،فيمكننا إنشاء وتعديل وحذف الكائن ويمكننا إنشاء امتياز لمستخدم
معين ،أو انشاء كائن خيارات لفحص وإضافة تعليقات إلى قاموس البيانات ومن ھذه
األوامر CREAT , DROP and ALTER :
تتيح ھذه األوامر التعامل مع البيانات وتعديلھا ضمن الكائن الموجود Objectومن ھذه
األوامر SELECT, DELETE,UPDATE and INSERT :
تتيح ھذه األوامر التحكم في قاعدة البيانات وأدائھا كالصالحيات والمستخدمين والحقوق
وغالبا ماتكون ھذه األوامر مخصصة لالستخدام من قبل مدير قاعدة البيانات )(DBA
ومن ھذه االوامر GRANT and REVOKE :
moon
في الماضي كان النموذج األول ) الھرمي ( األكثر انتشارا مع أجھزة الكمبيوتر الكبيرة Main
Frameثم بدا النظام الثاني ) الشبكي ( في االنتشار وخاصة مع التوسع في بناء وتركيب
شبكات الحاسب وكانت ھناك صعوبات في استخدام النظامين االول والثاني ) الھرمي والشبكي (
نتيجة الستخدام مؤشرات البرمجة ) ( Pointersلربط سجالت البيانات بعضھا مع بعض ،لذا
نجد أن إضافة أو تعديل أو حذف السجالت يحتاج إلى المزيد من قھم طبيعة وعمل المؤشرات
وفي ھذه الفترة الماضية طرق برمجة المؤشرات تكتب بلغة الكوبول ).(COBOL
أما النموذج العالئقي ) (Relationalفھو األكثر سھولة في االستخدام وفي برمجة تطبيقات نظم
قواعد البيانات ومن الناحية النظرية األكاديمية فيلزمك دراسة المفاھيم األساسية والضروربة لھذا
النموذج العالئقي لھذا سنركز ھنا على
لربط عالقة بأخرى تتحتاج إلى طريقة لالرتباط .وھذه الطريقة تستخدم حقال Fieldيكون
موجودا في الجدولين وحقل االرتباط يسمى في الجدول األول بالمفتاح الرئيسي (Primary
) Keyللجدول األول ويسمى يالمفتاح ال ) (Foreign Keyفي الجدول الثاني
moon
ويتكون نظام تشغيل وتنظيم قاعدة البيانات ) (Kernelمن مجموعة من الوحدات البرمجية
Softwareوالذي صمم ليحكم وينظم وينعامل مع البيانات مابين حفظ واسترجاع وطباعة
وكذلك تحديد المسؤليات وعمل نظم األمان وحماية البيانات
وعادة يحتفظ نظام قاعدة البيانات بقائمة من المستخدمين الذين لھم صالحية للتعامل مع تطبيق
قاعدة البيانات والشكل التالي يوضح بعضا من مكونات الـ Kernelفي نظام أوراكل
ويحوي قاموس البيانات Data Dictionaryوصفا لشكل البيانات ويطلق على ھذا الوصف
Meta Descriptionأو Meta Dataوھذا الوصف يرتبط بكافة الكائنا ت Objectsضمن
قاعدة البيانات
وقاموس بيانات أوراكل يحتوي على مجموعة جداول تضم البيانات المخزنة عن طريق
الـ Kernelوأيضا على كائنات الفھارس Indexesكائنات العرض Viewsكائنات االستعالم
واالستقسار SQL and Queryكائنات اإلجراء Procedureوالدوال ... Functionإلخ
moon
الشكل التالي يوضح كيفية قراءة أو تعديل قاعدة بيانات باستخدام أوراكل
الخادم Server
يحوي الخادم قاعدة البيانات المركزية ووظائفھا ،وكذلك كافة العمليات الخلفية لحفظ ھذه القاعدة
ويحوي ايضا أدوات تشغيل وإيقاف قاعدة البيانات
والشكل التالي يوضح البناء الداخلي لنظام الخادم
بروتكول اتصال
الشبكة Net8
مدير الخادم
Server
Manager
الخادم Server
نظام االستيراد
والتصدير نظم االستعالم
&EXP80 SQL * PLUS
IMP80
المترجمات
Pre نظام التحميل
compliers LOADER
المستفيد Client
أما المستفيد Clientفيحتوي على برامج الخدمات والبرامج المساعده والتي بمكننا تشغيلھا عن
بعد باستخدام الشبكة كما يتضمن نظام المستفيد الوسيط الرسومي Graphical Interfaceالذي
يسھل علينا استخدامه وتوجد أداة االتصال بين الخادم والمستقيد وھي Net 8لتقوم بعمليات الربط
واالتصال عبر الشبكة
moon
مدير السرية Security مدير النسخ االحتياطي للبيانات مدير الطبعة Instance
Manager Backup and Recovery Manager
Manager
ملخص الوحدة
تناولنا في ھذا الفصل تعريف التركيب الداخلي لنظام أوراكل وأھم مكوناته والعالقة بين الجداول
،وكذلك عملية نمذجة العالقة على الجداول وتم تعريف الخادم والمستفيد والعالقة بينھما .
moon
جمل SQLالبسيطة
أھداف الفصل
نتااول عملية استرجاع البيانات في حاالت مختلفة مستخدمين في ذلك جملة SELECTوفي
نھاية ھذا الفصل ستكون إن شاء ﷲ قادر على :
• استرجاع البيانات بواسطة جملة SELECTالبسيطة
• فھم متطلبات وإرشادات كتابة جمل SQL
• استخدام العمليات الحسابية وأولويات تنفيذھا مع جمل SQL
• استخدام الجمل اإللحاقية على البيانات
• استخدام عبارة DISTINCTلمنع تكرار عرض البيانات
• عرض مواصفات الجدول
moon
جملة SELECT
تستخدم جملة SELECTالسترجاع البيانات المخزنة في جدول أو عدة جداول حيث أن عملية
االسترجاع ال تعدل في ھذه البيانات ويمكننا من خالل جملة SELECTأن نقوم بالتالي:
مالحظة
يمكن أن نستخدم كل أو بعض ھذه المزايا في جملة استفسار واحدة
مالحظة
أوامر محررSQL*PLUs
ھنالك بعض االوامر البسيطة التي ستساعدك في كتابة وتحرير وتنفيذ األوامر على محرر SQL
ومنھا
-١االمر EDITويمكن كتابته : EDيستخدم ھذا األمر لتحرير آخر امر تم كتابته على
محرر SQLوعند تنفيذ ھذا األمر ستفتح لك شاشة المحرر )المفكرة( التي يمكنك
خاللھا اعادة تحرير األمر وعند االنتھاء من ذلك احفظ االمر ثم اغلق شاشة المفكرة
ولكن الحظ ال تكتب الفاصلة المنقوطة );( بعد نھاية األمر في ھذه الحالة فقط
-٢األمر Rوطريقة كتابته ) (/ويستخدم العادة تنفيذ اخر امر SQLمحفوظ
حيث أن
COLUMNاسم الحقل
table_nameاسم الجدول
تسمية العمود alies
مثال
;SELECT * FROM s_dept
العمليات الحسابية
يمكن أن نستخدم العمليات الحسابية عند عرض البيانات دون أن تؤثر ھذه المعالجة على
البياانات المخزنة في الجدول ،ويمكن أن يحتوي التعبير الحسابي على اسم الحقل قيمة ثابتة و
العملية الحسابية
العمليات الحسابية
ويمكن استخدام ھذه العمليات في جميع أجزاء جملة SELECTعدا الجزء الخاص بـFROM
أولويات العمليات
-١االفواس الداخلية ثم الخارجية
-٢الضرب والقسمة
-٣الجمع والطرح
مالحظة
العمليات التي لھا نفس االولية كالجمع والطرح تنفذ من اليسار الى اليمين
العملية اإللحاقية
يمكن أن نجري عملية إلحاق عدد من األعمدة للجدول أو مجموعة حرفية نصية إلى حقول
أخرى عند العرض باستخدام العملية اإللحاقية ||
مثال
SELECT first_name||last_name
FROM ;s_emp
Employees
-------------------------------------------------
CarmenVelasquez
LaDorisNgao
MidoriNagayama
MarkQuick-To-See
moon
AudryRopeburn
MollyUrguhart
...
نالحظ ان االسم االول اتصل باالسم االخير بدون وجود مسافات فظھر كانه اسم واحد ولكي
توجد مسافات نكتب
تستخدم عبارة DISTINCTلمنع تكرار ظھور بيانات السجل المسترجع فمثال إذا أردنا أن
نعرف على الوائف التي ينتسب إليھا الموظفون والمخزنة في جدول الموظفين نجد أن ھنالك
وظائف تتكرر حسب عدد الموظفين الذين ينتمون إليھا لمنع تكرار نستخدم عبارة
DISTINCT
حيث أن
COLUMNاسم الحقل
table_nameاسم الجدول
تسمية العمود alies
DISTINCTلمنع التكرار
ملخص الفصل
تناولنا في ھذا الفصل كتابة جمل SQLالبسيطة )جملة (SELECTالتي تستخدم في
استرجاع البيانات وكذلك بعض القواعد اإلرشادية التي يجب اتباعھا عند كتابة وتنفيذ جمل
الـ SQLكما تناولنا استخدام العمليات الحسابية مع جملة SELECTوالعملية اإللحاقية
وكذلك عبارة DISTINCTالتي تستخدم لمنع تكرار ظھور السجالت
moon
اھداف الفصل
-١المعرفة التامة ألسماء الجداول وأسماء الحقول وخصائصھا وانواع البيانات
-٢التعامل مع جملة SQLالبسيطة )(SELECT Statement
-٣استخدام أوامر محرر SQL
moon
لقد قمنا في الوحدة السابقة بالتعرف الى جملة االستعالم البسيط )(SELECT Statement
التي من خاللھا تم استرجاع البيانات من الجداول .وفي ھذا الفصل سنتابع الحديث عن ھذه
الجملة يشكل أوسع ،حيث سنسترجع البيانات من الجداول بناء على شروط معينة ،أو مرتبة
حسب بيانات حقول معينة ،أي سندرس االمور المتعلقة بجملة الشرط في جملة االسترجاع ،من
حيث المعامالت الشرطية وطريقة التعبير عن الشرط والترتيب التصاعدي والترتيب التنازلي
للبيانات
حيث أن
الشرح
تستخدم جملة WHEREلحصر البيانات التي سيتم استرجاعھا من الجداول وھي تحتوي على
شرط وتقع مباشرة بعد المقطع FROMوعند تنفيذ الجملة سيتم استرجاعھا بيانات الحقول
المذكورة التي تحقق الشرط المذكور في جملة WHEREويمكن أن تقارن الجملة الشرطية بين
قيم أو حقول في الجدول أو تعبيرات حسابية أي أن جملة WHEREتحتوي على مايلي:
-١عند استخدام حقول النص وحقول التاريخ في جملة الشرط يجب وضع القيم بين عالمتي
تنصيص مفردتين )’ ’(
-٢في حالة الحقول النصية يجب مراعاة حالة األحرف كبيرة أو صغيرة
-٣في حالة حقول التاريخ يجب مراعاة صيغة التاريخ ) (FORMATوالصيغة األسا سية
للتاريخ ھي كما يلي DD-MON-YY
moon
المعنى المعامل
يساوي =
أكبر من >
أقل من <
أكبر من أو يساوي =>
اقل من أو يساوي =<
ال يساوي ><
ال يساوي =!
تستخدم معامالت المقارنة في جملة الشرط لمقارنة تعبير بآخر في جملة WHEREكما في
الصيغة التالية :
مثال
’WHERE hiredate=’01-SEP-96
WHERE sal>=1500
’WHERE name=’Ahmed
WHERE sal<> other
-١المعامل BETWEEN
يستخدم ھذا المعامل السترجاع بيانات الصفوف التي تعتمد على مدى من القيم أي البيانات التي
تقع بين قيمتين
مثال
أي أنه سيتم استرجاع جميع بيانات الموظفين الذين اقع رواتبھم بين ١٥٠٠و ٢٥٠٠
مالحظة
ستم استرجاع بيانات الموظف الذي يببلغ راتبه تماما ١٥٠٠أو ٢٥٠٠أي أن جملة
BETWEENتتضمن الحد األعلى والحد األدنى للقيم التي سيتم استرجاعھا
-٢المعامل IN
يستخدم ھذا المعامل للبحث عن قيمة داخل قائمة من القيم فتحتوي ھذه القائمة قيما ثابتة أو قد
تكون ھذه القائمة عبارة عن جملة استعالم فرعي
مثال
أي أنه سيتم استرجاع اسم الموظف وراتبه ورقم القسم الذي يعمل به للموظفين الذين يعملون في
قسم رقم ١٠أو قسم رقم ٣٠
-٣المعامل .LIKE
يستخدم ھذا المعامل للبحث عن نص معين داخل حقل نصي ،حيث سيتم مطابقة حروف النص
المذكورة في جملة الشرط
مثال
SELECT * FROM S_EMP
;’WHERE name LIKE ‘S%
أي أنه سيتم استرجاع جميع بيانات الموظفين الذين تبدأ أسماؤھم بحرف S
مالحظة
تستخدم االشارة %عوضا عن أي قيمة نصية ،قد تكون ال شيء أو أي عدد من الحروف للبحث
مثال عن اسم معين ينتھي بحرف Aنكتب ’ ‘%Aوللبحث عن نص يحتوي حرف Aنكتب
’ ‘%A%وھكذا بإمكاننا أن نبحث عن أي مقطع داخل حقل نصي معين
مثال
أي أنه سيتم استرجاع جمبع بيانات الموظفين الذين يكون الحرف الثاني في أسمائھم ھو A
مالحظة
تستخدم اإلشارة _ عوضا عن حرف واحد فقط
يستخدم ھذا المعامل لفحص القيمة )ال شيء( أي قيم القول التي ال تحتوي على بيانات
مثال
SELECT name, sal FROM S_EMP
;WHERE comm. IS NULL
أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين ليس لھم عمولة أو لم يتم ادخال
عمولتھم
تستخدم المعامالت المنطقية لترجع قيمة واحدة TRUEأو FALSEكنتيجة بين قيمتين
منطقيتين او لعكس قيمة منطقية من TRUEالى FALSEوالعكس
من خالل المعامالت المنطقية يمكننا تكوين أكثر من شرط داخل جملة WHEREباستخدام
المعامل ANDاو المعامل OR
-١المعامل AND
مثال
SELECT name, sal FROM S_EMP
;WHERE sal>=2600 AND comm<200
أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين يزيد راتبھم عن ٢٦٠٠وتقل
عمولتھم في نفس الوقت عن ٢٠٠أي انه يجب يتحقق الشرطين السترجاع البيانات
moon
-٢المعامل OR
مثال
SELECT name, sal FROM S_EMP
;WHERE sal <200٠ OR deptno=30
أي أنه سيتم استرجاع اسم الموظف وراتبه للموفين الذين يزيد راتبھم عن ٢٠٠٠أو يعملون في
قسم رقم ٣٠أي أنه يجب يتحقق أي من الشرطين السترجاع البيانات
مثال
SELECT name, sal FROM S_EMP
;)WHERE deptno NOT IN (20,40
أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين ال يعملون في القسمين رقم ٢٠و رقم
٤٠وفي ھذه الحالة تم عكس نتيجة المعامل IN
moon
األقواس -١
معامالت المقارنة )> (<> ، = ، < ، -٢
NOT -٣
AND -٤
OR -٥
الصيغة العامة
}*|…SELECT {Field1, Field2,…,
FROM Table1
WHERE Condition
;]ORDER BY Field3 [ASC|DESC
حيث أن
الشرح
عند استرجاع البيانات تستخدم جملة ORDER BYلترتيب البيانات حسب حقل معين أو
عدة حقول وتأتي ھذه الجملة في نھاية جملة االسترجاع SELECTوقد يكون ھذا الترتيب
تصاعديا )من القيمة الصغيرة إلى القيمة الكبيرة ( عند استخدام المقطع ASCوقد يكون تنازليا
)من الفيمة الكبيرة إلى القيمة الصغيرة( عند استخدتم المقطع DESC
مثال
SELECT * FROM S_EMP
)WHERE deptno NOT IN (20,40
;ORDER BY empno ASC
moon
أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ال يعملون في القسمين رقم ٢٠ورقم
٤٠وستكون البيانات مرتبة تصاعديا حسب رقم الموظف
مثال
SELECT * FROM S_EMP
)WHERE deptno NOT IN (20,40
;ORDER BY empno DESC
أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ال يعملون في القسمين رقم ٢٠ورقم
٤٠وستكون البيانات مرتبة تنازليا حسب رقم الموظف
ملخص الفصل
تناولنا من خالل ھذا الفصل موضوع استرجاع البيانات بشروط من الجداول وموضوع ترتيب
البيانات تصاعديا وتنازليا كما وتطرقنا من خالل دراسة جملة الشرط إلى معامالت المقارنة
والمعامالت المنطقية ومعامالت أخرى مثل BETWEENو INو IS NULLومايتعلق بھا
من حيث طريقة االستخدام وتركيب جملة الشرط وأولويات معامالت المقارنة والمعامالت
المنطقية.
moon
الدوال الحرفية
اھداف الفصل
تسنخدم ھذه الدالة لتحويل البيانات من حروف كبيرة إلى حروف صغيرة ويتم استخدام ھذه الدالة
غاليا مع جمل أخرى
مثال .
)SELECT LOWER (name), LOWER (job
;FROM S_EMP
تسنخدم ھذه الدالة لتحويل البيانات من حروف صغيرة إلى حروف كبيرة ويتم استخدام ھذه الدالة
غاليا مع جمل أخرى
مثال
)SELECT UPPER (name), UPPER (job
;FROM S_EMP
تستخدم ھذه الدالة لتحويل أول حرف من بيانات الحقل المحدد إلى حرف كبير ويتم استخدام ھذه
الدالة غالبا مع الجمل أخرى
مثال
)SELECT INITCAP (name), INITCAP (job
;FROM S_EMP
moon
سيتم عرض اسم الموظف ووظبقته ولكن اول حرف في كالھما سيكون كبير
الصيغة العامة
)SUBSTR(Field1,N,M
حيث أن
الحقل المراد االقتطاع منه String
اول حرف يبدأ عنده االقتطاع N
عدد الحروف المراد اقتطاعھا M
مثال
)SUBSTR('Ahmed',1,3
قيكون الناتج
Ahm
مثال
)SELECT SUBSTR (name, 1,2
;FROM S_EMP
تستخدم ھذه الدالة لتحديد مكان أو موقع حرف في بيانات العمود أو الحقل
الصيغة العامة
)’INSTR (Field, ‘C
حيث أن
مثال
)’SELECT INSTR (name, ‘l
;FROM S_EMP
INSTR name
--------------------
2
0
0
4
تستخدم ھذه الدالة لمحاذاة البيانات ناحية اليمين حيث يتم ملء حرف معين )أو حروف ( يمين
البيانات
الشكل العام
حيث أن
اسم الحقل المطلوب محاذاة بياناته ،ووضع حرف )حروف( يمينه COL
يمكن وضع قيمة أو متغير حرفي بين عالمتي تنصيص )" "( VALUE
عدد مرات ظھور الحرف الجديد N
moon
مثال
)’SELECT name, RPAD (sal, 7,’$
;FROM S_EMP
تستخدم ھذه الدالة لمحاذاة البيانات ناحية اليمين حيث يتم ملء حرف معين )أو حروف ( يسار
البيانات
الشكل العام
حيث أن
اسم الحقل المطلوب محاذاة بياناته ،ووضع حرف )حروف( يمينه COL
يمكن وضع قيمة أو متغير حرفي بين عالمتي تنصيص )" "( VALUE
عدد مرات ظھور الف الجديد N
الحرف أو المتغير الذي سيتم ملء الفراغات به String
مثال
)’SELECT name, LPAD (sal, 7,’#
;FROM S_EMP
تستنخدم ھذه الدالة لحذف بيانات من ناية يمين العمود او الحقل المحدد
الصيغة العامة
)’RTRIM (COL | VALUE,‘ String
حيث أن
مثال
تستخدم ھذه الدالة لحذف بيانات من ناحية يسار العمود أو الحقل المحدد
الشكل العام
)’LTRIM (COL | VALUE,‘ String
moon
حيث أن
مثال
الشكل العام
)LENGTH (COL | VALUE
مثال
)’SELECT LENGTH (name), LENGTH (‘WELCOME
;FROM S_EMP
الشكل العام:
)TRANSLATE (COL|VALUE, FROM, TO
حيث أن
مثال
)’SELECT name, TRANSLATE (name,’MI’,’WY
;FROM S_EMP WHERE sal=1512.5
name )TRANSLATE(name
-------------------- --------------------
SAMI SAWY
تستخدم ھذه الدالة إليجاد اللفظ الصوتي للبيانات )المتغيرات( الموجودة في جدول معين حتى ولو
كان ھناك اختالف في بعض األحرف الھجائية
الشكل العام:
)SOUNDEX (COL|VALUE
حيث أن
ملخص الفصل
تناولنا الدوال الحرفية الخاصة بتحويل حالة الحروف من حروف كبيرة إلى حروف صغيرة
والعكس وكذلك ضبط محاذاة الحروف داخل النص ومن الدوال الھامة الني تناولناھا ايضا دوال
حذف البيانات ودوال عرض اللفظ الصوتي وتعديل بيانات الجداول .
moon
أھداف الفصل
دوال التاريخ
الوفت ھو الحياة والتاريخ ھو أصل االمم لذا لتا لنتعمق في كيفية استخدام دوال التاريخ
الدالة Sysdate
ھذه الدالة تقوم بإعطاء تاريخ اليوم الحالي أي التاريخ المخزن في جھاز الكمبيوتر الذي ينفذ عليه
ھذا األمر ويتم تخزين التاريخ وھمي يسمى Dualوھو موجود أصال داخل لغة أوراكل لذلك
يجب أن تتم عملية استدعاء التاريخ من ھذا الجدول
مثال
الدالة NEXT_DAY
تستخدم ھذه الدالة لعرض التاريخ الذي يوافق التاريخ التالي للتاريخ المعطى
فعلى سبيل المثال إذا كان التاريخ الموجود ھو ٢٠٠٣/٧/٧وطلب من الجھاز تحديد اليوم الذي
يصادف يوم الجمعة من نفس الشھر فإنه يعطي ٢٠٠٣/٧/١١
الشكل العام
)NEXT_DAY (DATE,CHAR
حيث إن DATEھو التاريخ المعطى والمراد إيجاد التاريخ لليوم الذي يليه من خالل وضع اسم
اليوم داخل المتغير CHAR
مثال
نتيجة التنفيذ
NEXT_DAY
-------------------
11/7/2003
moon
الشكل العام
)LAST_DAY (DATE
مثال
بفرض أن تاريخ الھاز SYSDATEھو ٢٠٠٣/٢/٢فإن نتيجة للجملة السابقة ھي كما يلي :
)LAST_DAY(SYSDATE
--------------------------------
28/2/2003
مالحظة
يمكنك أن تقوم بطرح تاريخ من تاريخ آخر كالمثال التالي
الدالة MONTHES_BETWEEN
الشكل العام
MONTHES_BETWEEN )(DATE1,DATE2
مثال
MONTHES_BETWEEN )’(’01-SEP-95’,’11-JAN-94
سيكون الناتج
1.9774194
moon
)ADD_MONTHES (DATE,M
حيث أن
مثال
)ADD_MONTHES (‘7-JAN-99’,6
7-JUL-99
الدالة ROUND
تستخدم ھذه الدالة لعرض اقرب بداية شھر أو سنه لتاريخ معين تحدده
مالحظة :تستخدم ھذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحھا في باب الدوال الرقمية
الصيغة العامة
حيث أن
مثال
)’ROUND (’07-MAY-96’, ‘MONTH
moon
01-JUN-96
مثال
)’ROUND (’07-MAY-96’, ‘YEAR
تستخدم ھذه الدالة لعرض تاريخ اول يوم في شھر أو سنه لتاريخ معين تحدده
مالحظة :تستخدم ھذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحھا في باب الدوال الرقمية
الصيغة العامة
مثال
مثال
01-JAN-96
دوال التحويل
يتم تحويل البيانات من شكل إلى اخر وتوجد دوال خاصة بالتحويل ومنھا
تستخدم ھذه الدالة لتحويل التاريخ او األرقام الى جملة حرفية حيث يتم تغيير شكل التاريخ او
االرقام من صورة إلى اخرى
الشكل العام
)’TO_CHAR (DATE,’FMT
حيث أن
مثال
)’SELECT TO_CHAR (SYSDATE,’DAY, DD MON YY
;FROM DUAL
لنفرض أن تاريخ الجھاز ) (SYSDATEھو ٢٠٠٣/٧/٧فإن نتيجة التنفيذ للجملة السايقة ھي
كمايلي:
)’TO_CHAR (SYSDATE,’DAY, DD MON YY
-----------------------------------
MONDAY 7 JUL 03
مالحظة
اذا كتبنا YYYYفانه سوف يتم عرض السنة كاملة متال٢٠٠٣ -١
اذا كتبنا MMفإنه سوف يتم عرض رقم الشھر مثال 06 -٢
اذا كتبنا MONTHفانه سوف يتم عرض اسم الشھر كامال مثل July -٣
اذا كتبنا DYسيتم عرض أول ثالثة حروف من اليوم -٤
اذا كتبنا DAYسيتم عرض اسم اليوم كامال -٥
moon
الشكل العام
)’TO_CHAR (NUMBER,’FMT
حيث أن
NUMBERالرقم
الصورة الجديدة FMT
مثال
)TO_CHAR (6500500,’$9,999,999
-----------------------------------
6,500,500
مالحظة
عندما نكتب 9فإننا نعني يھا خاتة رقم -١
عندما نكتب ) ( ,يتم طباعة الفاصلة -٢
عندما نكتب) ( .يتم طباعة الفاصلة العشرية -٣
الدالة TO_NUMBER
تقوم ھذه الدالة بتحويل القيمة الرقمية المخزنة عى شكل حرف CHARإلى قيمة رقمية فعليه
NUMBER
الشكل العام
)TO_NUMBER (VALUE
حيث
قيمة مخزنة على شكل أرقام حرفية سيتم عرضھا على شكل قيم رقمية VALUE
moon
مثال
لنفرض أن لدينا حقل اسمه NUMفي جدول DATAبه ارقام ولكنھا ارقام حرفيه أي انھا
تعامل معاملة الحروف فال تدخل في العمليات الحسابية فعند تنفيذ ھذه الدالة ستم تحويل القيم إلى
فيم رقمية يمكن ان تدخل في العمليات الحسابية
NUM )TO_NUMBER(NUM
----------------------------------------------------------------------------------------
9236 9236
7526 7526
مالحظة
العمودان بھما نفس القيم ولكن يوجد اختالف في النوع
الدالة TO_DATE
تقوم ھذه الدالة بتحويل المتغير الحرفي داخل اشاؤة النص الى متعير بشكل تاريخ المثال التالي
يوضح ذلك :
)’SELECT TO_DATE (‘JULY 7,2003’,’MONTH DD, YY
;FROM DUAL
ملخص الفصل
تناولنا في ھذا الفصل دوال التاريخ الخاصة بالتعامل مع كامل الصيغ للتاريخ والوقت
واستعراضھا بعدة أشكالھا ثم تطرقنا دوال التحويل التي تعمل تحويل حاالت الكتابة من نص إلى
تاريخ و بالعكس كذلك من أرقام الى نص
moon
الدوال الرقمية
أھداف الفصل
تستخدم ھذه الدالة إليجاد القيمة المطلقة لرقم معين وغالبا يتم استخدان ھذه الدالة مع جمل أخرى
الشكل العام
)ABS (COL|VALUE
حيث أن
مثال
نالحظ أن قيم العمود hierdate-sysdateقيم سالبة ولكي نجعلھا دائما موجبة نأخذ القيمة
المطلقة لھذا العمود ونكتب
الشكل العام
)POWER (COL|VALUE,P
حيث أن
مثال
الشكل العام
)SQRT (COL|VALUE
حيث أن
مثال
تستخدم ھذه الدالة لتقريب العدد إلى اقرب رقم عشري أو صحيح
الشكل العام
)ROUND (COL|VALUE, N
حيث أن
مثال
الشكل العام
)TRUNC (COL|VALUE,N
حيث أن
مثال
الصيغة العامة
MOD (VALUE1, VALUE2)
حيث أن
مثال
SELECT DIGIT1, MOD (DIGIT1, 7) FROM DIGITS
تستخدم ھذه الدالة لفحص إشارة الرقم فإذا كانت اإلشارة موجبة تعود بالقيمة ) (١أما اذا كانت
اإلشارة سالبة فتعود بالقيمة )(-١
مثال
ملخص الفصل
تناولنا في ھذا الفصل الدوال الرقمية في لغة االستعالم واالستفھام في نظام قواعد البيانات
اوراكل وقد قسمنا ھذه الدوال حسب وظائفھا فمنھا مايتعامل مع سجل أو صف من البيانات
ومنھا مايتعامل مع مجموعة من السجالت RECORDSاو األعمدة )COLUMNSالحقول(
حيث تطرقنا الى دالة القيمة المطلقة والدالة االسية والجذر التربيعي وكذلك دوال التقريب ودالة
باقي القسمة واالشارة
moon
استرجاع البيانات
أھداف اافصل
EQUAI JOIN-١
الصيغة العامة
حيث نكتب بعد SELESTاالعمدة التي نريد ظھورھا والحظ كذلك أنه من الضروري كتابة
االعمدة التي عن طريقھا تم الربط)التي يتساوى فيھا الحقول في الجدولين( ونكتب بعد كلمة
WHEREالعمودان اللذان تم ربط الجدولين عن طريقھما
مالحظة
نكتب اسم الجدول اوال ثم اسم العمود وبينھما نقطه table.column
moon
مثال
DEPT_ID L A S T_ N A M E NAME
------------------------------------------------
50 VELASQUEA ADMINISTRATION
41 NGAO OPERATOPNS
31 NAGAYAMA SALES
50 ROPEBURN ADMINISTRATION
41 URGIHART OPERATOPNS
42 MENCHU OPERATOPNS
43 BIRI OPERATOPNS
45 HAVEL OPERATOPNS
DEPT_ID L A S T_ N A M E NAME
------------------------------------------------
41 NGAO OPERATOPNS
41 URGIHART OPERATOPNS
مثال
SELECT S_EMP.ename, S_EMP.job, S_EMP.sal,
salgrade.grade
FROM S_EMP, salgrade
WHERE S_EMP.sal BETWEEN salgrade.losal AND
salgrade.hisal;
OUTER JOIN-٣
يستخدم ھذا النوع لرؤية السجالت في الجدول الثاني التي ال يقابلھا سجالت في الجدول األول
الصيغة العامة
مالحظة
( في ھذا النوع من الربط حيث نكتبه بجوار االسم الحقل الذي ال يحتوي على+) نسنخدم المعامل
قيمة
moon
مثال
SELF JOIN-٤
تستخدم لربط صف من جدول بصف اخر من نفس الجدول
moon
: مثال
SELECT worker.last_name||' works for '||
manager.last_name
FROM s_emp worker, s_emp manager
WHERE worker.manager_id = manager.id;
في اخر مثال قمنا باستدعاء الجدول s_empباسم مستعار workerومرة أخرى ياسم
managerوھذا االسم يقوم محل اسم الجدول وقد استخدمناه للتسھيل
مثال
تناولنا في ھذا الفصل جمل SQLالخاصة باسترجاع بيانات من اكثر من جدول كعرض رقم
اقسام الموظفين من جدول الموطفين وتطرقنا كذلك إلى عملية استرجاع البيانات من خالل اسم
مستعار
moon
أھداف الفصل
تقوم ھذه الدالة بعملية حصر الحقول في عمود معين والتي ال تحمل القيمة NULL
الشكل العام
)COUNT (DISTINCT|ALL|EXP
حيث أن
تستخدم لمنع احتساب الحقول التي تحمل القيمة NULL DISTINCT
يكون المدى ھنا جميع الحقول حتى المكررة ALL
يمكن استخدام اسم العمود EXP
مثال
;SELECT COUNT (DISTINCT NAME) FROM S_EMP
تقوم الجملة السايقة بتحديد عدد الصفوف للحقل NAMEمن الجدول S_EMP
مثال
حساب عدد السجالت في الجدول
;SELECT COUNT (*) ”TOTAL” FROM S_EMP
الشكل العام
)MAX (DISTINCT|ALL|EXP
مثال
moon
الشكل العام
)MIN (DISTINCT|ALL|EXP
مثال
;SELECT MIN (DISTINCT salary) FROM S_EMP
تقوم ھذه الدالة بعرض مجموع القيم الموجودة في حقل او عمود معين
)SUM (DISTINCT|ALL|EXP
مثال
;SELECT SUM (salary) FROM S_EMP
تقوم ھذه الجملة بعرض مجموع رواتب الموظفين في جدول الموظفين S_EMP
تقوم ھذه الدالة بعرض المعدل لمجموعة قراءات قد تكون موجودة في جدول معين
الشكل العام
)AVG (COLUMN
مثال
moon
الشكل العام
)STDDEV (DISTINCT|ALL
مثال
إلبجاد االنحراف المعياري لألرقام الواردة في حقل الرواتب في جدول الموظفين S_EMP
مثال
;SELECT VARIANCE (SALARY) FROM S_EMP
moon
دوال المجموعات
ھي عبارة عن جميع الدوال السابقة او أي دوال اخرى ولكن باستخداماھا مع الدالة
GROUP BYممايؤدي إلى تجزئة الجدول الرئيسي إلى مجموعات اصغر منه حسب شرط
مغين
الشكل العام
GROUP BY COL_NAME
DEPT_ID Number
------- ------
41 4
نالحظ ظھور سطر واحد من البيانات للقسم ٤١فالدالة GROUP BYقامت بتجميع القسم ٤١
مع بعضه )وكأنھا عملت جدول خاص بھا( وھذه واضح عندما استخدمنا دالة COUNT
اظھرت ان عدد السجالت ٤رغم أن عدد االسطر ھو واحد
moon
اذا اردنا اظھر بيانات من جدول الموظفين EMPوعمل مجموعات بشرط أن تكون الوظيفة
MANAGER
)SELECT DEPTNO, JOB, COUNT (*), SUM (SAL
FROM S_EMP
GROUP BY DEPARTNO, JOB
;’HAVING JOB=’MANAGER
مثال
اذا اردنا اظھار بيانات من جدول الموظفين EMPوعمل مجموعات بشرط أن تكون الوظيفة
MANAGERأو ANALYSTاو SALESMAN
ملخص الفصل
ركزنا في ھذا الفصل على جمل SQLالخاصة بالدوال الرياضية واالحصائية التي تقوم بعرض
قيمة واحدة من البيانات مثل MAX,MIN,AVGوغيرھا ومن ثم دوال المجموعات التي
تكون غالبا مع االمر GROUP BYوالتي تقوم بفرز الجدول الى جدول اصغر منه أو يساويه
moon
االستعالمات الفرعية
أھداف الفصل
في نھاية ھذا الفصل ان شاء ﷲ ستكون قادرعلى
االستعالم الفرعي
مقدمة
لنفترض أنك ترغب في كتابة استعالم إليجاد بيانات الموظفين الذين تزيد رواتبھم عن راتب أحد
الموظفين
في ھذه الحالة تحتاج الى استعالمين
استعالم اليجاد راتب الموظف المعني -١
استعالم اليجاد الموظفين الذين تزيد رواتبھم عن المبلغ المحسوب في االستعالم األول -٢
ويمكنك دمج االستعالمين وذلك بتركيب احد االستعالمين في االخر ،االستعالم الداخلي سوف
يعود بقيمة )قيم( والتي يستخدمھا االستعالم الخارجي )الرئيسي(
إن استخدام االستعالمات الفرعية يشبه تماما تنفيذ االستعالمين بشكل متتال واستالم نتيجة
االستعالم االول كنتيجة بحث في االستعالم الثاني
ھو جملة استفسار SELECTمضمنة داخل جملة استفسار رئيسية السترجاع قيمة أو مجموعة
من القيم ليتم استخدامھا في االستعالم الرئيسي انظر الشكل التالي
الشكل العام
نستخدم ھذا االستعالم في حالة ان االستعالم الفرعي ال يعود اال بسطر واحد انظر الى المثال
التالي
مالحظة
-١أنواع معامالت المقارتة الخاصة بھذا النوع ھي
>< >, <, <=, >=.
يقوم االستعالم الفرعي في ھذا المثال ياستخراج أرقام الموظفين الذين اسمھم ''Finance
او رقم منطقتھم ٢من جدول االقسام فھذا االستعالم سيعود بعدة فيم يأخذھا االستعالم الرئيسي
ويستخرج اسماء الموظفين على اساسھا
مالحظة
أنواع معامالت المقارتة الخاصة بھذا النوع ھي -١
IN, ALL, ANY
اذا استخدمنا معامالت االستعالم احادي الصف مع استعالم متعدد فان البرنامج يعطيك -٢
رسالة خطأ
ORA-01427:single-row sub query returns more
than one row
ملخص الفصل
في ھذا الفصل تعرفنا على االستعالمات الفرعية واھميتھا وشروطھا وانواعھا األحادية
والمتعددة
moon
أھداف الفصل
تعريف الجدول
قلنا سايقا أن الجدول أو الملف يتكون من مجموعة من السجالت RECORDSوكل سجل
يتكون من مجموعة من الحقول FIELDSكل حقل به مجموعة من الحروف او االرقام وھذه
الحقول لھا طول أو عرض
ويعرف الملف أو الجدول بأنه مجموعة من األعمدة ويمثل كل عمود بحقل من الحقول ولكل حقل
نوع بياناته
يتكون ھذا الحقل من الحروف األبجدية ،األرقام ،والرموز الخاصة .وطول أو عرض ھذا
الحقل يصل الى ٢٤٠حرف وال بد من تحديد طول أو عرض الحقل وھو اجباري واذا لم يتم
التحديد سيفترض البرنامج انه ١
الشكل العام
)var CHAR (size
مثال
)FirstName CHAR (20
يتكون ھذا الحقل من الحروف األبجدية ،األرقام ،والرموز الخاصة .وطول أو عرض ھذا
الحقل يصل الى ٢٤٠حرف ال يوجد طول افتراضي للحقل
مثال
)FirstName VARCHAR2 (20
moon
ويتكون من األرقام ) (0,1,2-9واالشارة +أو _ ويمكن أن يحتوي على العالمة العشرية أو
الفاصلة العشرية ) (.والحد األقصى لعدد خانات الرقم يصل إلى ٤٠خانة وتحديد طول
أوعرض الحقل اختياري وكذلك االشارة أو الفاصلة العشرية
مثال
)Serial_No NUMBER (10
مثال
)Mark NUMBER (10,3
يتكون ھذا الحقل من مجموعة األرقام للداللة على اليوم والشھر والسنة وطول ھذا الحقل ٨
خانات على األقل ويمكن أن يتغير شكل كتابة التاريخ بذكر اسم الشھر
مثال
HireDate DATE
moon
إنشاء جدول
إنشاء جدول باستخدام أمر CREATE
الشكل العام
حيث ان
مثال
( CREATE TABLE SCHOOL
S_no NUMBER (5) NOT NULL,
S_NAME CHAR (20).
S_LOC CHAR(15),
;)S_DATE DATE
التقييد CONSTRAINT
يتم عن طريق التقييد فرض بعض القواعد على الحقول مثال جعل حقل مفتاح أساسي
منع ترك حقل فارغ ومن أنواعه
NOT NULL •
UNIQUE •
PRIMARY KEY •
FORIGN KEY •
الشكل العام
مثال
CREATE TABLE friend...
phone VARCHAR2(15) NOT NULL,...
)last_name VARCHAR2(25
CONSTRAINT friend_last_name_nn NOT NULL,...
-٢فريد UNIQUE
ھذا األمريجعل الحقل )العمود( فريد فال يسمح بتكرار صف من الصفوف فكل صف ال يوجد اال
مرة واحدة
مالحظة
-١يمكن أن يحتوي الحقل الفريد UNIQUEعلى قيمة فارغة بشرط أن يكون حقل واحد فقط
فريد UNIQUE
-٢وبمكن أن يوجد في الجدول أكثر حقل فريد
مثال
ال يمكن ألي جدول أن يحتوي اال على مفتاح أساسي واحد وإذا قمنا بتحويل حقل الى مفتاح
أساسي فھذا الحقل يعتبر حقل فريد ولكن ال يمكن أن يحتوي على قيم فارغة
مثال
يمكن تعيين حقل )عمود( واحد أو أكثر ليكون مفتاح خارجي حيث يكون ھذا العمود مرتبط
بعمود اخر به مفتاح اساسي او فريد من نفس الجدول أو جدول اخر ومن الضروري أن يكون
مرتبط بقيمة اخرى من عمود اخر او يكون فارغ
انظر المثال التالي
moon
إلنشاء جدول بواسطة جدول آخر يجب أن يكون الجدول اآلخر منشأ مسبقا ثم نكتب األمر
كالتالي
الشكل العام
مثال
قمنا في ھذه الجملة بعمل جدول جديد ثم نقلنا بيانات الجدول S_EMPاليه
إلنشاء جدول بواسطة استعالم فرعي يجب أن يكون االستعالم الفرعي قائم على االستعالم من
جدول منشأ مسبقا ثم نكتب األمر كالتالي
moon
الشكل العام
مثال
تستخدم ھذه الجملة لغرض مواصفات الجدول ويمكن كتابتھا كلمة كاملة أو مختصرة DESC
الشكل العام
;DESCRIBE tablename
مثال
;DESCRIBE S_EMP
ملخص الفصل
في ھذا الفصل قمنا بالتعرف على الجداول وأنواع التقييد وكيفية إنشائھا وإدراج المفتاح
األساسي والخارجي في الجدول وكيفية انشاء جدول من جدول اخر وكذلك من استعالم فرعي
ومعرفة كيفية عرض معلومات الجدول
moon
تعديل الجداول
تتيح لك الـ SQLعملية تعديل الجدول بعد إنشائه في الحاالت التالية
تستخدم ھذه الجملة إلضافة حقول أو لتعديل الحقول في الجدول ويشمل ھذا التعديل اسم الحقل
ونوعه الحقل وحجم بياناته أو الحاق عبارة فارغ أو غير فارغ الى الحقل
الشكل العام
حيث أن
اسم الجدول المراد تعديله tablename
اسم الحقل field
نوع البيانات Type
طول أو حجم الحقل size
الشكل العام
حذف الجداول
يمكن أن نحذف الجدول من قاعدة البيانات بواسطة األمر DROP TABLEبشرط أن تكون
مالك الجدول أو لك صالحية للحذف
حيث
اسم الجدول المراد حذفه ;tablename
ملخص الفصل
في ھذا الفصل تناولنا عملية تعدبل الجداول من إضافة وتعديل قول الجدول مع عدم امكانية
حذف حقل موجود في الجدول وكذلك كيفية حذف المفتاح األساسي من الجدول وحذف الجدول
من قاعدة البيانات بواسطة االمر DROP
moon
إضافة بيانات
مقدمة
لقد قمنا في الفصول السابقة بإنشاء الجداول والتعرف على أنواع البيانات وتعديل مواصفات
الحقول وبھذا نكون قد أنشأنا جدول البيانات وحددنا خصائص الحقول من حيث نوع البيانات
والحجم أي أننا أعددنا الوعاء الذي سيحوي البيانات وفي ھذا الفصل سنتعلم بمشيئة ﷲ كيفية
إضافة البيانات إلى ھذه الجداول واألمور المتعلقة بعمليات اإلضافة وأنواعھا ،كما أن ھذا
الفصل يشكل مدخال وجزأ أساسيا للغة تناول البيانات ) (DMLفي نظام قواعد بيانات أوراكل
التي تعتبر إحدى النظم القوية في نظم إدارة قواعد البيانات ) (DBMSلما لھا من أثر فعال في
معالجة البيانات داخل الجدول حيث تشمل لغة تناول البيانات ) (DMLعلى األجزاء التالية :
ھي العملية التي يتم بھا إدخال سجل /سجالت إلى جدول البيانات من خالل جملة INSERT
وتتم ھذه العملية بعدة طرق
الصيغة العامة:
حيث أن
اسم الجدول المراد إلحاق السجل به Table
اسماء األعمدة)الحقول( المطلوب إدخال البيانات إليھا Column1,Column2
القيم المطلوب إضافتھا في Value1, value2
حقول السجل الجديد وكل
قيمة يتم إدراجھا في الحقل
المناسب في القائمة وبالتالي
سيتم إضلفة القيمة ١في الحقل
١وھكذا
الشرح
moon
بعد تنفيذ جملة اإلدخال بھذه الطريقة سوف يتم إضافة بيانات سجل واحد فقط في الجدول
المذكور يحتوي على قيم تم إ دراجھا في جملة اإلدخال وللحقول المذكورة فقط
القواعد التي يجب التقيد بھا في ھذه الطريقة
يجب أن يكون عدد القيم التي سيتم إدخالھا ھو نفس عدد الحقول المذكور في جملة -١
INSERT
يجب أن يكون نوع بيانات القيم التي سيتم إدخالھا من نفس نوع بيانات الحقول وأن -٢
تكون ھذه القيم مرتبة حسب ترتيب الحقول في جملة INSERT
مثال
مثال
INSERT INTO s_dept
VALUES ;)(13, 'Administration', NULL
يجوز عدم ذكر أسماء الحقول في جملة INSERTفي حالة إدخال بيانات جميع -٥
الحقول لھذا السجل على أن تكون القيم المدخلة مرتبة حسب الترتيب االفتراضي للحقول في
الجدول عند بنائه
مالحظة
لمعرفة الترتيب االفتراضي للحقول في الجدول نستخدم األمر DESC
مثال
من خالل ھذه الطريقة يمكن ادخال أكثر من سجل واحد إلى جدول البيانات عن طريق استخدام
متغيرات االدخال وھي عبارة عن متغيرات توضع في جملة االدخال بدال من القيم نفسھا ةيمكن
أن نطلق على ھذه الطريقة جملة االدخال متعددة السجالت
حيث ان
اسم الجدول المراد إلحاق السجل به Table
اسماء األعمدة)الحقول( المطلوب إدخال البيانات إليھا Column1,Column2
متغيرات Variable1, Variable 2
اإلدخال التي
سوف يتم
استبدالھا بقيم
حقيقية بعد
تنقيذ جملة
االدخال
الشرح
بعد تنفيذ جملة بھذه الطريقة سوف يطلب منك إدخال القيم للمتغيرات المذكورة في جملة اإلدخال
وبعد االنتھاء من ادخال القيمة تضغط مفتاح ENTERمن لوحة المفاتيح وھكذا حتى تنتھي من
إدخال حقول السجل األول وإلدخال سجل آخر يمكنك الضغط على حرف ) (Rثم مفتاح
ENTERمن لوحة المفاتيح وھو يعني تكرار اإلدخال لسجالت اخرى
مثال
تنطبق على ھذه الطريقة جميع القواعد المذكورة في الطريقة األولى ويضاف إليھا مايلي :
تستبدل القيم في جملة اإلدخال بمتغيرات -١
يعود اختيار أسماء المتغيرات إلى المستخدم مع مراعاة شروط تسمية المتغيرات -٢
يجب أن توضع عالمة & قبل متغير االدخال -٣
في جملة اإلدخال يمكن وضع عالمتى تنصيص مفردتين حول متغير االدخال الخاص -٤
بالحقول النصبة
moon
من خالل ھذه الطريقة يمكن إدخال أكثرمن سجل واحد إلى جدول البيانات عن طريق نسخ ھذا
السجل /السجالت من جدول آخر بواسطة جملة االستفسار SELECTحيث نستخدم جملة
INSERTمع استعالم فرعي انظر الى المثال التالي
الشرح
بعد تنفيذ جملة اإلدخال بھذه الطريقة ينم نسخ السجالت التي تحقق الشرط من الجدول ا لمصدر
إلى الجدول الھدف وللحقول االمذكورة في جملة اإلدخال
ملخص الفصل
تناولنا من خالل ھذا الفصل موضوع اضافة البيانات إلى الجداول بواسطة جملة INSERT
وھنالك ثالثة طرق إلجراء عملية اإلضافة
بھذه الطريفة سوف يتم إضافة بيانات سجل واحد فقط إلى جدول يحتوي على القيم التي ستذكر
في جملة اإلدخال
بھذه الطريقة يمكن إدخال أكثر من سجل واحد إلى جدول البيانات عن طريق استخدام متغيرات
االدخال وھي عبارة عن متغيرات توضع في جملة اإلدخال بدال من القيم نفسھا ويمكن أن نطلق
على ھذه الطريقة جملة االدخال متعددة السجالت
بھذه الطريقة يمكن إدخال أكثر من سجل واحد إلى جدول البيانات عن طريق نسخ ھذا السجل /
السجالت من جدول آخر بواسطة جملة SELECTالموجودة بداخل جملة INSERT
moon
في ھذا الفصل سنتعلم كيفية تعديل البيانات وحذف السجالت كما أن ھذا الفصل يشكل جزأ
أساسيا مكمال للغة تناول البيانات DMLفي نظام أوراكل التي يعتبر احدى النظم القوية في نظم
إدارة قواعد البيانات DBMSلما لھا من أثر فعال في معالجة البيانات داخل الجدول حيث
تشتمل لغة تناول البيانات DMLعلى االجزاء التالية
ولقد تناولنا ادخال البيانات في الفصل السابق وسندرس تعديل البيانات وحذفھا في ھذا الفصل
ھي العملية التي يتم بھا تعديل بيانات حقل /حقول في سجل واحد أو اكثر في جدول البيانات من
خالل جملة UPDATEوتتم ھذه العملية بطريقتين:
الصيغة العامة
الشرح
بعد تنفيذ جملة التعديل بھذه الطريقة سوف يتم تعديل بيانات الحقل /الحقول المذكورة بحيث يتم
إلغاء القيم الموجودة فيھا لتحتوي القيم الجديدة المذكورة في جملة التعديل علما بأن السجالت التي
سيتم تعديل بياناتھا ھي فقط السجالت التي تحقق الشرط في الجملة الشرطية
moon
مثال
UPDATE s_emp
SET dept_id = 10
WHERE ;id = 2
الصيغة العامة
الشرح
بعد تنفيذ جملة التعديل بھذه الطريقة سوف بتم تعديل بيانات الحقل /الحقول المذكورة بحيث يتم
إلغاء القيم الموجودة فيھا لتحتوي القيم الجديدة المذكورة في جملة التعديل علما بأن السجالت التي
سيتم تعديل بياناتھا ھي حميع السجالت في الجدول
مثال
UPDATE s_emp
SET commission_pct = 10
moon
الصيغة العامة
;]DELETE [FROM] table[WHERE condition
بعد تنفيذ جملة الحذف الطريقة سوف يتم حذف السجل /السجالت التي تحقق الشرط في الجملة
الشرطية
.
القواعد التي يجب التقيد بھا في ھذه الطريقة :
يجب التأكد من بيانات السجالت التي سيتم حذفھا قبل تنفيذ جملة الحذف وكذلك التأكد -١
من الشرط في الجملة الشرطية ألن السجالت التي ستحذف تعتمد على الشرط المذكور
الصيغة العامة
;DELETE [FROM] table
الشرح
بعد تنفيذ جملة الحذف بھذه الطريقة سوف يتم حذف جميع السجالت في الجدول
moon
ملخص الفصل
تناولنا في ھذا الفصل موضوع تعديل البيانات في الجدول بواسطة جملة UPDATEوھنالك
طريقتان الجراء عملية التعديل وھما
حيث يتم الغاء القيم الموجودة بھا لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما بأن
السجالت التي سيتتم التعديل بھا ھي السجالن التي تحقق الشرط.
حيث يتم الغاء القيم الموجودة بھا لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما انه
سيتم تعديل بيانات جميع الحقول لعدم وجود شرط
ثم تناولنا موضوع حذف السجالت عن DELETEوھنالك طريقتان إلجراء عمليةا الحذف
بھذه الطريقة سوف يتم حذف السجل /السجالت التي تحقق الشرط في جملة الشرط
أھداف الفصل
المتسلسالت
.المتسلسلة عبارة عن مجموعه من االرقام المتتالية تتولد تلقائيا مثل ١و٢و ،،، ٣حيث تستخدم
كمفتاح أساسي Primary Keyالنھا عبارة عن قيم فريده وتتعامل معھا الذاكره بسھولة وبكفائه
الصيغة العامة
حيث أن
اسم المتسلسلة Name
مقدار الزيادة كل مرة N1
اول رقم تبدأ منه المتسلسلة N2
اقصى قيمه للمتسلسلة N3
ادنى قيمة للمتسلسلة N4
عدد الخانات في الذاكره N5
الشرح
مثال
لكي نحصل على أفضل أداء للمتسلسلة نقوم بحجز اماكن في الذاكره ألكبر عدد من المصفوفات
نعرفه ولكن اذا ستخدمنا عدد كبير فإننا سنشغل الذاكره ونبطئ التعامل مع الجھاز واذا ستخدمنا
عدد قليل لن يكون كافي للمتسلسله
Table_name.NEXTVAL -١٠
Table_name.CURRVAL
حيث قمنا بإضافة قيمه جديدة الى المتسلسلة في خانة idثم قمنا باضافة
financeالى خانة nameو 2في خانة region_id
SELECT s_dept_id.CURRVAL
;FROM SYS.dual
تعديل متسلسلة
يمكن تعديل مقدار الزياده أو القيمه االبتدائية للمتسلسله وتحديد اكبر وقيمه وادنى قيمه أو تغيبر
خيار التكراراو الذاكره عن طريق االمر ALTER
الصيغه العامه
حذف متسلسلة
مثال
الفھرسة
الفھرسة عبارة عن وسبلة مصممه لتسھيل الحصول على البيانات بسرعه من الجداول مثل
الفھرس الموجود بأي كتاب فعندما نريد الوصول الى معلومة بسرعة ننظر الى الفھرس اوال
وكذلك ھو الحال في األوراكل فعندما نقوم بفھرسة مجموعة من البيانات فاننا نستطيع الى احد
ھذه البيانات بسرعه ويتم كذلك البحث بين الجداول بسرعه ومن مميزات الفھرسه كذلك انھا تقلل
عدد البيانات المنتقله خالل وسائل االخراج واالدخال
من الضروري احيانا ترقيم الحقول ترقيم تلقائي مثل ارقام المناطق او ارقام السلع بدال من
الترقيم العادي
الفھرسه التلقائية
عندما نقوم بتعريف حقل على انه مفتاح أساسي أو اذا جعلناه حقل فريد فانه تلقائيا يفھرس
الفھرسة العادية
أنواع الفھرسة
توجد عدة أنواع للفھرسه حيث يمكن فھرسة حقل )عمود( واحد او مجموعة من األعمدة منھا
وتستخدم الفھرسة المركبه عندما تعود جملة SELECTبعدة قيم فيتم ترتيبھا عن طريق
استخدام الفھرسة المركبة
moon
عندما نقوم بفھرسة حقل فإن االوراكل يقوم بتكوين مايسمى index segmentيتم فيھا تخزين
معلومات خاصة بالفھرسة والتي تسرع الوصول الى البيانات حيث أن ھذه المعلومات توضح
أماكن السجالت وتوضح أقصر الطرق للوصول اليھا عن طريق وسائل االخرج واالدخال
والمصطلح الذي تعتمد عليه الفھرسة يسمى B*-tree indexھي عبارة عن مخطط شجري
لمجموعة من القيم مرتبة تنازليا حيث كلما ننتقل الى قيمة تاليه يتم مقارنتھا مع كتلة القيم التي
تعلوھا وتسمى ھذه الكتل branch blocksوناتج ھذه المقارنه يتم مقارنته مع كتل اخرى إلى
أدنى درجة في ھذه الكتل ويسمى leaf blocksحيث تحتوي ھذه الكتلة على كل البيانات
المفھرسه ويوجد ما يسمى ROWIDلھذه البيانات
اذا كانت البيانات فردية فإنه يوجد ROWIDلكل قيمة ولكن اذا لمت تكن فردية فانه يمكن ان
يتواجد أكثر من ROWIDوفي ھذه الحالة يتم ترتيبھا البيانات حسب مفتاح الفھرسه ثم حسب
ROWID
الصيغة العامة
حيث أن
Indexاسم الفھرس
Tableاسم الجدول
اسن الحقل المراد فھرستة Column
moon
مثال
ال نفھرس الجداول التي استعلم عنھا بعدد كبير من الصفوف حيث نستخدم -١
الفھرسه عندما يكون االستعالم ال يتجاوز % ٥من الجدول
ال نفھرس الحقول التي يتم التعديل فيھا باستمرار -٢
ال نفھرس الجداول التي تحتوي على قيم متكررة بكثرة -٣
نفھرس الحقول التي يكون االستعالم عنھا سھل غالبا فال نستخدم الفھرسه مع -٤
استعالمات شروطھا معقدة
ال نفھرس غالبا الحقول التي ال تحتوي على قيم فريدة -٥
نفھرس الحقول التي تعتبر حقول رابطه بين جدول واخر -٦
حذف الفھرسة
مثال
العروض
العرض عبارة عن استعالم من جدول واحد أو اكثر حيث يعتبر جدول وھمي يحتوي
على البيانات التي يأخذھا من جملة SELECTولكن حقيقة ان ھذا الجدول غير موجود
الصيغة العامة
حيث أن
مثال
;DESC empvu45
نحتاج احيانا الى أن نجعل بعض الجداول او العروض مسموحة لمستخدمين معينين كمدراء
الشبكة فلذلك نقوم باضافة حقل جديد ونقيده بـ CHECKحيث اذا كان المستخدم مدير يعطي Y
واذا لم يكن يعطي Nولعمل ذلك نقوم بعدة خطوات
اوال
alter table S_EMP
add
;)))'(Manager char(1) check (Manager in ('Y','N
ثانيا
update S_EMP
'set Manager = 'N
where
;ID != 1001
moon
ثالثا
update S_EMP
'set Manager = 'Y
where
;ID = 1001
في اخر خطوتين قمنا بتحديد شرط وھو في حالة اذاكان رقم الموظف ١٠٠١فانه ھو المدير
لذلك في حقل Managerيعطي Yوغير ذلك يعطي N
رابعا
في ھذه الخطوة والتي تليھا سنقوم بإضافة حقل السم مستخدم حيث اسم المستخدم سيكون عبارة
عن اول حرف من االسم األول للموظف باالضافة الى اسمه االخير
خامسا
update S_EMP
|| )set username = substr(first_name,1,1
;last_name
سادسا
userاسم المستخدم لقاعدة البيانات الحالي لذلك قيمة ھذا المتغير تعتمد على المستخدم الحالي
للقاعدة حيث قمنا بعمل عملية ربط خارجي outer-joinشرطھا أنه اذا كان المستخدم الحالي
لقاعدة البيانات اسمه موجود في حقل اسماء المستخدمين في جدول الموظفين فانه يعود بقيمة في
حقل Managerاما Yاو Nكما قلنا حسب رقم الموظف والدالة Decodeتقوم مشاھدة قيمة
Managerاذا كانت Yفإن المستخدم مدير وبتم عرض حقل المرتب واذا كانت Nال يتم
عرض حقل المرتب
moon
select *
from Re_Salary;
تعديل العرض
مثال
مثال
حذف عرض
ملخص الفصل
تناولنا في ھذا الفصل كيفية تكوين المتسلسالت وتعدبلھا وطريقة حذفھا ثم تطرقنا الى الفھرسة
وفوائدھا وانواعھا وكيفية عملھا وتعديلھا وكذلك الغائھا وفي اخر الفصل تطرقنا الى العروض
مفھومھا وفوائدھا وافكارھا وكيفية تعديلھا والغائھا
moon
نبذه PL/SQL
أھداف الفصل.
-١التعرف على PL/SQL
-٢استخدام عبارة الشرط IF - THEN
-٣استخدام التكرار
moon
برامج pl/sqlتتم كتابتھا في كتل من اوامر البرمجة تحتوي على مقاطع منفصلة لالعالن عن
المتغيرات واوامر البرامج ومعالجة االستثناءت)االخطاء( .
ومن الممكن تخزبن االجراء في قاعدة البيانات كبرنامج فرعي له اسم محدد او كتابتھا مباشرة
في sql * plusككتله مجھولة.
DECLARE
هﻨﺎ ﺗﻮﺟﺪ ﺗﻌﺮﻳﻔﺎت اﻟﻤﺘﻐﻴﺮات واﻟﻤﻮﺷﺮات
BEGIN
ﺟﺴﻢ اﻟﺒﺮﻧﺎﻣﺞ
EXCEPTION
رﻣﻮز ﻣﻌﺎﻟﺠﺔ اﻻﺧﻄﺎء
END:
اي اذا كان اليوجد لديك تعريف متغيرات التستخدم declareواذا كنت الن تتعامل مع االخطاء
التستخدم exception
والصيغة العامة لتعريف المتغيرات في declare
مثال
;)v_gender CHAR(1
;v_count BINARY_INTEGER := 0
;v_total_sal NUMBER(9,2) := 0
;v_order_date DATE := SYSDATE + 7
c_tax_rate ;CONSTANT NUMBER(3,2) := 8.25
;v_valid BOOLEAN NOT NULL := TRUE
باإلضافة الى المتغيرات التي توجد SQLتوجد ھنالك متغيرات تدعمھا لغة ال PL\SQL
NATURAL -٣
POSITIVE -٤
وتشمل االرقام الموجبة فقط من ١الى ٢.١٤٧.٤٨٣.٦٤٧
BOOLEAN -٣
%TYPE-٤
صمم ھذا المتغير ليحمل نفس نوع البيانات التي يحملھا حقل معين
%ROWTYPE -٤
moon
صمم ھذا المتغير ليكون متغير مركب يحمل نفس توع البيانات التي يحملھا صف معين
الصيغة العامة
variable-name ;table-name.column-name%TYPE
مثال
v_last_name ;s_emp.last_name%TYPE
لمتغير
last_nameفي جدول S_EMPويحتوي على نفس القيم
الصيغة العامة
variable-name ;table-name%ROWTYPE
مثال
emp_record ;s_emp%ROWTYPE
يف المتغير المركب
s_emp
طرق االسناد
;i:=5
)DBMS_OUTPUT.PUT_LINE(massege
حيث
تم شرح ھذا االمر لكي نبدأ به ونستخدمه لفھم اوامر ال pl/sqlلكن في المستقبل سوف تعرف
ان ھذا االمر اليھمك كثيرا
.مثال :
نريد طباعة " "hi allعلى الشاشة sql * plusيتم ذلك كمايلي:
جرب ھذا والحظ النتائج ولعلك تتسال عن سبب وجود السطر االول
السطر االول يخبر sql * plusبأن يكتب كل مايعود به الخادم.
ويكفي كتابته مرة واحدة عندما تدخل sql * plus
تستخدم ھذه العبارة مثل اي العبارت الشرطية في لغة سي او س ي ++او فيج وال بيس ك وغيرھ ا
،ولھا استخدمات عديدة وسوف نعرف كيف نستخدمھا مقدما مع حقول قواعد البيان ات وذل ك بع د
اخذ المؤشرات
حيث أن
مالحظة
• ELSEو ELSIFاختيارية
• جملة IFنحنوي على عدة عبارات ELSIFولكن تحتوي على عبارة ELSEواحدة
• انتبه الى أن طريقة كتابة ELSIFوليست ELSEIF
Declare
i ;)number(5
BEGIN
;i:=5
IF i=5 then
;)DBMS_OUTPUT.PUT_LINE('i = ' || i
ELSE
;)' DBMS_OUTPUT.PUT_LINE('i not eqal 5
;END IF
;END
moon
Declare
i number(5);
BEGIN
i:=5;
IF i>1 then
DBMS_OUTPUT.PUT_LINE(i || ' > 1');
ELSIF i<1 then
DBMS_OUTPUT.PUT_LINE(i || ' < 1');
ELSIF i=1 then
DBMS_OUTPUT.PUT_LINE(i || ' = 1');
END IF;
END;
moon
الـــتكرار
loop-exit-end -١
الشرح
i =1
i =2
i= 3
i =4
i =5
i =6
i =7
i =8
i =9
i =10
Declare
i number(5);
BEGIN
i:=1;
LOOP
EXIT WHEN i>10;
DBMS_OUTPUT.PUT_LINE('i =' || i);
i:=i+1;
End loop;
END;
/
Declare
i number(5);
BEGIN
i:=1;
WHILE i <= 10 LOOP
DBMS_OUTPUT.PUT_LINE('i =' || i);
moon
;i:=i+1
;End loop
;END
/
وھذه ايضا طريقة اخرى الستخدام حلقات التكرار وھي نفس عمل اسلوب حلقات forفي اي لغة
برمجة
والصيغة العامه لھا ھي على االتي
مثـــال:
Declare
i ;)number(5
BEGIN
FOR i IN 1..10 LOOP
;)DBMS_OUTPUT.PUT_LINE('i =' || i
;End loop
;END
/
وسوف يكون الناتج كمايلي)نفس السابق(:
١= i
i =2
i =3
i =4
i =5
i =6
i =7
i =8
i =9
١٠= i
moon
GOTO جملة
تنقل تسلسل عمل البرامج من نقطه الى اخرىGOTO كما في باقي لغات البرمجة فان
الصيغة العامة
GOTO <<my_label>>
حيث أن
مثال
declare
i positive := 1;
max_loops constant positive := 100;
begin
i := 1;
loop
i := i + 1;
if i > max_loops then
goto more_processing;
end if;
end loop;
<<more_processing>>
i := 1;
end;
/
التعليقات
( ثم التعليق--) كتابة -١
مثال
مثال
*** DON’T FORGET MY NAME ***
مثال
/* DON’T FORGET MY NAME */
ولكن مع وجودPL/SQL داخل الكتل البرمجية الخاصة بـSQL يمكنك استعمال جمل
(;) تنتھي بفاصلة منقوطةSQL اختالفات حيث كل جملة
مثال
DECLARE
max_records CONSTANT int := 100;
i int := 1;
BEGIN
FOR i IN 1..max_records LOOP
if (mod(i,10) = 0) then
INSERT INTO test_table
(record_number, current_date)
VALUES
(i, SYSDATE);
else
NULL;
end if;
END LOOP;
COMMIT;
END;
/
المؤشرات
اھداف الفصل
ﺍﻟﻤﺅﺸﺭﺍﺕ CURSORS
يتم تعريف ھذا النوع من المؤشرات كجزء من االعالن declareويجب ان تشتمل عبارة sql
المعرفه على عبارة التحديد selectفقط حيث اليمكن استخدام الكلمات االساسية
insert,update,delete
وعند استخدام المؤشرات الصريحه دائما ماستكتب اربعة مكونات كمايلي:
-١يتم تعريف المؤشر في الجزء declare
-٢يتم فتح المؤشر بعد عبارة begin
DECLARE
IS اﺳﻢ اﻟﻤﺆﺷﺮ CURSOR
اﻻﺳﺘﻌﻼم
ولكي تقوم بفتح ھذا المؤشر وتستخدمه نقوم بفتحه باستخدام االمر openكمايلي:
وبعد فتح المؤشر تقوم باسترجاع او تحميل البيانات سطر)سجل( واحد من المؤشر الذي تم
تعريفه باستخدام االمر FETCHكمايلي:
ومعنى ھذا اي قم باسترجاع البيانات من المؤشر المعطى اسمه وحملھا intoالى المتغيرات كع
مالحظة ان عدد المتغيرات يساوي عدد الحقول الموجودة في استعالم المؤشر.
وبعد االنتھاء من اجراء العمليات على المؤشر يجب عليك اغالقه ويتم اغالقه كمايلي:
moon
close cursor_name
age name no
23 mohammed 111
22 talal 222
24 majed 333
mohammed
الحظنا في المثال السابق ان االستعالم في cursorسوف يعود بسجل واحد لكن ماذا يحدث لو
اعاد المؤشر اكثر من سجل واردنا المرور على كافة السجالت ؟
لحل السؤال السابق البد من استخدام حلقة بھا شرط وھذا ھو ھل سجالت المؤشر انتھت ام ال
ونعرف ذلك من خالل خاصية foundللمؤشر كمايلي:
found%mycur
حيث :
مثال :
نريد انشاء اجراء يقوم بالمرور على الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر
ام ال فاذا كان markاكبر او يساوي ٥٠ضع قيمة trueفي حقل resultواال ضع قيمة false
في حقل result
declare
mar number(3);
no number(3);
cursor res_stu is
select no_stu,mark
from stu_study;
begin
open res_stu;
loop
fetch res_stu into no,mar;
exit when res_stu%notfound;
if mar>=50 then
update stu_study set result='TRUE' where
no_stu=no;
else
update stu_study set result='FALSE' where
no_stu=no;
end if;
end loop;
close res_stu;
end;
/
ھناك طريقة اخرى لتعريف المتغيرات الحظ في الجدول السابق ان الحقل no_Stuتم تعريفه
على انه من نوع numberوتم تعريف المتغير noفي االجراء على انه numberايضا لكي
يتم وضع رقم الطالب فيه لكن الحظ لو تم تغير نوع الحقل في الجدول من numberالى
varchar2فانه يجب عليك تغير نوع المتغير noفي االجراء ايضا لكن ھناك طريقه تجعلك
التعدل االجراء كل مرة وھي استخدام االمر التالي لتعريف المتغير noفي االجراء
type%no_stu.stu_study NO
حيث :
: stu_studyاسم الجدول
ومعنى ماسبق قم بتعريف متغير اسمه noله نفس نوعية الحقل الذي اسمه NO_STUالموجود
في الجدول stu_study .
وبھذا الن تقوم بتغير نوع العنصر في االجراء في كل مرة تغير النوع وھكذا مع جميع
المتغيرات التي لھا صله بالجداول
declare
;mar stu_study.mark%type
;no stu_study.no_stu%type
cursor res_stu is
select no_stu,mark
;from stu_study
begin
;open res_stu
loop
;fetch res_stu into no,mar
;exit when res_stu%notfound
if mar>=50 then
update stu_study set result='TRUE' where
;no_stu=no
else
update stu_study set result='FALSE' where
;no_stu=no
;end if
moon
end loop;
close res_stu;
end;
/
moon
المؤشرات الضمنية
تعرفنا سابقا على فائد المؤشرات cursorsودرسنا النوع االول منھا وفي ھذا الفصل عندنا
نوع اخر وھو المؤشرات الضمنية وھي اسھل من المؤشرات الصريحه
FROM table_name
ومعنى ھذا قم باختيار الحقل ١و الحقل ٢وضعھا في المتغيرات منغير ١و متغير ٢من الجدول
table_name
سوف نأخذ مثال على ذلك وسوف نستخدم الجدول الذي انشئناه سابق في الدرس الثاني عندما
تعاملنا مع المؤشرات الصريحة وكان اسم الجدول stud
واردنا مثال كتابة اجراء يقوم بحساب متوسط اعمار الطالب ) قد يقول البعض انه اليحتاج ذلك
الى اجراء فمجرد استخدام جملة selectنستطيع عمل ذلك انا اقول نعم ھذا صحيح لكن احب
استخدام االجراء في ھذا المثال لكي نرى طريقة عمل المؤشر الضمني ولكن سوف نرى بعد
قليل مثال شامل يتم فيه استخدام الموشرات الصريحه والضمنية في نفس الوقت( واالن نقوم
بكتابة االجراء كمايلي :
moon
:( )المقرراتcourses الجدول االول اسمه: لنفرض انه لدينا الجدولين التاليين
عدد
اسم الطالب كود المقرر الدرجة
النقاط
NO_STU COURSE_CODE MARK POINT
111 216CS 88
222 225CS 75
333 225CS 40
111 225CS 90
222 216CS 78
333 216CS 85
بعد االنتھاء من انشاء وادخال البيانات المطلوب انشاء اجراء يقوم بحساب عدد النقاط لكل طالب
وفي كل مادة وھو الحقل عدد النقاط الذي لم ندخل فيه اي شيء ويجب نعلم ان :
MARK average
95-100 5
90-94 4.75
85-89 4.5
80-84 4
75-79 3.5
70-74 3
65-69 2.5
60-64 2
1-59 1
عدد النقاط في اي مقرر = معدل المادة )وليس الدرجة كمافي الجدول السابق( * عدد ساعات
المقرر
نالحظ من جدول studysان الطالب قد تحصل على درجة ٨٨ونالحظ ان الدرجة من الجدول
السابق ھي بين ٨٩ -٨٥وبالتالي فإن معدل الطالب في ھذا المقرر ھو ) ٤.٥وھي الطريقة
المتبعة في اغلب الجامعات( ،ومن جدول coursesنحصل على عدد الساعات للمقرر وبالتالي
فان :
عدد النقاط = ١٣.٥ = ٣ * ٤.٥وھكذا في جميع الطالب وھذا ھو المطلوب من االجراء عمله.
DECLARE
;no_Student studys.NO_STU%type
;hou courses.hours%type
;mark studys.mark%type
;cou_code courses.code%type
;poi studys.point%type
cursor st_point is
moon
الحظ ھنا اننا استخدمنا المؤشرات الصريحة والمؤشرات الضمنيه والصريحة استخدمناه لكي
والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كلstudys تقوم بفتح سجالت الجدول
.مرة يدور بالحلقة
moon
في التعريفات اتوقع انه التوجد ھناك مشكلة لديكم ،اما جسم البرنامج ابتدأً من beginفھو
كمايلي :
اوال يفتح المؤشر الصريح والذي يحتوي على جميع سجالت الجدول studysثم يكون حلقة
دورانية لكي يمر على جميع سجالت الطالب الموجودة في المؤشر الصريح وطبعا شرط االنھاء
لھذه الحلقة ھو الوصول الى اخر سجل .ثم يقوم بعملية تحديث سجالت الطالب االولى في
المتغيرات كمايلي:
وطبعا المتغيرات ھي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض االن نحن االن عند
السجل االول ووھو الطالب الذي رقمه ١١١ورقم المقرر CS٢١٦ودرجته ھي ٨٨سوف
يضع ھذه البيانات في المتغيرات ،ثم يستخدم مؤشر ضمني لكي يحضر عدد ساعات المادة التي
درسھا الطالب ١١١وھي CS٢١٦و المؤشر ھو
select hours
into hou
from courses
; where code=cou_code
ومعنى ھذا احضر عدد ساعات المقرر الذي رقمه ھو cou_codeوھذا المتغير ھو معروف
من المؤشر الصريح االول وسبب استخدامنا ھذا المؤشر ھو ان عدد ساعات المقرر موجودة في
جدول اخر والبد من استخدام ھذا المؤشر لكي يحضر عدد الساعات .وبما اننا فرضنا اننا عند
السجل االول فسوف يحضر عدد ساعات المقرر CS٢١٦وھي ٣ساعات ثم بدأ يختبر الدرجة
وذلك طبقا للجدول الدرجات والمعدالت حيث كانت درجة الطالب الذي رقمه ١١١في المقرر
cCS٢١٦ھي ٨٨وبالتالي يكون عدد النقاط كمايلي = ، ١٣.٥ = ٣ * ٤.٧٥وبعد االنتھاء
من حساب المعدل يقوم بنعديل الجدول وتحديث قيمة pointبقيمتھا الجديدة ،وھكذا يمر على
كل طالب بنفس الطريقة السابقة الى ان يصل الى نھاية السجالت.وبالتالي تكون النتائج كمايلي
في الجدول : studys
بعد االنتھاء من ھذا المثال نكون انھينا المؤشرات بنوعيھا بشكل تام وبامثله واقعيه
moon
الجـداول في ) pl/sqlالمصفوفات(
تستخدم ھذه الجداول )المصفوفات( مثل المصفوفات في ھي لغة من لغات البرمجة مثل لو كانت
لديك سلسلة من االرقام وتريد تخزينھا فانك تستخدم ھذه الجداول للتخزين ويتم تعريف متغير من
ھذا النوع كمايلي اوال يتم تعريف ھذا النوع :
DECLARE
TYPE num_array IS TABLE OF number(4) INDEX BY
;BINARY_INTEGER
;num num_array
BEGIN
........
........
;END
الحظ اوال تم تعريف نوع واسماه ، num_arrayثم قام بتعريف متغير numواعطاه نوع
num_arrayوھو النوع الجديد الذي قمنا بانشاءه.
وويكون عمل ھذا االجراء كمايلي :الحلقة االولى تقوم بضرب العدد iفي نفسه وتخزنه في
المتغير numبرتبه iوھكذا والحلقة الثانية للطباعة ويكون الناتج كمايلي :
1*1= 1
2*2= 4
3*3= 9
4*4= 16
5*5= 25
6*6= 36
7*7= 49
8*8= 64
9*9= 81
10*10= 100
moon
االجرائيات المخزنة
شاھدنا في الدروس الماضية ان اي اجراء نقوم بكتابة اني اذا اردت استخدامة اكثر من مرة فاني
اقوم بكتابة كل مرة في sql * plusلكي احصل على النتائج لكن ماھو رأيك لو نقوم بتخزين ھذا
االجراء في قاعدة البيانات ونعطية اسم وحينما نحتاجه نستدعية باسمه وھذا يوفر علينا الشيء
الكثير لذلك فصلنا ھو االجرائيات المخزنة.
حيث أن
اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب
معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت
ولتعريف متغير بھذا الشكل يكون كمايلي :
الحظ اسم المتغير ھو student_idثم بعده وضعنا الكلمة inومعنى ان ھذا المتغير يعتبر
كمدخل
اما لتعريف متغير يعود بقيمة من االجراء مثال لو اردنا تعرف متغبر يرجع بمعدل الطالب يتم
التعريف كمايلي :
بعد تنفيذ االجراء يكون ھذا المتغير يحتوي على معدل الطالب الذي تم تمرير رقمه مثال.
moon
مع العلم انه يمكن تعريف متغير للمدخالت والمخرجات حيث تمرر به القيمه اوال وبعد تنفيذ
االجراء يتم وضع القيمه في نفس المتغير وتتم كمايلي :
مــــثال :
في الجدول الذي قمنا بدراسته في الفصول السابقة وكان بأسم studys
لو اردنا تصميم اجراء مخزن لكي يقوم بطباعة درجة الطالب بعد تمرير رقم الطالب ورقم
المقرر.
بعد االنتھاء من تنفيذ االجراء يكون االجراء مخزن في قاعدة البيانات ولكي نقوم باستدعاءه نقوم
بمايلي
begin
;)'stu_mark(111,'216CS
;end
/
الحظ كيف تم استدعاء االجراء السابق من خالل اسم االجراء وبذلك سوف يكون الناتج على
الشاشة كمايلي 88وھي صحيحة بعد تمرير رقم الطالب 111ومقرر 216CS
لكن الحظ اننا لم نستخدم متغيرات اخراج لكن مأرايك ان نصمم اجراء اخر يقوم بنفس الوظيفة
التي يقوم بھا االجراء السابق لكن عملية الطباعة تكون بعد االستدعاء لكي نجعل االجراء يقوم
بارجاع درجة الطالب بمتغير لذلك فان االجراء كمايلي :
بعد ذلك نقوم باستدعاء االجراء ومن ثم طباعة الدرجة الن لو الحظت االجراء اليقوم بالطباعة
والحظ ايضا ان الدرجة تم وضعھا في المتغير maraولذلك سوف يعود بھذه القيمة وسوف
يكون االستدعاء كمايلي :
declare
;m studys.mark%type
begin
;)stu_mark1(111,'225CS',m
;)DBMS_OUTPUT.PUT_Line(m
;end
/
الوظائف المخزنة
كان درسا السابق عن االجراءات المخزنة واليوم لدينا درس مشابه له وھو الوظائف المخزنة
لكن الفرق ان الوظائف البد ان تعيد قيمة
حيث أن
اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب
معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت ،وھي
بنفس الطريقة التي تعاملنا بھا مع االجراءت المخزنة التغير على المتغيرات وطرق تعريفھا.اما
datatype RETURNفھي تدل على نوع القيمة المعادة من الوظيفة .
مثــــــــال :في الجدول الذي قمنا بدراسته في الدرس الرابع وكان بأسم studysوكان كمايلي
:
لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى الوظيفة ثم يتم
حساب المعدل الفصلي للطالب
moon
ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات لمقررات
: الشرح
االن بعد االنتھاء من شرح طريقة تصميم الوظيفة جاء دور طريقة االستدعاء :
لكن قبل االستدعاء لنحسب يدويا معدل الطالب الذي رقمه ١١١مثل لكي نقارنه بالنتائج بعد
االستعالم :
مجموع عدد الساعات = )عدد ساعات المقرر ) + ( CS٢١٦عدد ساعات المقرر CS )٢٢٥
=٦=٣+٣
)SELECT distinct(NO_STU),stu_avea(no_stu
from studys
;where no_stu=111
الحظ كيف تم استدعاء الدالة من خالل االستعالم والحظ استخدام الدالة distinctوھي لعدم
تكرار السجل واليك النتائج :
moon
NO_STU )STU_AVEA(NO_STU
; ------ ----------------
111 4.63
الحظ لو كان االستعالم بدون وجود الدالة distinctفسوف يتكرر رقم الطالب عدد ظھوره في
الجدول لذلك لوكان كمايلي :
)SELECT NO_STU,stu_avea(no_stu
from studys
;where no_stu=111
NO_STU )STU_AVEA(NO_STU
------ ; ----------------
111 4.63
111 4.63
الحزم البرمجية
تعلمنا سابقا كيفية انشاء االجراءت والوظائف المخزنة .لكن مارأيك لو وجد لدينا قاعدة بيانات
كبيرة جدا ولنضرب مثال انھا تحتوي على ٥٠اجراء او وظيفة وظيفة او اجراء لھا عمل خاص
ولنفرض ان ھذه القاعدة ھي لمحل تجاري ضخم يحتوي على بيانات العمالء وبيانات الموظفين
وبيانات االصناف التجارية وبيانات المخزون وغيرھا من بيانات ،ولذلك فان بعض ھذه
االجرائيات والوظائف المخزنة مختص بالعمالء مثال وجود اجراء لحساب اجمالي عميل
وغيرھا من االجرائيات ،ومثل وجود اجرئيات خاصة بالموظفين مثال اجرائية خاصة بحساب
راتب الموظف بعد حذف الحسومات واضافة العالوات وغيرھا ايضا ،لكن وضعھا في ھذا
الشكل في قاعدة البيانات قد يسسب لك بعض االرباك لذلك مارأيك بان تجمع كل الوظائف
واالجرائيات الخاصة بكل قسم في مجموعة لوحدھا وھذه المجموعة تدعي الحزمه package
مثال نجمع كل اجرائيات والوظائف الخاصة بالعمالء في حزمة خاصة
مكونات الحزم
تتكون الحزمة من جزءين االول وھو الوصف specificationويحتوي على التعاريف مثل
متغيرات او مؤشرات او اسماء االجراءت ومتحولتھا.
اما الجز الثاني فھو جسم الحزمة ويحتوي على تفاصيل االجراءت والعمليات وغيرھا
والصيغة العامة النشاء الجزء االول كمايلي :
لكن يجب ان يكون اسم الحزمة في الجزء االول ھو نفس اسم الحزمة في الجزء الثاني.
moon
: مــثال
لنقم بانشاء حزمة تحتوي على وظيفة لحساب معدل طالب واجراء لطباعة المعدل
stu_avea ولذلك سوف نستخدم نفس الوظيفة التي انشناھا في الدرس السادس والتي اسمھا
الجزء االول من الحزمة. والتي تقوم بحساب معدل الطالب واالن نبداء بانشاء الحزمة
: كمايليspecification
;close sumpoint
;avrage:=total_Point/sum_hours
;return avrage
;end
ويحتوي جسم الحزمة كمانالحظ على مكونات الوظيفة واالجراء الذي تم تعريفھما في وصف
الحزمة حيث ان الوظيفة لحساب المعدل واالجراء لطباعة المعدل.
pack_name.func_proc_name
اي اسم الحزمة اوال ثم نقطة ثم اسم االجراء او الوظيفة مـــــــثال :
وبعد التفيذ يكون الناتج ھو معدل الطالب الذي رقمه ١١١الحظ اول شي استدعينا داله حساب
المعدل ووضعناھا في المتغير aaثم استدعينا اجراء الطباعة ليتم طبعة على الشاشة.
واالن و بعد ان تعرفت على فائدة الحزم مارأيك من االن فصاعد ان تستخدم الحزم في كتابة
االجرائيات والوظائف
moon
الزنادات TRRIGERs
تتشابه الزنادات مع البرامج الفرعية اال في الطرق التالية :
* يتم تنفيذ الزنادات ضمنيا،عندما يعدل الجدول بالرغم من عمل المستخدم او التطبيقات على
الجدول .
تعد الزنادات ھامة جدا في تطوير نظم البيانات الموجھة الخاصة باالنتاج .
كماھو مع االجراءات المخزنة امكانية استخدام replaceلكي تقوم بالتعديل على الزناد اذا كان
موجود والتقوم بانشاءه من جديد.
ينفذ التوقيت الخاص بالزناد سواء نفذ الزناد قبل او بعد اغالق الزناد بواسطة الخيارين before
و ، afterلكن خيار afterاكثر كفاءة الن قطع البيانات المؤثرة يجب ان تقراء منطقيا مرة
للزناد ومرة لعبارة trigger
مالحظة /ان حدث اطالق الزناد ھو جملة sqlالتي تجعل الزناد وحدث االطالق اما updateاو
deleteاو insertاو بكليھما..
ويوجد اربعة انواع من الزنادات:
-١صف after.
-٢جملة after.
-٣صف before.
-٤جملة before.
وكل زناد من اجل جملة updateاو insertاو deleteكل زناد يعد نوع واحد من ) instead
(of , after,beforeويمكن تعريف تسع زنادات للجدول الواحد..
قيد الزناد
يحدد ھذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد.
على سبيل المثال الزناد التالي stduent_triggerال يتم حدوثة اال اذا كان رقم الطالب
student_idاقل من ١٠٠
-١يمكن للنص ان يحتوي على جمل dml sqlلكن جمل selectيجب ان تكون جمل select
into
-٢اليسمح بجمل التحكم )( commit,savepoint,rollback
-٣اليمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد.
مـــــــــــــــــثال :
االول :ھو جدول playerبيانات جميع الالعبين في النادي سواء درجة شباب او درجة ممتاز :
حيث levelتمثل الدرجة التي يلعب بھا الالعب حيث ١تمثل الدرجة االولى الممتاز -و ٢تمثل
الشباب .
moon
الثاني :ھو جدول الالعبين في درجة الممتاز وھو خاص بالرواتب واسم الجدول larg_player
الثالث :ھو جدول الالعبين في درجة الشباب وھو خاص بالرواتب واسم الجدول youth
االن نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم العب جديد وتحديد مستواه )شباب
او ممتاز( يقوم الزناد باختبار المستوى فاذا كان شباب اضاف رقم الالعب في جدول الشباب
وكذلك لوكان مستواه درجة اولى الممتاز فانه يضيف رقم الالعب في جدول larg_player
وبذلك يكون الزناد كمايلي :
moon
بعد ذلك اذھب وقما باالستعالم في جدولplayer الحظ ان المدخالت تمت على جدول
. سوف تجد انه اضاف رقم الالعب ھناكlarg_player
moon
التجميعات
انواع التجميعات في قاعدة البيانات:
التجميعة ھي مجموعة من العناصر من نفس النوع
• التجميعة varray
وھي كمصفوفة متغيرة ومشابھة للمصفوفات في اي لغة من لغات البرمجة مثل cو c++وتتم
االشارة الى اي عنصر في ھذه التجميعة باستخدام االرقام السفلية ويتم التخزين في ھذه
التجميعة بصورة خطية inline
تعتبر كجدول موجود في قاعة البيانات واالشارة الى اي عنصر في ھذه التجميعة ايضا
باستخدام االرقام السفلية ويتم تخزين البيانات في جدول تخزين منفصل.
مثال /نفرض انك تريد انشاء جدول االقسام في مستشفى والذي سوف يحتوي على رقم القسم
،اسم القسم ،واسم القسم ،ومن ثم اسماء موظفين القسم .مع العلم ان اسماء الموظفين سوف
تكون في تجميعة. varray
/
: insert االدراج -١
Insert into deptv values(10,'medical',namev('ali','sami','fahad','fady'));
: update التحديث-٢
sql واليمكن تنفيذ ذلك من خاللpl/sql لتحديث العناصر في التجميعة يتطلب استخدام
:القياسية مثال
Declare
Editname namev;
I number:=1;
Begin
Select emp into editname
From deptv where nodept=10;
Loop
If (i=editname.count+1) then
Exit;
Elsif (editname(i)='sami') then
Editname(i):='mohammed';
End if;
i:=i+1;
end loop;
update deptv set emp=editname where nodept=10;
end;
وشرحmohammed الذي قمنا بادخال وتبديلة الىsami سوف يقوم بتغير اسم الموظف
الخطوات كمايلي
وذلك لكي نقومnamev من نفس نوع التجميعةeditname اوال قمنا بتعريف متغير
وھو منI بتخزين المؤشر والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير
.يستخدم كعداد
يقوم ھنا باستخراج اسماء الموظفين للقسم ١٠وتخزين ناتج االستعالم في المتغير
editnameوالذي ھو من نفس نوع التجميعة
ثم يبدأ حلقة ومن ثم يختبر ھل Iوصلت الى نھاية التجميعة اذا كان نعم قام بانھاء االجراء
واذا لم يصل الى نھاية التجميعة يختبر عنصر التجميعة الحالي ھل ھو يساوي samiام ال
اذا كان يساوي samiيقوم بتغير ھذه القيمة الى mohammedومن ثم يزيد العداد بواحد
ومن ثم يعود من جديد الى ان يصل الى نھاية التجميعة وبعد االنتھاء من جميع العناصر يقوم
بعمل التحديث للجدول
مثال:
Declare
;Namedel namev
Begin
Select emp into namedel
;From deptv where nodept=10
;)Namedel.trim(1
;update deptv set emp=namedel where nodept=10
;end
/
ألم يتبادر الى ذھنك كيف نضيف مزيدا من الموظفين الى القسم ١٠يمكن ان تقول نستخدم االمر
insertلكن ھذا غير صحيح الننا عندما نستخدم االمر insertوندخل رقم القسم ١٠يظھر لنا
خطاء الن حقل رقم القسم مفتاح رئسي
لذلك اذا اردنا اضافة المزيد من الموظفين اوال نقوم بعمل توسع extendللتجميعة لكي تسمح
لنا باضافة عنصر جديد .ونستخدم االجراء لذلك
Declare
Newname namev;
Begin
Select emp into newname
From deptv where nodept=10;
Newname.extend;
Newname(newname.last):='khaled';
update deptv set emp=newname where nodept=10;
end;
/
: مثال ذلك
لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر ن ّكون تجميعة تحتوي على
اسم الموظف وراتبة لجميع موظفين ھذه الوظيفة
JOB_NAME EMPLOYEE
manager (ali,5000),(sami,6000),(fahad,4000)
Analysis (laui,7500),(mohammed,7500)
Programming (fady,8000),(saed,6000)
الذي انشئناه ولذلك سمي ھذا النوع بھذا االسمobject الحظ الفرق اننا استخدمنا
;)employee employeeobj
وبعد انشاء الجدول سوف نتعرف االن على كيفية التعامل مع ھذا الجدول من خالل * sql
plus
-١االضافة :
( ('manager',employeeobj
empobj('ali',5000),
empobj('sami',6000),
;)))empobj('fahad',4000
JOB_NAME
---------------------------------------------------
)EMPLOYEEobj(NAMEEMP, SALARY
-------------------------------------------------------------
manager
-٢التحديث :
يجب تطبيق قطعة pl/sqlكمايلي:
moon
Declare
Editname employeeobj;
Editobj empobj;
i number:=1;
Begin
Select employee into editname
From jobobj where job_name='manager';
Loop
Editobj:=editname(i);
If (i=editname.count) then
Exit ;
Elsif editobj.nameemp='sami' then
Editobj.salary:=10000;
Editname(i):=editobj;
End if;
i:=i+1;
End loop;
Update jobobj set employee=editname
Where job_name='manager';
End;
وجعل راتبهmanager الموجود في قسمsami وبھذا يتم تعديل راتب الموظف الذي اسمه
١٠٠٠٠
: الحذف-٣
Declare
Editemp employeeobj;
begin
select Select employee into editemp
From jobobj where job_name='manager';
Editemp.trim(1);
Update jobobj set employee=editemp
Where job_name='manager';
من النوع البسيط والتي نقوم بتعريفھا بواسطة احدvarray تعتبر ھذه التجميعة نفس التجميعة
وسوف نستخدم ھنا نفس المثال الذيvarchar2 وnumber انواع البيانات الموجودة مثل
. من النوع الشيئvarray استخدمناه في التجميعة
moon
مثال /نفرض انك تريد انشاء جدول االقسام في مستشفى والذي سوف يحتوي على رقم القسم ،
اسم القسم ،واسم القسم ،ومن ثم اسماء موظفين القسم .مع العلم ان اسماء الموظفين سوف تكون
في تجميعةnested table
/
فيجب دائم وضعه اذا استخدمنا nested tableمع تغير المكتوب باللون االحمر والذي يمثل
اسم الحقل الذي ھو من النوع .nested table
-١االضافة :
-٢التحديث : update
moon
لتحديث العناصر في التجميعة يتطلب استخدام pl/sqlواليمكن تنفيذ ذلك من خالل sql
القياسية مثال:
Declare
;Editname namenested
I ;number:=1
Begin
Select emp into editname
;From deptnested where nodept=1
Loop
If (i=editname.count+1) then
;Exit
Elsif (editname(i)='sami') then
;'Editname(i):='mohammed
;End if
;i:=i+1
;end loop
update deptnested set emp=editname where
;nodept=1
;end
/
سوف يقوم بتغير اسم الموظف samiالذي قمنا بادخال وتبديلة الى mohammedوشرح
الخطوات كمايلي
اوال قمنا بتعريف متغير editnameمن نفس نوع التجميعة namenestedوذلك لكي نقوم
بتخزين المؤشر والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير Iوھو يستخدم
كعداد.
يقوم ھنا باستخراج اسماء الموظفين للقسم ١وتخزين ناتج االستعالم في المتغير editname
والذي ھو من نفس نوع التجميعة
ثم يبدأ حلقة ومن ثم يختبر ھل Iوصلت الى نھاية التجميعة اذا كان نعم قام بانھاء االجراء
واذا لم يصل الى نھاية التجميعة يختبر عنصر التجميعة الحالي ھل ھو يساوي samiام ال
اذا كان يساوي samiيقوم بتغير ھذه القيمة الى mohammedومن ثم يزيد العداد بواحد
ومن ثم يعود من جديد الى ان يصل الى نھاية التجميعة وبعد االنتھاء من جميع العناصر يقوم
بعمل التحديث للجدول
اذا اردنا اضافة المزيد من الموظفين اوال نقوم بعمل توسع extendللتجميعة لكي تسمح لنا
باضافة عنصر جديد .ونستخدم االجراء لذلك
Declare
;Newname namenested
Begin
Select emp into newname
;From deptnested where nodept=1
;Newname.extend
;'Newname(newname.last):='khaled
;update deptnested set emp=newname where nodept=1
;end
/
-٤الحذف :
ھناك طريقتان االولى باستخدام trimوھذه الطريقة تحذف اخر صف في التجميعة واليمكن
اختيار اي عنصر في التجميعة:
Declare
;Namedel namenested
moon
Begin
Select emp into namedel
;From deptnested where nodept=1
;)Namedel.trim(1
;update deptnested set emp=namedel where nodept=1
;end
/
اما الطريقة الثانية فھي باستخدام االمر ) delete(mوھذه الطريقة ال تحذف من االخير بل يتم
اختيار اي العناصر الذي تريد حذف فلو وضعنا m=2وكانت المدخالت الجدول كما فعال سابقا
سيتم حذف العنصر الثاني والذي ھو الموظف sami
Declare
;Namedel namenested
Begin
Select emp into namedel
;From deptnested where nodept=1
;)Namedel.delete(2
;update deptnested set emp=namedel where nodept=1
;end
/
سوف نستخدم لشرح ھذا المثال نفس المثال الذي استخدمناه في varrayمن النوع object
moon
لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر ن ّكون تجميعة تحتوي على
اسماء الموظف وراتبة لجميع موظفين ھذه الوظيفة
اول خطوة ھي انشاء الشيء empobjوالذي تم انشاءه سابق عندما قمنا بشرح vaaray
من النوع الشيء واذا كنت لم تقم بانشاءه فھذا الكود :
/
: االضافة-١
: التحديث -١
٩٠٠٠ الىmanager الموظف االداري اي في مسمى وظيفتھاali مثال لتغير راتب الموظف
Declare
Editsal empnestedobj;
Editempobj empobj;
i number:=1;
Begin
Select employee into editsal
From jobnested where job_name='manager';
Loop
Editempobj:=editsal(i);
If (i=editsal.count) then
Exit;
Elsif (editempobj.nameemp='fahad') then
Editempobj.salary:=9900;
Editsal(i):=editempobj;
End if;
i:=i+1;
end loop;
update jobnested set employee=editsal where
job_name='manager';
end;
/
moon
Declare
Editemp empnestedobj;
Begin
Select employee into editemp
From jobnested where job_name='manager';
Editemp.extend;
Editemp(editemp.last):=empobj('mohammed',7000);
update jobnested set employee=editemp where
job_name='manager';
end;
/
: delete(trim) الحذف-٤
وھذه الطريقة تحذف اخر صف في التجميعة واليمكنtrim ھناك طريقتان االولى باستخدام
:اختيار اي عنصر في التجميعة
declare
empdel empnestedobj;
begin
Select employee into empdel
From jobnested where job_name='manager';
Empdel.trim(1);
update jobnested set employee=empdel where
job_name='manager';
end;
/
وھذه الطريقة ال تحذف من االخير بل يتمdelete(m) اما الطريقة الثانية فھي باستخدام االمر
وكانت المدخالت الجدول كما فعال سابقاm=2 اختيار اي العناصر الذي تريد حذف فلو وضعنا
وفيمايلي الكودsami سيتم حذف العنصر الثاني وھو الموظف
الطريقة الثانية
declare
empdel empnestedobj;
begin
Select employee into empdel
moon
او فيج وال بيس ك وغيرھ ا++تستخدم ھذه العبارة مثل اي العبارت الشرطية في لغة سي او س ي
ولھا استخدمات عديدة وسوف نعرف كيف نستخدمھا مقدما مع حقول قواعد البيان ات وذل ك بع د،
اخذ المؤشرات
IF condition THEN
statement; ... statement;
[ELSIF condition THEN
statement; ... statement;]
...
[ELSIF condition THEN
statement; ... statement;]
[ELSE
statement; ... statement;]
END IF;
حيث أن
مالحظة
اختياريةELSIF وELSE •
واحدةELSE ولكن تحتوي على عبارةELSIF نحنوي على عدة عباراتIF • جملة
ELSEIF وليستELSIF • انتبه الى أن طريقة كتابة
Declare
i number(5);
moon
BEGIN
i:=5;
IF i=5 then
DBMS_OUTPUT.PUT_LINE('i = ' || i);
ELSE
DBMS_OUTPUT.PUT_LINE('i not eqal 5 ');
END IF;
END;
Declare
i number(5);
BEGIN
i:=5;
IF i>1 then
DBMS_OUTPUT.PUT_LINE(i || ' > 1');
ELSIF i<1 then
DBMS_OUTPUT.PUT_LINE(i || ' < 1');
ELSIF i=1 then
DBMS_OUTPUT.PUT_LINE(i || ' = 1');
END IF;
END;
moon
الـــتكرار
loop-exit-end -١
الشرح
i =1
i =2
i= 3
i =4
i =5
i =6
i =7
i =8
i =9
i =10
Declare
i number(5);
BEGIN
i:=1;
LOOP
EXIT WHEN i>10;
DBMS_OUTPUT.PUT_LINE('i =' || i);
i:=i+1;
End loop;
END;
/
Declare
i number(5);
BEGIN
i:=1;
WHILE i <= 10 LOOP
DBMS_OUTPUT.PUT_LINE('i =' || i);
moon
;i:=i+1
;End loop
;END
/
وھذه ايضا طريقة اخرى الستخدام حلقات التكرار وھي نفس عمل اسلوب حلقات forفي اي لغة
برمجة
والصيغة العامه لھا ھي على االتي
مثـــال:
Declare
i ;)number(5
BEGIN
FOR i IN 1..10 LOOP
;)DBMS_OUTPUT.PUT_LINE('i =' || i
;End loop
;END
/
وسوف يكون الناتج كمايلي)نفس السابق(:
١= i
i =2
i =3
i =4
i =5
i =6
i =7
i =8
i =9
١٠= i
moon
GOTO جملة
تنقل تسلسل عمل البرامج من نقطه الى اخرىGOTO كما في باقي لغات البرمجة فان
الصيغة العامة
GOTO <<my_label>>
حيث أن
مثال
declare
i positive := 1;
max_loops constant positive := 100;
begin
i := 1;
loop
i := i + 1;
if i > max_loops then
goto more_processing;
end if;
end loop;
<<more_processing>>
i := 1;
end;
/
التعليقات
( ثم التعليق--) كتابة -٤
مثال
مثال
*** DON’T FORGET MY NAME ***
مثال
/* DON’T FORGET MY NAME */
ولكن مع وجودPL/SQL داخل الكتل البرمجية الخاصة بـSQL يمكنك استعمال جمل
(;) تنتھي بفاصلة منقوطةSQL اختالفات حيث كل جملة
مثال
DECLARE
max_records CONSTANT int := 100;
i int := 1;
BEGIN
FOR i IN 1..max_records LOOP
if (mod(i,10) = 0) then
INSERT INTO test_table
(record_number, current_date)
VALUES
(i, SYSDATE);
else
NULL;
end if;
END LOOP;
COMMIT;
END;
/
المؤشرات
اھداف الفصل
ﺍﻟﻤﺅﺸﺭﺍﺕ CURSORS
يتم تعريف ھذا النوع من المؤشرات كجزء من االعالن declareويجب ان تشتمل عبارة sql
المعرفه على عبارة التحديد selectفقط حيث اليمكن استخدام الكلمات االساسية
insert,update,delete
وعند استخدام المؤشرات الصريحه دائما ماستكتب اربعة مكونات كمايلي:
-١يتم تعريف المؤشر في الجزء declare
-٢يتم فتح المؤشر بعد عبارة begin
DECLARE
IS اﺳﻢ اﻟﻤﺆﺷﺮ CURSOR
اﻻﺳﺘﻌﻼم
ولكي تقوم بفتح ھذا المؤشر وتستخدمه نقوم بفتحه باستخدام االمر openكمايلي:
وبعد فتح المؤشر تقوم باسترجاع او تحميل البيانات سطر)سجل( واحد من المؤشر الذي تم
تعريفه باستخدام االمر FETCHكمايلي:
ومعنى ھذا اي قم باسترجاع البيانات من المؤشر المعطى اسمه وحملھا intoالى المتغيرات كع
مالحظة ان عدد المتغيرات يساوي عدد الحقول الموجودة في استعالم المؤشر.
وبعد االنتھاء من اجراء العمليات على المؤشر يجب عليك اغالقه ويتم اغالقه كمايلي:
moon
close cursor_name
age name no
23 mohammed 111
22 talal 222
24 majed 333
mohammed
الحظنا في المثال السابق ان االستعالم في cursorسوف يعود بسجل واحد لكن ماذا يحدث لو
اعاد المؤشر اكثر من سجل واردنا المرور على كافة السجالت ؟
لحل السؤال السابق البد من استخدام حلقة بھا شرط وھذا ھو ھل سجالت المؤشر انتھت ام ال
ونعرف ذلك من خالل خاصية foundللمؤشر كمايلي:
found%mycur
حيث :
مثال :
نريد انشاء اجراء يقوم بالمرور على الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر
ام ال فاذا كان markاكبر او يساوي ٥٠ضع قيمة trueفي حقل resultواال ضع قيمة false
في حقل result
declare
mar number(3);
no number(3);
cursor res_stu is
select no_stu,mark
from stu_study;
begin
open res_stu;
loop
fetch res_stu into no,mar;
exit when res_stu%notfound;
if mar>=50 then
update stu_study set result='TRUE' where
no_stu=no;
else
update stu_study set result='FALSE' where
no_stu=no;
end if;
end loop;
close res_stu;
end;
/
ھناك طريقة اخرى لتعريف المتغيرات الحظ في الجدول السابق ان الحقل no_Stuتم تعريفه
على انه من نوع numberوتم تعريف المتغير noفي االجراء على انه numberايضا لكي
يتم وضع رقم الطالب فيه لكن الحظ لو تم تغير نوع الحقل في الجدول من numberالى
varchar2فانه يجب عليك تغير نوع المتغير noفي االجراء ايضا لكن ھناك طريقه تجعلك
التعدل االجراء كل مرة وھي استخدام االمر التالي لتعريف المتغير noفي االجراء
type%no_stu.stu_study NO
حيث :
: stu_studyاسم الجدول
ومعنى ماسبق قم بتعريف متغير اسمه noله نفس نوعية الحقل الذي اسمه NO_STUالموجود
في الجدول stu_study .
وبھذا الن تقوم بتغير نوع العنصر في االجراء في كل مرة تغير النوع وھكذا مع جميع
المتغيرات التي لھا صله بالجداول
declare
;mar stu_study.mark%type
;no stu_study.no_stu%type
cursor res_stu is
select no_stu,mark
;from stu_study
begin
;open res_stu
loop
;fetch res_stu into no,mar
;exit when res_stu%notfound
if mar>=50 then
update stu_study set result='TRUE' where
;no_stu=no
else
update stu_study set result='FALSE' where
;no_stu=no
;end if
moon
end loop;
close res_stu;
end;
/
moon
المؤشرات الضمنية
تعرفنا سابقا على فائد المؤشرات cursorsودرسنا النوع االول منھا وفي ھذا الفصل عندنا
نوع اخر وھو المؤشرات الضمنية وھي اسھل من المؤشرات الصريحه
FROM table_name
ومعنى ھذا قم باختيار الحقل ١و الحقل ٢وضعھا في المتغيرات منغير ١و متغير ٢من الجدول
table_name
سوف نأخذ مثال على ذلك وسوف نستخدم الجدول الذي انشئناه سابق في الدرس الثاني عندما
تعاملنا مع المؤشرات الصريحة وكان اسم الجدول stud
واردنا مثال كتابة اجراء يقوم بحساب متوسط اعمار الطالب ) قد يقول البعض انه اليحتاج ذلك
الى اجراء فمجرد استخدام جملة selectنستطيع عمل ذلك انا اقول نعم ھذا صحيح لكن احب
استخدام االجراء في ھذا المثال لكي نرى طريقة عمل المؤشر الضمني ولكن سوف نرى بعد
قليل مثال شامل يتم فيه استخدام الموشرات الصريحه والضمنية في نفس الوقت( واالن نقوم
بكتابة االجراء كمايلي :
moon
:( )المقرراتcourses الجدول االول اسمه: لنفرض انه لدينا الجدولين التاليين
عدد
اسم الطالب كود المقرر الدرجة
النقاط
NO_STU COURSE_CODE MARK POINT
111 216CS 88
222 225CS 75
333 225CS 40
111 225CS 90
222 216CS 78
333 216CS 85
بعد االنتھاء من انشاء وادخال البيانات المطلوب انشاء اجراء يقوم بحساب عدد النقاط لكل طالب
وفي كل مادة وھو الحقل عدد النقاط الذي لم ندخل فيه اي شيء ويجب نعلم ان :
MARK average
95-100 5
90-94 4.75
85-89 4.5
80-84 4
75-79 3.5
70-74 3
65-69 2.5
60-64 2
1-59 1
عدد النقاط في اي مقرر = معدل المادة )وليس الدرجة كمافي الجدول السابق( * عدد ساعات
المقرر
نالحظ من جدول studysان الطالب قد تحصل على درجة ٨٨ونالحظ ان الدرجة من الجدول
السابق ھي بين ٨٩ -٨٥وبالتالي فإن معدل الطالب في ھذا المقرر ھو ) ٤.٥وھي الطريقة
المتبعة في اغلب الجامعات( ،ومن جدول coursesنحصل على عدد الساعات للمقرر وبالتالي
فان :
عدد النقاط = ١٣.٥ = ٣ * ٤.٥وھكذا في جميع الطالب وھذا ھو المطلوب من االجراء عمله.
DECLARE
;no_Student studys.NO_STU%type
;hou courses.hours%type
;mark studys.mark%type
;cou_code courses.code%type
;poi studys.point%type
cursor st_point is
moon
الحظ ھنا اننا استخدمنا المؤشرات الصريحة والمؤشرات الضمنيه والصريحة استخدمناه لكي
والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كلstudys تقوم بفتح سجالت الجدول
.مرة يدور بالحلقة
moon
في التعريفات اتوقع انه التوجد ھناك مشكلة لديكم ،اما جسم البرنامج ابتدأً من beginفھو
كمايلي :
اوال يفتح المؤشر الصريح والذي يحتوي على جميع سجالت الجدول studysثم يكون حلقة
دورانية لكي يمر على جميع سجالت الطالب الموجودة في المؤشر الصريح وطبعا شرط االنھاء
لھذه الحلقة ھو الوصول الى اخر سجل .ثم يقوم بعملية تحديث سجالت الطالب االولى في
المتغيرات كمايلي:
وطبعا المتغيرات ھي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض االن نحن االن عند
السجل االول ووھو الطالب الذي رقمه ١١١ورقم المقرر CS٢١٦ودرجته ھي ٨٨سوف
يضع ھذه البيانات في المتغيرات ،ثم يستخدم مؤشر ضمني لكي يحضر عدد ساعات المادة التي
درسھا الطالب ١١١وھي CS٢١٦و المؤشر ھو
select hours
into hou
from courses
; where code=cou_code
ومعنى ھذا احضر عدد ساعات المقرر الذي رقمه ھو cou_codeوھذا المتغير ھو معروف
من المؤشر الصريح االول وسبب استخدامنا ھذا المؤشر ھو ان عدد ساعات المقرر موجودة في
جدول اخر والبد من استخدام ھذا المؤشر لكي يحضر عدد الساعات .وبما اننا فرضنا اننا عند
السجل االول فسوف يحضر عدد ساعات المقرر CS٢١٦وھي ٣ساعات ثم بدأ يختبر الدرجة
وذلك طبقا للجدول الدرجات والمعدالت حيث كانت درجة الطالب الذي رقمه ١١١في المقرر
cCS٢١٦ھي ٨٨وبالتالي يكون عدد النقاط كمايلي = ، ١٣.٥ = ٣ * ٤.٧٥وبعد االنتھاء
من حساب المعدل يقوم بنعديل الجدول وتحديث قيمة pointبقيمتھا الجديدة ،وھكذا يمر على
كل طالب بنفس الطريقة السابقة الى ان يصل الى نھاية السجالت.وبالتالي تكون النتائج كمايلي
في الجدول : studys
بعد االنتھاء من ھذا المثال نكون انھينا المؤشرات بنوعيھا بشكل تام وبامثله واقعيه
moon
الجـداول في ) pl/sqlالمصفوفات(
تستخدم ھذه الجداول )المصفوفات( مثل المصفوفات في ھي لغة من لغات البرمجة مثل لو كانت
لديك سلسلة من االرقام وتريد تخزينھا فانك تستخدم ھذه الجداول للتخزين ويتم تعريف متغير من
ھذا النوع كمايلي اوال يتم تعريف ھذا النوع :
DECLARE
TYPE num_array IS TABLE OF number(4) INDEX BY
;BINARY_INTEGER
;num num_array
BEGIN
........
........
;END
الحظ اوال تم تعريف نوع واسماه ، num_arrayثم قام بتعريف متغير numواعطاه نوع
num_arrayوھو النوع الجديد الذي قمنا بانشاءه.
وويكون عمل ھذا االجراء كمايلي :الحلقة االولى تقوم بضرب العدد iفي نفسه وتخزنه في
المتغير numبرتبه iوھكذا والحلقة الثانية للطباعة ويكون الناتج كمايلي :
1*1= 1
2*2= 4
3*3= 9
4*4= 16
5*5= 25
6*6= 36
7*7= 49
8*8= 64
9*9= 81
10*10= 100
moon
االجرائيات المخزنة
شاھدنا في الدروس الماضية ان اي اجراء نقوم بكتابة اني اذا اردت استخدامة اكثر من مرة فاني
اقوم بكتابة كل مرة في sql * plusلكي احصل على النتائج لكن ماھو رأيك لو نقوم بتخزين ھذا
االجراء في قاعدة البيانات ونعطية اسم وحينما نحتاجه نستدعية باسمه وھذا يوفر علينا الشيء
الكثير لذلك فصلنا ھو االجرائيات المخزنة.
حيث أن
اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب
معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت
ولتعريف متغير بھذا الشكل يكون كمايلي :
الحظ اسم المتغير ھو student_idثم بعده وضعنا الكلمة inومعنى ان ھذا المتغير يعتبر
كمدخل
اما لتعريف متغير يعود بقيمة من االجراء مثال لو اردنا تعرف متغبر يرجع بمعدل الطالب يتم
التعريف كمايلي :
بعد تنفيذ االجراء يكون ھذا المتغير يحتوي على معدل الطالب الذي تم تمرير رقمه مثال.
moon
مع العلم انه يمكن تعريف متغير للمدخالت والمخرجات حيث تمرر به القيمه اوال وبعد تنفيذ
االجراء يتم وضع القيمه في نفس المتغير وتتم كمايلي :
مــــثال :
في الجدول الذي قمنا بدراسته في الفصول السابقة وكان بأسم studys
لو اردنا تصميم اجراء مخزن لكي يقوم بطباعة درجة الطالب بعد تمرير رقم الطالب ورقم
المقرر.
بعد االنتھاء من تنفيذ االجراء يكون االجراء مخزن في قاعدة البيانات ولكي نقوم باستدعاءه نقوم
بمايلي
begin
;)'stu_mark(111,'216CS
;end
/
الحظ كيف تم استدعاء االجراء السابق من خالل اسم االجراء وبذلك سوف يكون الناتج على
الشاشة كمايلي 88وھي صحيحة بعد تمرير رقم الطالب 111ومقرر 216CS
لكن الحظ اننا لم نستخدم متغيرات اخراج لكن مأرايك ان نصمم اجراء اخر يقوم بنفس الوظيفة
التي يقوم بھا االجراء السابق لكن عملية الطباعة تكون بعد االستدعاء لكي نجعل االجراء يقوم
بارجاع درجة الطالب بمتغير لذلك فان االجراء كمايلي :
بعد ذلك نقوم باستدعاء االجراء ومن ثم طباعة الدرجة الن لو الحظت االجراء اليقوم بالطباعة
والحظ ايضا ان الدرجة تم وضعھا في المتغير maraولذلك سوف يعود بھذه القيمة وسوف
يكون االستدعاء كمايلي :
declare
;m studys.mark%type
begin
;)stu_mark1(111,'225CS',m
;)DBMS_OUTPUT.PUT_Line(m
;end
/
الوظائف المخزنة
كان درسا السابق عن االجراءات المخزنة واليوم لدينا درس مشابه له وھو الوظائف المخزنة
لكن الفرق ان الوظائف البد ان تعيد قيمة
حيث أن
اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب
معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت ،وھي
بنفس الطريقة التي تعاملنا بھا مع االجراءت المخزنة التغير على المتغيرات وطرق تعريفھا.اما
datatype RETURNفھي تدل على نوع القيمة المعادة من الوظيفة .
مثــــــــال :في الجدول الذي قمنا بدراسته في الدرس الرابع وكان بأسم studysوكان كمايلي
:
لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى الوظيفة ثم يتم
حساب المعدل الفصلي للطالب
moon
ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات لمقررات
: الشرح
االن بعد االنتھاء من شرح طريقة تصميم الوظيفة جاء دور طريقة االستدعاء :
لكن قبل االستدعاء لنحسب يدويا معدل الطالب الذي رقمه ١١١مثل لكي نقارنه بالنتائج بعد
االستعالم :
مجموع عدد الساعات = )عدد ساعات المقرر ) + ( CS٢١٦عدد ساعات المقرر CS )٢٢٥
=٦=٣+٣
)SELECT distinct(NO_STU),stu_avea(no_stu
from studys
;where no_stu=111
الحظ كيف تم استدعاء الدالة من خالل االستعالم والحظ استخدام الدالة distinctوھي لعدم
تكرار السجل واليك النتائج :
moon
NO_STU )STU_AVEA(NO_STU
; ------ ----------------
111 4.63
الحظ لو كان االستعالم بدون وجود الدالة distinctفسوف يتكرر رقم الطالب عدد ظھوره في
الجدول لذلك لوكان كمايلي :
)SELECT NO_STU,stu_avea(no_stu
from studys
;where no_stu=111
NO_STU )STU_AVEA(NO_STU
------ ; ----------------
111 4.63
111 4.63
الحزم البرمجية
تعلمنا سابقا كيفية انشاء االجراءت والوظائف المخزنة .لكن مارأيك لو وجد لدينا قاعدة بيانات
كبيرة جدا ولنضرب مثال انھا تحتوي على ٥٠اجراء او وظيفة وظيفة او اجراء لھا عمل خاص
ولنفرض ان ھذه القاعدة ھي لمحل تجاري ضخم يحتوي على بيانات العمالء وبيانات الموظفين
وبيانات االصناف التجارية وبيانات المخزون وغيرھا من بيانات ،ولذلك فان بعض ھذه
االجرائيات والوظائف المخزنة مختص بالعمالء مثال وجود اجراء لحساب اجمالي عميل
وغيرھا من االجرائيات ،ومثل وجود اجرئيات خاصة بالموظفين مثال اجرائية خاصة بحساب
راتب الموظف بعد حذف الحسومات واضافة العالوات وغيرھا ايضا ،لكن وضعھا في ھذا
الشكل في قاعدة البيانات قد يسسب لك بعض االرباك لذلك مارأيك بان تجمع كل الوظائف
واالجرائيات الخاصة بكل قسم في مجموعة لوحدھا وھذه المجموعة تدعي الحزمه package
مثال نجمع كل اجرائيات والوظائف الخاصة بالعمالء في حزمة خاصة
مكونات الحزم
تتكون الحزمة من جزءين االول وھو الوصف specificationويحتوي على التعاريف مثل
متغيرات او مؤشرات او اسماء االجراءت ومتحولتھا.
اما الجز الثاني فھو جسم الحزمة ويحتوي على تفاصيل االجراءت والعمليات وغيرھا
والصيغة العامة النشاء الجزء االول كمايلي :
لكن يجب ان يكون اسم الحزمة في الجزء االول ھو نفس اسم الحزمة في الجزء الثاني.
moon
: مــثال
لنقم بانشاء حزمة تحتوي على وظيفة لحساب معدل طالب واجراء لطباعة المعدل
stu_avea ولذلك سوف نستخدم نفس الوظيفة التي انشناھا في الدرس السادس والتي اسمھا
الجزء االول من الحزمة. والتي تقوم بحساب معدل الطالب واالن نبداء بانشاء الحزمة
: كمايليspecification
;close sumpoint
;avrage:=total_Point/sum_hours
;return avrage
;end
ويحتوي جسم الحزمة كمانالحظ على مكونات الوظيفة واالجراء الذي تم تعريفھما في وصف
الحزمة حيث ان الوظيفة لحساب المعدل واالجراء لطباعة المعدل.
pack_name.func_proc_name
اي اسم الحزمة اوال ثم نقطة ثم اسم االجراء او الوظيفة مـــــــثال :
وبعد التفيذ يكون الناتج ھو معدل الطالب الذي رقمه ١١١الحظ اول شي استدعينا داله حساب
المعدل ووضعناھا في المتغير aaثم استدعينا اجراء الطباعة ليتم طبعة على الشاشة.
واالن و بعد ان تعرفت على فائدة الحزم مارأيك من االن فصاعد ان تستخدم الحزم في كتابة
االجرائيات والوظائف
moon
الزنادات TRRIGERs
تتشابه الزنادات مع البرامج الفرعية اال في الطرق التالية :
* يتم تنفيذ الزنادات ضمنيا،عندما يعدل الجدول بالرغم من عمل المستخدم او التطبيقات على
الجدول .
تعد الزنادات ھامة جدا في تطوير نظم البيانات الموجھة الخاصة باالنتاج .
كماھو مع االجراءات المخزنة امكانية استخدام replaceلكي تقوم بالتعديل على الزناد اذا كان
موجود والتقوم بانشاءه من جديد.
ينفذ التوقيت الخاص بالزناد سواء نفذ الزناد قبل او بعد اغالق الزناد بواسطة الخيارين before
و ، afterلكن خيار afterاكثر كفاءة الن قطع البيانات المؤثرة يجب ان تقراء منطقيا مرة
للزناد ومرة لعبارة trigger
مالحظة /ان حدث اطالق الزناد ھو جملة sqlالتي تجعل الزناد وحدث االطالق اما updateاو
deleteاو insertاو بكليھما..
ويوجد اربعة انواع من الزنادات:
-١صف after.
-٢جملة after.
-٣صف before.
-٤جملة before.
وكل زناد من اجل جملة updateاو insertاو deleteكل زناد يعد نوع واحد من ) instead
(of , after,beforeويمكن تعريف تسع زنادات للجدول الواحد..
قيد الزناد
يحدد ھذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد.
على سبيل المثال الزناد التالي stduent_triggerال يتم حدوثة اال اذا كان رقم الطالب
student_idاقل من ١٠٠
-١يمكن للنص ان يحتوي على جمل dml sqlلكن جمل selectيجب ان تكون جمل select
into
-٢اليسمح بجمل التحكم )( commit,savepoint,rollback
-٣اليمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد.
مـــــــــــــــــثال :
االول :ھو جدول playerبيانات جميع الالعبين في النادي سواء درجة شباب او درجة ممتاز :
حيث levelتمثل الدرجة التي يلعب بھا الالعب حيث ١تمثل الدرجة االولى الممتاز -و ٢تمثل
الشباب .
moon
الثاني :ھو جدول الالعبين في درجة الممتاز وھو خاص بالرواتب واسم الجدول larg_player
الثالث :ھو جدول الالعبين في درجة الشباب وھو خاص بالرواتب واسم الجدول youth
االن نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم العب جديد وتحديد مستواه )شباب
او ممتاز( يقوم الزناد باختبار المستوى فاذا كان شباب اضاف رقم الالعب في جدول الشباب
وكذلك لوكان مستواه درجة اولى الممتاز فانه يضيف رقم الالعب في جدول larg_player
وبذلك يكون الزناد كمايلي :
moon
الحظ ان المدخالت تمت على جدولplayer بعد ذلك اذھب وقما باالستعالم في جدولlarg_player سوف
.تجد انه اضاف رقم الالعب ھناك
المراجع