You are on page 1of 197

‫‪moon‬‬

‫األوراكل‬

‫نتعرض في ھذا الفصل الى مقدمة في ادارة قواعد البيانات ‪ Database‬وخاصة قواعد بيانات‬
‫األوراكل والذي يعتبر أحد النظم القوية في قواعد البيانات ‪Data Base Management‬‬
‫)‪ System (DBMS‬لما له من مميزات مقارنة بقواعد البيانات االخرى ‪.‬‬

‫مفاھيم قواعد البيانات‬

‫قاعدة البيانات ‪Database‬‬


‫ھي مجموعه من الملفات المنظمة بحيث يسھل الوصول إليھا عندمت نريد استردادھا‬

‫قاموس البيانات ‪Data Dictionary‬‬


‫ھو مجموعة من المعلومات عن جداول وفھارس البيانات تحقظ داخل ھذا القاموس ‪ ،‬يستخدمھا‬
‫نظام إدارة قواعد البيانات‬

‫االستعالم ‪Query‬‬
‫ھو نظام استفساري لالستعالم عن بيانات معينة وغاليا ال يغير االستعالم في قاعدة البيانات حيث‬
‫إن غالبية نظم االستعالم عبارة عن قراءة فقط للبيانات‬

‫الدوال ‪Function‬‬
‫عبارة عن مجموعة من تعليما ت أو أوامر تستخدم ضمن مسمى وظيفي الداء عملية محددة‬
‫وغالبا تعيد الدالة قيمة معينه بعد تنفيذھا‬

‫االجراء ‪Procedure‬‬
‫مجموعة من التعليمات مثل تعليمات الدالة بھدف تنفيذ مھمة محددة لكن االجراء ال يعيد قيمة‬
‫مثل الدالة‬

‫مخطط ‪Schema‬‬
‫عبارة عن مجموعة من الكائنات ‪ Objects‬مرتبطة بقواعد البيانات ويتألف مخطط‬
‫‪ Schema‬من كائنات مثل الجداول ‪ Tables‬واالجراءات ‪ Procedure‬والعروض ‪Views‬‬
‫والفھارس ‪Index‬‬

‫مدير قواعد البيانات )‪Database Administrator (DBA‬‬


‫ھو الشخص المسؤؤل عن عمليات إدارة قواعد البيانات ونظم أداء ھذه القواعد وكيف يتم‬
‫تكوينھا وھو مسوؤل أيضا عن مراقبة أداء ھذه القواعد ‪ ،‬وكذلك إجراء عمليات النسخ االحتياطي‬
‫وتثبيت البرامج ‪ ،‬والمحافظة على أمن المعلومات ‪ ،‬وإضافة مستخدمين جدد أو إلغاء صالحيات‬
‫مستخدمين‬

‫ويمكن ان يقوم مدير قواعد البيانات بالتخطيط لتطوير وتنمية النظام المطبق ‪ ،‬وتحديد‬
‫الحاجه لھذه التطورات المستقبلية ‪.‬‬
‫‪moon‬‬

‫ويسعى فريق العمل الذي يتكون من مديري قواعد البيانات ‪ DBA‬للحفاظ على سير العمل داخل‬
‫الشركة بشكل متجانس ‪ .‬وتتم تجزئة المھام بين ھؤالء المديرين ‪.‬‬

‫مھام مدير قواعد البيانات )‪(DBA‬‬


‫تتباين مھام مدير قاعدة البيانات تبعا لحجم الشركة أو المؤسسة وتبعا لفريق‬
‫العمل المساعد وتشمل ھذه المھام النقاط التالية ‪:‬‬
‫‪ -١‬تثبيت البرمجيات الجديدة‬
‫‪ -٢‬إدارة الحماية لنظام قواعد البيانات‬
‫‪ -٣‬النسخ االحتياطي والدوري للبيانات ونظام قواعد البيانات‬
‫‪ -٤‬استكشاف األخطاء ومعالجتھا‬
‫‪ -٥‬تسوية وإصالح إخفاقات المستخدمين للوصول إلى بياناتھم‬
‫‪ -٦‬متابعة ضبط أداء العمل‬
‫‪ -٧‬تقسيم األجھزة والنظم الجديدة‬
‫‪ -٨‬العمل على تطوير النظام بالشركة‬

‫نظام إدارة قاعد البيانات )‪Data Base Management System (DBMS‬‬

‫ھو عبارة عن مجموعة األدوات البرمجيه ) البرامج ( التي تدير وتنظم قاعدة البيانات وتوجد‬
‫عالقة ارتباط بين ھذه البيانات تسمى عالقة )‪ (Relation‬لذا احيانا يطلق عليھا ‪ RDBMS‬أي‬
‫نظام إدارة قواعد البيانات العالئقية ) االرتباطية (‬

‫مميزات نظام إدارة قاعدة البيانات أوراكل‬

‫يتميز نظام قاعدة البيانات أوراكل عن غيره من نظم إدارة قواعد البيانات األخرى باآلتي‪:‬‬
‫‪ -١‬القدرة الفائقة على استيعاب كميات كبيرة من البيانات قد يصل عدد السجالت إلى‬
‫الماليين مع الحفاظ على المستوى العالي في األداء والسرعة عند استرجاع والتخزين‬
‫والحذف‬
‫‪ -٢‬السرية التامة واألمن ال حتوائه على نظام الصالحيات والحقوق الذي يضمن تطبيق‬
‫الشروط القياسية واألمنية للحفاظ على قاعدة البيانات‬
‫‪ -٣‬فعالية التحكم المركزي بالبيانات الذي يضمن ‪:‬‬
‫• تقليل التكررات غير الالزمة في البيانات المدخلة )‪(No Repetition‬‬
‫• تجنب التناقض بين البيانات )‪(No Contradiction‬‬
‫• إمكانية التشارك في البيانات )‪(Data Sharing‬‬
‫• الحفاظ على تكامل البيانات فيما بينھا )‪(Data Integrity‬‬
‫‪ -٤‬السيطرة التامة على عملية النسخ االحتياطي لقاعدة البيانات وحمايتھا من الفقدان أو‬
‫التلف مع امكانية استرجاعھا في أي لحظة‬
‫‪moon‬‬

‫عمليات نظام إدارة قاعدة البيانات‬


‫يشتمل نظام إدارة قاعدة البيانات اوراكل على العمليات التالية‬

‫‪ -١‬أوامر لغة تعريف البيانات )‪Data Definition Language (DDL‬‬

‫تستخدم ھذه اللغة في تعريف وإنشاء الكائن ‪ ، Object‬ويمكن أن يكون الكائن ملفات‬
‫وجداول بيانات ‪ ،‬فيمكننا إنشاء وتعديل وحذف الكائن ويمكننا إنشاء امتياز لمستخدم‬
‫معين ‪ ،‬أو انشاء كائن خيارات لفحص وإضافة تعليقات إلى قاموس البيانات ومن ھذه‬
‫األوامر ‪CREAT , DROP and ALTER :‬‬

‫‪ -٢‬أوامر لغة معاملة البيانات )‪Data Manipulation Language (DML‬‬

‫تتيح ھذه األوامر التعامل مع البيانات وتعديلھا ضمن الكائن الموجود ‪ Object‬ومن ھذه‬
‫األوامر ‪SELECT, DELETE,UPDATE and INSERT :‬‬

‫‪ -٣‬أوامر لغة التحكم في البيانات )‪Data Control Language (DCL‬‬

‫تتيح ھذه األوامر التحكم في قاعدة البيانات وأدائھا كالصالحيات والمستخدمين والحقوق‬
‫وغالبا ماتكون ھذه األوامر مخصصة لالستخدام من قبل مدير قاعدة البيانات )‪(DBA‬‬
‫ومن ھذه االوامر ‪GRANT and REVOKE :‬‬
‫‪moon‬‬

‫التركيب الداخلي لنظام أوراكل‬


‫أھداف الفصل‬
‫يتناول ھذا الفصل التركيب الداخلي لنظام قاعدة البيانات أوراكل وفي نھاية ھذا الفصل‬
‫ستكون قادرا بمشيئة ﷲ على ‪:‬‬
‫‪ -١‬فھم العالقات بين الجداول‬
‫‪ -٢‬تعريف نمذجة العالقة‬
‫‪ -٣‬فھم مكونات قاعدة البيانات العالئقية‬
‫‪ -٤‬فھم العالقة بين الخادم والمستفبد‬
‫‪ -٥‬قھم الخادم ‪SERVER‬‬
‫‪ -٦‬فھم المستفيد ‪Client‬‬
‫‪moon‬‬

‫مقدمة في قواعد البيانات العالئقية‬


‫يقدم ھذا الفصل التركيب والبناء الداخلي لنظام إدارة قواعد البيانات أوراكل ‪ ،‬فيحتوي على‬
‫وصف سريع لمكونات أوراكل وتعتمد غالبية تطبيقات نظم قواعد البيانات في بنائھا على أحد‬
‫نماذج قاعد البيانات التالية‪:‬‬

‫نموذج ھيكلي )ھرمي ( ‪Hierarchical Model‬‬ ‫‪-١‬‬


‫نموذج شبكي ‪Network Model‬‬ ‫‪-٢‬‬
‫نموذج عالئقي ‪Relational Model‬‬ ‫‪-٣‬‬
‫نموذج شيئي ‪Object Model‬‬ ‫‪-٤‬‬

‫في الماضي كان النموذج األول ) الھرمي ( األكثر انتشارا مع أجھزة الكمبيوتر الكبيرة ‪Main‬‬
‫‪ Frame‬ثم بدا النظام الثاني ) الشبكي ( في االنتشار وخاصة مع التوسع في بناء وتركيب‬
‫شبكات الحاسب وكانت ھناك صعوبات في استخدام النظامين االول والثاني ) الھرمي والشبكي (‬
‫نتيجة الستخدام مؤشرات البرمجة ) ‪ ( Pointers‬لربط سجالت البيانات بعضھا مع بعض ‪ ،‬لذا‬
‫نجد أن إضافة أو تعديل أو حذف السجالت يحتاج إلى المزيد من قھم طبيعة وعمل المؤشرات‬
‫وفي ھذه الفترة الماضية طرق برمجة المؤشرات تكتب بلغة الكوبول )‪.(COBOL‬‬
‫أما النموذج العالئقي )‪ (Relational‬فھو األكثر سھولة في االستخدام وفي برمجة تطبيقات نظم‬
‫قواعد البيانات ومن الناحية النظرية األكاديمية فيلزمك دراسة المفاھيم األساسية والضروربة لھذا‬
‫النموذج العالئقي لھذا سنركز ھنا على‬

‫‪ -١‬ھيكل البيانات العالئقية ‪Relational Data Structure‬‬


‫‪ -٢‬الضوابط الحاكمة للبيانات العالئقية ‪Constraint that govern organization of‬‬
‫‪data structure‬‬
‫‪ -٣‬العمليات التي تجرى على ھذه البيانات ‪Operations that are performance data‬‬
‫‪structure‬‬

‫ويعتمد نظام ھياكل البيانات العالئقبة )‪ (Relational Database‬على ھيكل منطقي‬


‫ويطلق عليه عالقة )‪(Relational‬وعلى شكل ثنائي األبعاد ‪(Tow dimensional‬‬
‫) ‪ data structure‬يتكون من صفوف وأعمدة ويسمى جدول )‪ (Table‬ھذا باإلضافة‬
‫إلى عناصر البيانات )‪ (Data elements‬تسمى في ھذه الحالة ‪ attributes‬عالوة‬
‫على ھذا يتم تنظيم ھذه البيانات الفعلية في وحدة أو وحدات تسمى ‪ Tuples‬تقسم إلى‬
‫صفوف ‪ Rows‬أو )سجالت ‪ ( Records‬وأعمدة ‪) Columns‬حقول ‪( Fields‬‬
‫والشكل التالي يبين العناصر األساسية لجدول الموظقين ‪Employees‬‬
‫‪moon‬‬

‫العالقة بين الجداول‬

‫لربط عالقة بأخرى تتحتاج إلى طريقة لالرتباط ‪ .‬وھذه الطريقة تستخدم حقال ‪ Field‬يكون‬
‫موجودا في الجدولين وحقل االرتباط يسمى في الجدول األول بالمفتاح الرئيسي ‪(Primary‬‬
‫)‪ Key‬للجدول األول ويسمى يالمفتاح ال )‪ (Foreign Key‬في الجدول الثاني‬
‫‪moon‬‬

‫نمذجة العالفة ‪Relational Model Algebra‬‬


‫تعرف بانھا العمليات التي يتم اجراؤھا على جدول أو مجموعة من الجداول تبعا لعالقة محددة‬
‫ويوجد معامالن ‪ Operators‬ھما ‪ Unary‬والثاني‪ Binary‬والجدول التالي يعدد سبعة انواع‬
‫لھذه العمليات‬

‫العملية‪Operation‬‬ ‫نوع العملية ‪Type‬‬ ‫وصف العملية‬


‫‪Union‬‬ ‫‪Binary‬‬ ‫تجميع الصفوف السجالت من جدولين مع عدم‬
‫السماح بنكرار سجالت‬
‫‪Intersection‬‬ ‫‪Binary‬‬ ‫تحديد السجالت )الصفوف( المشتركة بين‬
‫جدولين‬
‫‪Difference‬‬ ‫‪Binary‬‬ ‫اظھار السجالت الموجودة في الجدول االول‬
‫وال توجد في الجدول الثاني‬
‫‪Projection‬‬ ‫‪Unary‬‬ ‫إظھار السجالت مع بعض األعمدة )مصدر‬
‫البيانات(‬
‫‪Selection‬‬ ‫‪Unary‬‬ ‫إظھار السجالت من جدول مصدر البيانات تبعا‬
‫لمعيار البحث ‪Criteria‬‬
‫‪Product‬‬ ‫‪Unary‬‬ ‫وصل كل سجل من جدول البيانات االول مع‬
‫كل سجل في الجدول الثاني‬
‫‪Join‬‬ ‫‪Unary‬‬ ‫وصل وتمديد السجالت من الجدول األول مع‬
‫مايقابله من سجالت في الجدول الثاني‬
‫‪moon‬‬

‫مكونات قاعدة البيانات العالئقية ‪RDBMS Components‬‬

‫تتكون قاعدة البيانات العالئقية من ‪:‬‬

‫‪ -١‬نظام تشغيل ثاعدة البيانات ويطلق عليه ‪Kernel‬‬


‫‪ -٢‬قاموس البيانات ‪Data Dictionary‬‬

‫ويتكون نظام تشغيل وتنظيم قاعدة البيانات )‪ (Kernel‬من مجموعة من الوحدات البرمجية‬
‫‪ Software‬والذي صمم ليحكم وينظم وينعامل مع البيانات مابين حفظ واسترجاع وطباعة‬
‫وكذلك تحديد المسؤليات وعمل نظم األمان وحماية البيانات‬
‫وعادة يحتفظ نظام قاعدة البيانات بقائمة من المستخدمين الذين لھم صالحية للتعامل مع تطبيق‬
‫قاعدة البيانات والشكل التالي يوضح بعضا من مكونات الـ ‪ Kernel‬في نظام أوراكل‬

‫مكونات الـ ‪ Kernel‬في نظم قاعدة البيانات‬

‫ويحوي قاموس البيانات ‪ Data Dictionary‬وصفا لشكل البيانات ويطلق على ھذا الوصف‬
‫‪ Meta Description‬أو ‪ Meta Data‬وھذا الوصف يرتبط بكافة الكائنا ت ‪ Objects‬ضمن‬
‫قاعدة البيانات‬
‫وقاموس بيانات أوراكل يحتوي على مجموعة جداول تضم البيانات المخزنة عن طريق‬
‫الـ ‪ Kernel‬وأيضا على كائنات الفھارس ‪Indexes‬كائنات العرض ‪ Views‬كائنات االستعالم‬
‫واالستقسار ‪ SQL and Query‬كائنات اإلجراء ‪ Procedure‬والدوال ‪... Function‬إلخ‬
‫‪moon‬‬

‫الشكل التالي يوضح كيفية قراءة أو تعديل قاعدة بيانات باستخدام أوراكل‬

‫شكل العالقة بين ‪ Kernel‬و ‪ SQL‬و قاموس البيانات‬


‫‪moon‬‬

‫العالقة بين الخادم والمستفيد)العميل( ‪Client/Server‬‬

‫يتكون نظام أوراكل من مكونين‬


‫‪ -١‬الخادم ‪Server‬‬
‫‪ -٢‬المستفيد )العميل – المزود( ‪Client‬‬

‫الخادم ‪Server‬‬

‫يحوي الخادم قاعدة البيانات المركزية ووظائفھا ‪ ،‬وكذلك كافة العمليات الخلفية لحفظ ھذه القاعدة‬
‫ويحوي ايضا أدوات تشغيل وإيقاف قاعدة البيانات‬
‫والشكل التالي يوضح البناء الداخلي لنظام الخادم‬
‫بروتكول اتصال‬
‫الشبكة ‪Net8‬‬
‫مدير الخادم‬
‫‪Server‬‬
‫‪Manager‬‬

‫الخادم ‪Server‬‬
‫نظام االستيراد‬
‫والتصدير‬ ‫نظم االستعالم‬
‫&‪EXP80‬‬ ‫‪SQL * PLUS‬‬
‫‪IMP80‬‬

‫المترجمات‬
‫‪Pre‬‬ ‫نظام التحميل‬
‫‪compliers‬‬ ‫‪LOADER‬‬

‫المستفيد ‪Client‬‬

‫أما المستفيد ‪ Client‬فيحتوي على برامج الخدمات والبرامج المساعده والتي بمكننا تشغيلھا عن‬
‫بعد باستخدام الشبكة كما يتضمن نظام المستفيد الوسيط الرسومي ‪ Graphical Interface‬الذي‬
‫يسھل علينا استخدامه وتوجد أداة االتصال بين الخادم والمستقيد وھي‪ Net 8‬لتقوم بعمليات الربط‬
‫واالتصال عبر الشبكة‬
‫‪moon‬‬

‫و تشمل حزمة البرامج لنظام المستفيد على‬


‫‪ -١‬مدير المشروع ‪Enterprise Manager‬‬
‫ويحوي داخله المكونات التالية‬
‫• متحكم مدير المشروع ‪Enterprise Manager‬‬
‫• مدير مخطط قاعدة البيانات ‪Schema Manager‬‬
‫• مدير السرية ‪Security Manager‬‬
‫• مدير الطبعة ‪Instance Manager‬‬
‫• مدير التخزين ‪Storage Manager‬‬
‫• مدير البيانات ‪Data Manager‬‬
‫• مدير النسخ االحتياطي للبيانات ‪Backup and Recovery Manager‬‬
‫• ورقة عمل االستعالم ‪SQL Worksheet‬‬
‫• شريط أدوات المسؤول ‪Administrator Toolbar‬‬

‫بروتكول اتصال‬ ‫‪ -٢‬المساعدون ‪Assistants‬‬


‫الشبكة‬ ‫‪ -٣‬نظام االستعالم ‪SQL*PLUS‬‬
‫)‪(Net8‬‬
‫والشكل التالي يوضج مكونات حزمة البرامج للمستفيد ‪Client‬‬

‫نظام االستعالم ‪SQL*PLUS‬‬


‫المساعدون ‪Assistants‬‬
‫مدير المشروع ‪Enterprise Manager‬‬
‫متحكم مدير المشروع‬ ‫ورقة عمل االستعالم ‪ SQL‬مدير مخطط قاعدة البيانات‬
‫‪Enterprise Manager‬‬ ‫‪Schema Manager‬‬ ‫‪Worksheet‬‬

‫مدير السرية ‪Security‬‬ ‫مدير النسخ االحتياطي للبيانات‬ ‫مدير الطبعة ‪Instance‬‬
‫‪Manager‬‬ ‫‪Backup and Recovery‬‬ ‫‪Manager‬‬
‫‪Manager‬‬

‫مدير البيانات ‪Data‬‬ ‫مدير التخزين ‪Storage‬‬ ‫شريط أدوات المسؤول‬


‫‪Manager‬‬ ‫‪Manager‬‬ ‫‪Administrator‬‬
‫‪Toolbar‬‬

‫ملخص الوحدة‬

‫تناولنا في ھذا الفصل تعريف التركيب الداخلي لنظام أوراكل وأھم مكوناته والعالقة بين الجداول‬
‫‪ ،‬وكذلك عملية نمذجة العالقة على الجداول وتم تعريف الخادم والمستفيد والعالقة بينھما ‪.‬‬
‫‪moon‬‬

‫جمل ‪ SQL‬البسيطة‬

‫أھداف الفصل‬

‫نتااول عملية استرجاع البيانات في حاالت مختلفة مستخدمين في ذلك جملة ‪ SELECT‬وفي‬
‫نھاية ھذا الفصل ستكون إن شاء ﷲ قادر على ‪:‬‬
‫• استرجاع البيانات بواسطة جملة ‪ SELECT‬البسيطة‬
‫• فھم متطلبات وإرشادات كتابة جمل ‪SQL‬‬
‫• استخدام العمليات الحسابية وأولويات تنفيذھا مع جمل ‪SQL‬‬
‫• استخدام الجمل اإللحاقية على البيانات‬
‫• استخدام عبارة ‪ DISTINCT‬لمنع تكرار عرض البيانات‬
‫• عرض مواصفات الجدول‬
‫‪moon‬‬

‫أساسيات جملة ‪SELECT‬‬

‫جملة ‪SELECT‬‬
‫تستخدم جملة ‪ SELECT‬السترجاع البيانات المخزنة في جدول أو عدة جداول حيث أن عملية‬
‫االسترجاع ال تعدل في ھذه البيانات ويمكننا من خالل جملة ‪ SELECT‬أن نقوم بالتالي‪:‬‬

‫‪ -١‬اختيار وعرض مجموعة معينة من السجالت المخزنة في الجدول‬


‫‪ -٢‬استرجاع بيانات بعض حقول الجدول‬
‫‪ -٣‬استرجاع بيانات مخزنة في جداول مختلفة‬

‫مالحظة‬
‫يمكن أن نستخدم كل أو بعض ھذه المزايا في جملة استفسار واحدة‬

‫مالحظة‬
‫أوامر محرر‪SQL*PLUs‬‬
‫ھنالك بعض االوامر البسيطة التي ستساعدك في كتابة وتحرير وتنفيذ األوامر على محرر ‪SQL‬‬
‫ومنھا‬
‫‪ -١‬االمر ‪ EDIT‬ويمكن كتابته ‪ : ED‬يستخدم ھذا األمر لتحرير آخر امر تم كتابته على‬
‫محرر ‪ SQL‬وعند تنفيذ ھذا األمر ستفتح لك شاشة المحرر )المفكرة( التي يمكنك‬
‫خاللھا اعادة تحرير األمر وعند االنتھاء من ذلك احفظ االمر ثم اغلق شاشة المفكرة‬
‫ولكن الحظ ال تكتب الفاصلة المنقوطة );( بعد نھاية األمر في ھذه الحالة فقط‬
‫‪ -٢‬األمر ‪ R‬وطريقة كتابته )‪ (/‬ويستخدم العادة تنفيذ اخر امر ‪SQL‬محفوظ‬

‫الشكل العام لجملة ‪SELECT‬‬

‫}… ‪SELECT { * , COLUMN [alies],‬‬


‫; ‪FROM table_name‬‬

‫حيث أن‬
‫‪ COLUMN‬اسم الحقل‬
‫‪ table_name‬اسم الجدول‬
‫تسمية العمود‬ ‫‪alies‬‬

‫يمكن أن نضع الرمز * للداللة على استرجاع جميع حقول الجدول‬

‫كتابة جمل ‪SQL‬‬


‫نوضح فيما يلي بعض القواعد اإلرشادية التي يجب أن توضع بعين االعتبار عند كتابة جمل‬
‫‪SQL‬‬

‫‪ -١‬يمكن كتابة جمل ‪ SQL‬بالحروف الكبيرة أو الصغيرة‬


‫‪ -٢‬يمكن كتابة جمل ‪ SQL‬في عذة أسطر‬
‫‪moon‬‬

‫‪ -٣‬ال يمكن فصل الكلمات المحجوزة عبر السطور مثل ‪FROM‬‬


‫‪ -٤‬اترك مساقات بين مكونات الجملة لتسھيل عملية القراءة‬
‫‪ -٥‬في برنامج ‪ SQL *PLUS‬تكتب األوامر مع مؤشر ‪ SQL‬ويتم تخزين ھذا االمر‬
‫مباشرة في الذاكرة‬

‫مثال‬
‫;‪SELECT * FROM s_dept‬‬

‫‪ID‬‬ ‫‪NAME‬‬ ‫‪REGION_ID‬‬


‫‪--------‬‬ ‫‪-------------‬‬ ‫‪----------‬‬

‫‪10 Finance‬‬ ‫‪1‬‬


‫‪31 Sales‬‬ ‫‪1‬‬
‫‪32 Sales‬‬ ‫‪2‬‬
‫‪33 Sales‬‬ ‫‪3‬‬
‫‪34 Sales‬‬ ‫‪4‬‬
‫‪35 Sales‬‬ ‫‪5‬‬
‫‪41 Operations‬‬ ‫‪1‬‬
‫‪42 Operations‬‬ ‫‪2‬‬
‫‪43 Operations‬‬ ‫‪3‬‬
‫‪44 Operations‬‬ ‫‪4‬‬
‫‪45 Operations‬‬ ‫‪5‬‬
‫‪50 Administration‬‬ ‫‪1‬‬
‫‪12 rows selected.‬‬

‫لتنفيذ جمل ‪SQL‬‬


‫نضع فاصلة منقوطة في نھاية الجملة في مؤشر ‪SQL‬‬ ‫‪-١‬‬
‫نضع عالمة ‪ /‬في نھاية الجملة في مؤشر ‪ SQL‬العادة اخر امرموجود في ال)‪(Buffer‬‬ ‫‪-٢‬‬
‫نضع عالمة ‪ /‬في نھاية الجملة في األمر في الذاكرة )‪(BUFFER‬‬ ‫‪-٣‬‬
‫كتابة عبارة ‪ RUN‬او ‪ R‬في مؤشر ‪ SQL‬العادة اخر امرموجود في ال)‪(Buffer‬‬ ‫‪-٤‬‬
‫‪moon‬‬

‫العمليات الحسابية‬

‫يمكن أن نستخدم العمليات الحسابية عند عرض البيانات دون أن تؤثر ھذه المعالجة على‬
‫البياانات المخزنة في الجدول ‪ ،‬ويمكن أن يحتوي التعبير الحسابي على اسم الحقل قيمة ثابتة و‬
‫العملية الحسابية‬

‫العمليات الحسابية‬

‫العمليات التي يمكن أن تستخدم ھي‪:‬‬


‫‪+‬‬ ‫‪ -١‬الجمع‬
‫‪-‬‬ ‫‪ -٢‬الطرح‬
‫÷‬ ‫‪ -٣‬القسمة‬
‫*‬ ‫‪ -٤‬الضرب‬

‫ويمكن استخدام ھذه العمليات في جميع أجزاء جملة‪ SELECT‬عدا الجزء الخاص بـ‪FROM‬‬

‫أولويات العمليات‬
‫‪ -١‬االفواس الداخلية ثم الخارجية‬
‫‪ -٢‬الضرب والقسمة‬
‫‪ -٣‬الجمع والطرح‬

‫مالحظة‬
‫العمليات التي لھا نفس االولية كالجمع والطرح تنفذ من اليسار الى اليمين‬

‫العملية اإللحاقية‬

‫يمكن أن نجري عملية إلحاق عدد من األعمدة للجدول أو مجموعة حرفية نصية إلى حقول‬
‫أخرى عند العرض باستخدام العملية اإللحاقية ||‬

‫مثال‬
‫‪SELECT‬‬ ‫‪first_name||last_name‬‬
‫‪FROM‬‬ ‫;‪s_emp‬‬

‫‪Employees‬‬
‫‪-------------------------------------------------‬‬
‫‪CarmenVelasquez‬‬
‫‪LaDorisNgao‬‬
‫‪MidoriNagayama‬‬
‫‪MarkQuick-To-See‬‬
‫‪moon‬‬

‫‪AudryRopeburn‬‬
‫‪MollyUrguhart‬‬
‫‪...‬‬

‫نالحظ ان االسم االول اتصل باالسم االخير بدون وجود مسافات فظھر كانه اسم واحد ولكي‬
‫توجد مسافات نكتب‬

‫;‪SELECT first_name ||' '|| last_name FROM s_emp‬‬

‫استخدام عبارة ‪DISTINCT‬‬

‫تستخدم عبارة ‪ DISTINCT‬لمنع تكرار ظھور بيانات السجل المسترجع فمثال إذا أردنا أن‬
‫نعرف على الوائف التي ينتسب إليھا الموظفون والمخزنة في جدول الموظفين نجد أن ھنالك‬
‫وظائف تتكرر حسب عدد الموظفين الذين ينتمون إليھا لمنع تكرار نستخدم عبارة‬
‫‪DISTINCT‬‬

‫ويأخذ األمر ‪ SELECT‬الشكل التالي‪:‬‬


‫}… ‪SELECT [DISTINCT] { * , COLUMN [alies],‬‬
‫; ‪FROM table_name‬‬

‫حيث أن‬
‫‪ COLUMN‬اسم الحقل‬
‫‪ table_name‬اسم الجدول‬
‫تسمية العمود‬ ‫‪alies‬‬
‫‪ DISTINCT‬لمنع التكرار‬

‫ملخص الفصل‬

‫تناولنا في ھذا الفصل كتابة جمل ‪ SQL‬البسيطة )جملة ‪ (SELECT‬التي تستخدم في‬
‫استرجاع البيانات وكذلك بعض القواعد اإلرشادية التي يجب اتباعھا عند كتابة وتنفيذ جمل‬
‫الـ‪ SQL‬كما تناولنا استخدام العمليات الحسابية مع جملة ‪ SELECT‬والعملية اإللحاقية‬
‫وكذلك عبارة ‪ DISTINCT‬التي تستخدم لمنع تكرار ظھور السجالت‬
‫‪moon‬‬

‫استرجاع البيانات بشروط ترتيبھا‬

‫اھداف الفصل‬
‫‪ -١‬المعرفة التامة ألسماء الجداول وأسماء الحقول وخصائصھا وانواع البيانات‬
‫‪ -٢‬التعامل مع جملة ‪ SQL‬البسيطة )‪(SELECT Statement‬‬
‫‪ -٣‬استخدام أوامر محرر ‪SQL‬‬
‫‪moon‬‬

‫استخدام جملة الشرط ‪WHERE CLAUSE‬‬


‫مقدمة‬

‫لقد قمنا في الوحدة السابقة بالتعرف الى جملة االستعالم البسيط )‪(SELECT Statement‬‬
‫التي من خاللھا تم استرجاع البيانات من الجداول ‪ .‬وفي ھذا الفصل سنتابع الحديث عن ھذه‬
‫الجملة يشكل أوسع ‪ ،‬حيث سنسترجع البيانات من الجداول بناء على شروط معينة ‪ ،‬أو مرتبة‬
‫حسب بيانات حقول معينة ‪ ،‬أي سندرس االمور المتعلقة بجملة الشرط في جملة االسترجاع ‪ ،‬من‬
‫حيث المعامالت الشرطية وطريقة التعبير عن الشرط والترتيب التصاعدي والترتيب التنازلي‬
‫للبيانات‬

‫الصيغة العامة لجملة الشرط‬

‫}*|‪SELECT {Field1, Field2, ...,...‬‬


‫‪FROM Table1‬‬
‫;‪WHERE Condition‬‬

‫حيث أن‬

‫أسماء الحقول التي سيام استرجاع بياناتھا‬ ‫‪Field1.Field2‬‬


‫أسم الجدول الذي سيتم استرجاع البيانات منه‬ ‫‪Table1‬‬
‫جملة شرطية أو أكثر تكون نتيجتھا إما ‪ True‬او ‪ False‬وتتكون من‬ ‫‪Condition‬‬
‫أسماء حقول وتعبيرات ومعامالت‬

‫الشرح‬

‫تستخدم جملة ‪ WHERE‬لحصر البيانات التي سيتم استرجاعھا من الجداول وھي تحتوي على‬
‫شرط وتقع مباشرة بعد المقطع ‪ FROM‬وعند تنفيذ الجملة سيتم استرجاعھا بيانات الحقول‬
‫المذكورة التي تحقق الشرط المذكور في جملة ‪ WHERE‬ويمكن أن تقارن الجملة الشرطية بين‬
‫قيم أو حقول في الجدول أو تعبيرات حسابية أي أن جملة ‪ WHERE‬تحتوي على مايلي‪:‬‬

‫أسماء الحقول‬ ‫•‬


‫معامالت المقارنة‬ ‫•‬
‫قيم ثابتة‬ ‫•‬
‫متغيرات وتغبيرات حسابية‬ ‫•‬
‫‪moon‬‬

‫األمور التي يجب أخذھا بعين االعتبار‬

‫‪ -١‬عند استخدام حقول النص وحقول التاريخ في جملة الشرط يجب وضع القيم بين عالمتي‬
‫تنصيص مفردتين )’ ’(‬
‫‪ -٢‬في حالة الحقول النصية يجب مراعاة حالة األحرف كبيرة أو صغيرة‬
‫‪ -٣‬في حالة حقول التاريخ يجب مراعاة صيغة التاريخ )‪ (FORMAT‬والصيغة األسا سية‬
‫للتاريخ ھي كما يلي ‪DD-MON-YY‬‬
‫‪moon‬‬

‫معامالت المقارنة ‪COMPARISON OPERATORS‬‬


‫تشمل معامالت المقارنة الرموز التالية‪:‬‬

‫المعنى‬ ‫المعامل‬
‫يساوي‬ ‫=‬
‫أكبر من‬ ‫>‬
‫أقل من‬ ‫<‬
‫أكبر من أو يساوي‬ ‫=>‬
‫اقل من أو يساوي‬ ‫=<‬
‫ال يساوي‬ ‫><‬
‫ال يساوي‬ ‫=!‬

‫تستخدم معامالت المقارنة في جملة الشرط لمقارنة تعبير بآخر في جملة ‪ WHERE‬كما في‬
‫الصيغة التالية ‪:‬‬

‫ﺗﻌﺒﻴﺮ ‪ OPERATOR‬ﺗﻌﺒﻴﺮ ‪WHERE‬‬

‫مثال‬

‫’‪WHERE hiredate=’01-SEP-96‬‬
‫‪WHERE sal>=1500‬‬
‫’‪WHERE name=’Ahmed‬‬
‫‪WHERE sal<> other‬‬

‫معامالت مقارنة أخرى‬

‫المعنى‬ ‫نفى المعامل‬ ‫المعامل‬


‫بين قيمتين‬ ‫‪NOT BETWEEN‬‬ ‫‪BETWEEN‬‬
‫ضمن قائمة من القيم‬ ‫‪NOT IN‬‬ ‫‪IN‬‬
‫مطابقة نمط النص‬ ‫‪NOT LIKE‬‬ ‫‪LIKE‬‬
‫ھل ھي قسمة فارغة‬ ‫‪IS NOT NULL‬‬ ‫‪IS NULL‬‬

‫‪ -١‬المعامل ‪BETWEEN‬‬
‫يستخدم ھذا المعامل السترجاع بيانات الصفوف التي تعتمد على مدى من القيم أي البيانات التي‬
‫تقع بين قيمتين‬

‫مثال‬

‫‪SELECT * FROM S_EMP‬‬


‫;‪WHERE sal BETWEEN 1500 AND 2500‬‬
‫‪moon‬‬

‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين اقع رواتبھم بين ‪١٥٠٠‬و ‪٢٥٠٠‬‬

‫مالحظة‬
‫ستم استرجاع بيانات الموظف الذي يببلغ راتبه تماما ‪ ١٥٠٠‬أو ‪ ٢٥٠٠‬أي أن جملة‬
‫‪ BETWEEN‬تتضمن الحد األعلى والحد األدنى للقيم التي سيتم استرجاعھا‬

‫‪ -٢‬المعامل ‪IN‬‬

‫يستخدم ھذا المعامل للبحث عن قيمة داخل قائمة من القيم فتحتوي ھذه القائمة قيما ثابتة أو قد‬
‫تكون ھذه القائمة عبارة عن جملة استعالم فرعي‬

‫مثال‬

‫‪SELECT name, sal , deptno FROM S_EMP‬‬


‫;)‪WHERE detno IN (10,30‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه ورقم القسم الذي يعمل به للموظفين الذين يعملون في‬
‫قسم رقم ‪ ١٠‬أو قسم رقم ‪٣٠‬‬

‫‪ -٣‬المعامل ‪.LIKE‬‬

‫يستخدم ھذا المعامل للبحث عن نص معين داخل حقل نصي ‪ ،‬حيث سيتم مطابقة حروف النص‬
‫المذكورة في جملة الشرط‬

‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫;’‪WHERE name LIKE ‘S%‬‬

‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين تبدأ أسماؤھم بحرف ‪S‬‬

‫مالحظة‬
‫تستخدم االشارة ‪ %‬عوضا عن أي قيمة نصية ‪ ،‬قد تكون ال شيء أو أي عدد من الحروف للبحث‬
‫مثال عن اسم معين ينتھي بحرف ‪ A‬نكتب ’‪ ‘%A‬وللبحث عن نص يحتوي حرف ‪ A‬نكتب‬
‫’‪ ‘%A%‬وھكذا بإمكاننا أن نبحث عن أي مقطع داخل حقل نصي معين‬

‫مثال‬

‫‪SELECT * FROM S_EMP‬‬


‫;’‪WHERE name LIKE ‘_A%‬‬
‫‪moon‬‬

‫أي أنه سيتم استرجاع جمبع بيانات الموظفين الذين يكون الحرف الثاني في أسمائھم ھو ‪A‬‬

‫مالحظة‬
‫تستخدم اإلشارة _ عوضا عن حرف واحد فقط‬

‫‪ -٤‬المعامل ‪IS NULL‬‬

‫يستخدم ھذا المعامل لفحص القيمة )ال شيء( أي قيم القول التي ال تحتوي على بيانات‬

‫مثال‬
‫‪SELECT name, sal FROM S_EMP‬‬
‫;‪WHERE comm. IS NULL‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين ليس لھم عمولة أو لم يتم ادخال‬
‫عمولتھم‬

‫المعامالت المنطقية ‪LOGICAL OPERATORS‬‬


‫المعنى‬ ‫المعامل‬
‫يرجع ‪ TRUE‬اذا كانت كلتا القيمتين ‪TRUE‬‬ ‫‪AND‬‬
‫يرجع ‪ TRUE‬اذا كانت احدى القيمتين ‪TRUE‬‬ ‫‪OR‬‬
‫يرجع ‪ TRUE‬إذا كانت القيمة ‪FALSE‬‬ ‫‪NOT‬‬

‫تستخدم المعامالت المنطقية لترجع قيمة واحدة ‪ TRUE‬أو ‪ FALSE‬كنتيجة بين قيمتين‬
‫منطقيتين او لعكس قيمة منطقية من ‪ TRUE‬الى ‪ FALSE‬والعكس‬
‫من خالل المعامالت المنطقية يمكننا تكوين أكثر من شرط داخل جملة ‪ WHERE‬باستخدام‬
‫المعامل‪ AND‬او المعامل ‪OR‬‬

‫‪ -١‬المعامل ‪AND‬‬

‫يتطلب ھذا المعامل أن تكون كال القيمتين ‪TRUE‬‬

‫مثال‬
‫‪SELECT name, sal FROM S_EMP‬‬
‫;‪WHERE sal>=2600 AND comm<200‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين يزيد راتبھم عن ‪ ٢٦٠٠‬وتقل‬
‫عمولتھم في نفس الوقت عن ‪ ٢٠٠‬أي انه يجب يتحقق الشرطين السترجاع البيانات‬
‫‪moon‬‬

‫‪ -٢‬المعامل ‪OR‬‬

‫يتطلب ھذا المعامل أن تكون أي من القيمتين ‪TRUE‬‬

‫مثال‬
‫‪SELECT name, sal FROM S_EMP‬‬
‫;‪WHERE sal <200٠ OR deptno=30‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموفين الذين يزيد راتبھم عن ‪ ٢٠٠٠‬أو يعملون في‬
‫قسم رقم ‪ ٣٠‬أي أنه يجب يتحقق أي من الشرطين السترجاع البيانات‬

‫المعامل ‪NOT‬‬ ‫‪-٣‬‬

‫يقوم ھذا المعامل بعكس قيمة منطقية من ‪ TRUE‬إلى ‪ FALSE‬والعكس‬

‫مثال‬
‫‪SELECT name, sal FROM S_EMP‬‬
‫;)‪WHERE deptno NOT IN (20,40‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين ال يعملون في القسمين رقم ‪ ٢٠‬و رقم‬
‫‪ ٤٠‬وفي ھذه الحالة تم عكس نتيجة المعامل ‪IN‬‬
‫‪moon‬‬

‫أولويات المعامالت المنطقية ومعامالت المقارنة‬


‫إذا ورد أكثر من معامل منطقي في نفس جملة الشرط فإن أولوية تنفيذ ھذه المعامالت من األعلى‬
‫إلى األدتى غي كالتالي ‪:‬‬

‫األقواس‬ ‫‪-١‬‬
‫معامالت المقارنة )> ‪(<> ، = ، < ،‬‬ ‫‪-٢‬‬
‫‪NOT‬‬ ‫‪-٣‬‬
‫‪AND‬‬ ‫‪-٤‬‬
‫‪OR‬‬ ‫‪-٥‬‬

‫استخدام جملة الترتيب ‪ORDER BY‬‬

‫الصيغة العامة‬
‫}*|…‪SELECT {Field1, Field2,…,‬‬
‫‪FROM Table1‬‬
‫‪WHERE Condition‬‬
‫;]‪ORDER BY Field3 [ASC|DESC‬‬

‫حيث أن‬

‫اسم الجدول الذي سيتم استرجاع البيانات منه‬ ‫‪Table1‬‬


‫اسماء الحقول التي سبتم استرجاع بياناتھا‬ ‫‪Field1, Field2‬‬
‫جملة شرطية أو اكثر تكون نتيجتھا إما ‪ True‬أو ‪ False‬وتتكون من‬ ‫‪Condition‬‬
‫اسماء حقول وتعبيرات ومعامالت منطقية‬
‫اسم الحقل الذي سيتم الترتيب بناء عليه‬ ‫‪Field3‬‬
‫استرجاع البيانات مرتبة تصاعديا ويجوز عدم ذكرھا‬ ‫‪ASC‬‬
‫استرجاع البيانات مرتبة تنازليا‬ ‫‪DESC‬‬

‫الشرح‬

‫عند استرجاع البيانات تستخدم جملة ‪ ORDER BY‬لترتيب البيانات حسب حقل معين أو‬
‫عدة حقول وتأتي ھذه الجملة في نھاية جملة االسترجاع ‪ SELECT‬وقد يكون ھذا الترتيب‬
‫تصاعديا )من القيمة الصغيرة إلى القيمة الكبيرة ( عند استخدام المقطع ‪ ASC‬وقد يكون تنازليا‬
‫)من الفيمة الكبيرة إلى القيمة الصغيرة( عند استخدتم المقطع ‪DESC‬‬

‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫)‪WHERE deptno NOT IN (20,40‬‬
‫;‪ORDER BY empno ASC‬‬
‫‪moon‬‬

‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ال يعملون في القسمين رقم ‪ ٢٠‬ورقم‬
‫‪٤٠‬وستكون البيانات مرتبة تصاعديا حسب رقم الموظف‬

‫ويجوز كتابة الجملة السابقة دون المقطع ‪ ASC‬كمايلي‪:‬‬

‫‪SELECT * FROM S_EMP‬‬


‫)‪WHERE deptno NOT IN (20,40‬‬
‫;‪ORDER BY empno‬‬

‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫)‪WHERE deptno NOT IN (20,40‬‬
‫;‪ORDER BY empno DESC‬‬

‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ال يعملون في القسمين رقم ‪ ٢٠‬ورقم‬
‫‪٤٠‬وستكون البيانات مرتبة تنازليا حسب رقم الموظف‬

‫ملخص الفصل‬

‫تناولنا من خالل ھذا الفصل موضوع استرجاع البيانات بشروط من الجداول وموضوع ترتيب‬
‫البيانات تصاعديا وتنازليا كما وتطرقنا من خالل دراسة جملة الشرط إلى معامالت المقارنة‬
‫والمعامالت المنطقية ومعامالت أخرى مثل ‪BETWEEN‬و ‪IN‬و ‪ IS NULL‬ومايتعلق بھا‬
‫من حيث طريقة االستخدام وتركيب جملة الشرط وأولويات معامالت المقارنة والمعامالت‬
‫المنطقية‪.‬‬
‫‪moon‬‬

‫الدوال الحرفية‬
‫اھداف الفصل‬

‫في نھاية ھذا الفصل إن شاء ﷲ ستكون قادر على ‪:‬‬


‫تحويل الحروف من صغيرة إلى كبيرة وبالعكس من خالل ‪SQL‬‬ ‫‪-١‬‬
‫ضبط ومحاذاة الحروف داخل النص الموجود في‪SQL‬‬ ‫‪-٢‬‬
‫القيام بحذف البيانات من الجداول‬ ‫‪-٣‬‬
‫التعامل مع اللفظ الصوتي للبيانات‬ ‫‪-٤‬‬
‫القيام بتعديل بيانات الجدول‬ ‫‪-٥‬‬
‫‪moon‬‬

‫الدال الحرفية والضبط والمحاذاة‬


‫دالة تحويل البيانات إلى حروف صغيرة ‪LOWER Function‬‬

‫تسنخدم ھذه الدالة لتحويل البيانات من حروف كبيرة إلى حروف صغيرة ويتم استخدام ھذه الدالة‬
‫غاليا مع جمل أخرى‬

‫الشكل العام انظر المثال التالي‬

‫مثال ‪.‬‬
‫)‪SELECT LOWER (name), LOWER (job‬‬
‫;‪FROM S_EMP‬‬

‫سيتم عرض اسم الموظف ووظبقته ولكن بحروف صغيرة‬

‫‪LOWER name‬‬ ‫‪LOWER job‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪ali‬‬ ‫‪salesman‬‬
‫‪ahmed‬‬ ‫‪analyst‬‬
‫‪sami‬‬ ‫‪manager‬‬
‫‪khaled‬‬ ‫‪manager‬‬

‫دالة تحويل البيانات إلى حروف كبيرة ‪UPPER Function‬‬

‫تسنخدم ھذه الدالة لتحويل البيانات من حروف صغيرة إلى حروف كبيرة ويتم استخدام ھذه الدالة‬
‫غاليا مع جمل أخرى‬

‫مثال‬
‫)‪SELECT UPPER (name), UPPER (job‬‬
‫;‪FROM S_EMP‬‬

‫دالة تحويل الحرف األول من البيانات إلى حرف كبير ‪INITCAP‬‬

‫تستخدم ھذه الدالة لتحويل أول حرف من بيانات الحقل المحدد إلى حرف كبير ويتم استخدام ھذه‬
‫الدالة غالبا مع الجمل أخرى‬

‫مثال‬
‫)‪SELECT INITCAP (name), INITCAP (job‬‬
‫;‪FROM S_EMP‬‬
‫‪moon‬‬

‫سيتم عرض اسم الموظف ووظبقته ولكن اول حرف في كالھما سيكون كبير‬

‫‪INITCAP name‬‬ ‫‪INITCAP job‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪Ali‬‬ ‫‪Salesman‬‬
‫‪Ahmed‬‬ ‫‪Analyst‬‬
‫‪Sami‬‬ ‫‪Manager‬‬
‫‪Khaled‬‬ ‫‪Manager‬‬

‫دالة اقتطاع )قص( جزء من بيانات الحقل ‪SUBSTR‬‬

‫تستخدم لعرض أو قص جزء معين من بيانات العمود او الحقل‬

‫الصيغة العامة‬

‫)‪SUBSTR(Field1,N,M‬‬
‫حيث أن‬
‫الحقل المراد االقتطاع منه‬ ‫‪String‬‬
‫اول حرف يبدأ عنده االقتطاع‬ ‫‪N‬‬
‫عدد الحروف المراد اقتطاعھا‬ ‫‪M‬‬

‫مثال‬

‫)‪SUBSTR('Ahmed',1,3‬‬

‫قيكون الناتج‬
‫‪Ahm‬‬

‫مثال‬
‫)‪SELECT SUBSTR (name, 1,2‬‬
‫;‪FROM S_EMP‬‬

‫سيتم اقتطاع الحرف األول والثاني من اسم الموظف وعرضھا‬


‫‪moon‬‬

‫دالة تحديد موقع حرف في بيانات حقل ‪INSTR Function‬‬

‫تستخدم ھذه الدالة لتحديد مكان أو موقع حرف في بيانات العمود أو الحقل‬

‫الصيغة العامة‬
‫)’‪INSTR (Field, ‘C‬‬

‫حيث أن‬

‫الحقل الذي سيتم التحديد منه‬ ‫‪Field‬‬


‫الحرف المراد استخراج موقعه‬ ‫‪C‬‬

‫مثال‬
‫)’‪SELECT INSTR (name, ‘l‬‬
‫;‪FROM S_EMP‬‬

‫سيتم استخراج موقع الحرف ‪ l‬من حقل اسم الموظف‬

‫‪INSTR name‬‬
‫‪--------------------‬‬
‫‪2‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬

‫دالة ضبط ومحاذاة ناحية اليمين للبيانات ‪RPAD Function‬‬

‫تستخدم ھذه الدالة لمحاذاة البيانات ناحية اليمين حيث يتم ملء حرف معين )أو حروف ( يمين‬
‫البيانات‬

‫الشكل العام‬

‫)’‪RPAD (COL | VALUE, N, ‘ String‬‬

‫حيث أن‬

‫اسم الحقل المطلوب محاذاة بياناته ‪ ،‬ووضع حرف )حروف( يمينه‬ ‫‪COL‬‬
‫يمكن وضع قيمة أو متغير حرفي بين عالمتي تنصيص )" "(‬ ‫‪VALUE‬‬
‫عدد مرات ظھور الحرف الجديد‬ ‫‪N‬‬
‫‪moon‬‬

‫الحرف أو المتغير الذي سيتم ملء الفراغات به‬ ‫‪String‬‬

‫مثال‬
‫)’‪SELECT name, RPAD (sal, 7,’$‬‬
‫;‪FROM S_EMP‬‬

‫‪NAME‬‬ ‫‪RPAD SAL‬‬


‫‪-------------------- --------------------‬‬
‫‪Ali‬‬ ‫‪968$$$$‬‬
‫‪Ahmed‬‬ ‫‪1936$$$‬‬
‫‪SAMI‬‬ ‫‪1512.5$‬‬
‫‪KHALED‬‬ ‫‪3599.75‬‬

‫دالة ضبط ومحاذاة ناحية اليسار للبيانات ‪LPAD Function‬‬

‫تستخدم ھذه الدالة لمحاذاة البيانات ناحية اليمين حيث يتم ملء حرف معين )أو حروف ( يسار‬
‫البيانات‬

‫الشكل العام‬

‫)’‪LPAD (COL | VALUE, N, ‘ String‬‬

‫حيث أن‬

‫اسم الحقل المطلوب محاذاة بياناته ‪ ،‬ووضع حرف )حروف( يمينه‬ ‫‪COL‬‬
‫يمكن وضع قيمة أو متغير حرفي بين عالمتي تنصيص )" "(‬ ‫‪VALUE‬‬
‫عدد مرات ظھور الف الجديد‬ ‫‪N‬‬
‫الحرف أو المتغير الذي سيتم ملء الفراغات به‬ ‫‪String‬‬

‫مثال‬
‫)’‪SELECT name, LPAD (sal, 7,’#‬‬
‫;‪FROM S_EMP‬‬

‫‪NAME‬‬ ‫‪LPAD SAL‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪Ali‬‬ ‫‪####968‬‬
‫‪Ahmed‬‬ ‫‪###1936‬‬
‫‪SAMI‬‬ ‫‪#1512.5‬‬
‫‪KHALED‬‬ ‫‪3599.75‬‬
‫‪moon‬‬

‫حذف و تعديل البيانات‬


‫دالة حذف بيانات ناحية يمين الحقل ‪RTRIM Function‬‬

‫تستنخدم ھذه الدالة لحذف بيانات من ناية يمين العمود او الحقل المحدد‬

‫الصيغة العامة‬
‫)’‪RTRIM (COL | VALUE,‘ String‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود‬ ‫‪VALUE‬‬
‫قيمة الحرف أو المتغير الذي سيتم البحث عنه‬ ‫‪String‬‬

‫مثال‬

‫)’‪SELECT name, RTRIM (job،’man‬‬


‫;‪FROM S_EMP‬‬

‫سيتم حذف ‪ man‬من يمين العمود ‪job‬‬

‫‪name‬‬ ‫‪RTRIM job‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪ALI‬‬ ‫‪Sales‬‬
‫‪AHMED‬‬ ‫‪Analyst‬‬
‫‪SAMI‬‬ ‫‪Manager‬‬
‫‪Khaled‬‬ ‫‪Manager‬‬

‫دالة حذف بيانات يسار الحقل ‪LTRIM Function‬‬

‫تستخدم ھذه الدالة لحذف بيانات من ناحية يسار العمود أو الحقل المحدد‬

‫الشكل العام‬
‫)’‪LTRIM (COL | VALUE,‘ String‬‬
‫‪moon‬‬

‫حيث أن‬

‫اسم القل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود‬ ‫‪VALUE‬‬
‫قيمة الحرف أو المتغير الذي سيتم البحث عنه‬ ‫‪String‬‬

‫مثال‬

‫)’‪SELECT name, LTRIM (job،’man‬‬


‫;‪FROM S_EMP‬‬

‫سيتم حذف ‪ man‬من يسار العمود ‪job‬‬

‫‪name‬‬ ‫‪LTRIM job‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪ALI‬‬ ‫‪Salesman‬‬
‫‪AHMED‬‬ ‫‪Analyst‬‬
‫‪SAMI‬‬ ‫‪ager‬‬
‫‪Khaled‬‬ ‫‪ager‬‬

‫دالة قياس طول بيانات الحقل ‪LENGTH Function‬‬

‫تستخدم ھذه الدالة إليجاد طول بيانات متغير أو الحقل المحدد‬

‫الشكل العام‬
‫)‪LENGTH (COL | VALUE‬‬

‫مثال‬
‫)’‪SELECT LENGTH (name), LENGTH (‘WELCOME‬‬
‫;‪FROM S_EMP‬‬

‫سيتم حساب طول اسم الموظف وطول كلمة ‪.WELCOME‬‬

‫‪LENGTH name‬‬ ‫’‪LENGTH ‘WELCOME‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪3‬‬ ‫‪7‬‬
‫‪5‬‬ ‫‪7‬‬
‫‪4‬‬ ‫‪7‬‬
‫‪6‬‬ ‫‪7‬‬
‫‪moon‬‬

‫دالة تعديل بيانات في جدول ‪TRANSLATE Function‬‬

‫تستخدم ھذه الدالة لنعديل أو لتبديل بيانات موجودة في جدول معين‬

‫الشكل العام‪:‬‬
‫)‪TRANSLATE (COL|VALUE, FROM, TO‬‬

‫حيث أن‬

‫اسم القل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود )البيانات(‬ ‫‪VALUE‬‬
‫الحرف )الحروف( المطلوب تغييره‬ ‫‪FROM‬‬
‫الحرف )الحروف( المطلوب احالله‬ ‫‪TO‬‬

‫مثال‬
‫)’‪SELECT name, TRANSLATE (name,’MI’,’WY‬‬
‫;‪FROM S_EMP WHERE sal=1512.5‬‬

‫سيتم استبدال الحرفين ‪ MI‬بالحرفين ‪WY‬‬

‫‪name‬‬ ‫)‪TRANSLATE(name‬‬
‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪SAMI‬‬ ‫‪SAWY‬‬

‫دالة عرض اللفظ الصوتي ‪SOUNDEX Function‬‬

‫تستخدم ھذه الدالة إليجاد اللفظ الصوتي للبيانات )المتغيرات( الموجودة في جدول معين حتى ولو‬
‫كان ھناك اختالف في بعض األحرف الھجائية‬

‫الشكل العام‪:‬‬
‫)‪SOUNDEX (COL|VALUE‬‬

‫حيث أن‬

‫اسم القل أو العمود‬ ‫‪COL‬‬


‫‪moon‬‬

‫القيمة البديلة للعمود )البيانات(‬ ‫‪VALUE‬‬


‫مثال‬

‫)‪SELECT name, SOUNDEX (name‬‬


‫;‪FROM S_EMP WHERE sal=1512.5‬‬

‫ملخص الفصل‬

‫تناولنا الدوال الحرفية الخاصة بتحويل حالة الحروف من حروف كبيرة إلى حروف صغيرة‬
‫والعكس وكذلك ضبط محاذاة الحروف داخل النص ومن الدوال الھامة الني تناولناھا ايضا دوال‬
‫حذف البيانات ودوال عرض اللفظ الصوتي وتعديل بيانات الجداول ‪.‬‬
‫‪moon‬‬

‫دوال التاريخ والتحويل‬

‫أھداف الفصل‬

‫في نھاية ھذا الفصل إن شاء ﷲ تكون قادر على ‪:‬‬


‫التعامل مع دوال التاريخ في ‪SQL‬‬ ‫‪-١‬‬
‫التعامل مع أدوات التحويل في ‪SQL‬‬ ‫‪-٢‬‬
‫‪moon‬‬

‫دوال التاريخ‬
‫الوفت ھو الحياة والتاريخ ھو أصل االمم لذا لتا لنتعمق في كيفية استخدام دوال التاريخ‬

‫الدالة ‪Sysdate‬‬

‫ھذه الدالة تقوم بإعطاء تاريخ اليوم الحالي أي التاريخ المخزن في جھاز الكمبيوتر الذي ينفذ عليه‬
‫ھذا األمر ويتم تخزين التاريخ وھمي يسمى ‪ Dual‬وھو موجود أصال داخل لغة أوراكل لذلك‬
‫يجب أن تتم عملية استدعاء التاريخ من ھذا الجدول‬

‫مثال‬

‫الستدعاء تاريخ اليوم الحالي نقوم باآلتي ‪:‬‬

‫;‪SELECT SYSDATE FROM DUAL‬‬

‫الدالة ‪NEXT_DAY‬‬

‫تستخدم ھذه الدالة لعرض التاريخ الذي يوافق التاريخ التالي للتاريخ المعطى‬
‫فعلى سبيل المثال إذا كان التاريخ الموجود ھو ‪ ٢٠٠٣/٧/٧‬وطلب من الجھاز تحديد اليوم الذي‬
‫يصادف يوم الجمعة من نفس الشھر فإنه يعطي ‪٢٠٠٣/٧/١١‬‬

‫الشكل العام‬
‫)‪NEXT_DAY (DATE,CHAR‬‬

‫حيث إن ‪ DATE‬ھو التاريخ المعطى والمراد إيجاد التاريخ لليوم الذي يليه من خالل وضع اسم‬
‫اليوم داخل المتغير ‪CHAR‬‬

‫مثال‬

‫;‪SELECT NEXT_DAY (‘7/7/2003’,’MONDAY’) FROM DUAL‬‬

‫نتيجة التنفيذ‬

‫‪NEXT_DAY‬‬
‫‪-------------------‬‬
‫‪11/7/2003‬‬
‫‪moon‬‬

‫دالة تحديد اليوم األخير من كل شھر ‪LAST_DAY‬‬

‫تقوم ھذه الدالة بتحديد آخر يم من كل شھر معطى‬

‫الشكل العام‬
‫)‪LAST_DAY (DATE‬‬

‫حيث أن ‪ DATE‬ھو تاريخ الجھاز أو تاريخ تقوم بإدخاله‬

‫مثال‬

‫;‪SELECT LAST_DAY (SYSDATE) FROM DUAL‬‬

‫بفرض أن تاريخ الھاز ‪ SYSDATE‬ھو‪ ٢٠٠٣/٢/٢‬فإن نتيجة للجملة السابقة ھي كما يلي ‪:‬‬

‫)‪LAST_DAY(SYSDATE‬‬
‫‪--------------------------------‬‬
‫‪28/2/2003‬‬

‫مالحظة‬
‫يمكنك أن تقوم بطرح تاريخ من تاريخ آخر كالمثال التالي‬

‫‪SELECT SYSDATE – HIRDATE FROM S_EMP‬‬

‫حيث ‪ HIRDATE‬حقل تاريخ ‪.‬‬

‫الدالة ‪MONTHES_BETWEEN‬‬

‫تستخدم ھذه الدالة لعرض مدة الفرق بين شھرين‬

‫الشكل العام‬
‫‪MONTHES_BETWEEN‬‬ ‫)‪(DATE1,DATE2‬‬

‫مثال‬

‫‪MONTHES_BETWEEN‬‬ ‫)’‪(’01-SEP-95’,’11-JAN-94‬‬

‫سيكون الناتج‬
‫‪1.9774194‬‬
‫‪moon‬‬

‫الدالة ‪ADD_ MONTHES‬‬

‫تستخدم ھذه الدالة إلضافة عدد من األشھر إلى التاريخ معطى‬

‫)‪ADD_MONTHES (DATE,M‬‬

‫حيث أن‬

‫التاريخ المعطى‬ ‫‪DATE‬‬


‫عدد االشھر‬ ‫‪M‬‬

‫مثال‬

‫)‪ADD_MONTHES (‘7-JAN-99’,6‬‬

‫عند التنفيذ سيكون الناتج‬

‫‪7-JUL-99‬‬

‫الدالة ‪ROUND‬‬

‫تستخدم ھذه الدالة لعرض اقرب بداية شھر أو سنه لتاريخ معين تحدده‬

‫مالحظة ‪:‬تستخدم ھذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحھا في باب الدوال الرقمية‬

‫الصيغة العامة‬

‫)‪ROUND (DATE, M|Y‬‬

‫حيث أن‬

‫التاريخ المعطى‬ ‫‪DATE‬‬


‫نكتب ‪ MONTH‬اذا اردنا ان يعود باقرب شھر‬ ‫‪M‬‬
‫نكتب ‪ YEAR‬اذا اردنا ان يعود باقرب سنة‬ ‫‪Y‬‬

‫مثال‬
‫)’‪ROUND (’07-MAY-96’, ‘MONTH‬‬
‫‪moon‬‬

‫عند التنفيذ سيكون الناتج‬

‫‪01-JUN-96‬‬

‫مثال‬
‫)’‪ROUND (’07-MAY-96’, ‘YEAR‬‬

‫عند التنفيذ سيكون الناتج‬


‫‪01-JAN-96‬‬

‫الدالة ‪TRANCATE Function‬‬

‫تستخدم ھذه الدالة لعرض تاريخ اول يوم في شھر أو سنه لتاريخ معين تحدده‬

‫مالحظة ‪:‬تستخدم ھذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحھا في باب الدوال الرقمية‬

‫الصيغة العامة‬

‫)‪TRUNC (DATE, M|Y‬‬


‫حيث أن‬

‫التاريخ المعطى‬ ‫‪DATE‬‬


‫نكتب ‪ MONTH‬اذا اردنا ان يعرض تاريخ اول يوم في شھر‬ ‫‪M‬‬
‫التاريخ المحدد‬
‫نكتب ‪ YEAR‬اذا اردنا ان يعود ألول يوم لنفس سنة التاريخ‬ ‫‪Y‬‬

‫مثال‬

‫)’‪TRUNC (’07-MAY-96’, ‘MONTH‬‬

‫عند التنفيذ سيكون الناتج‬


‫‪01-MAY-96‬‬

‫مثال‬

‫)’‪TRUNC (’07-MAY-96’, ‘YEAR‬‬

‫عند التنفيذ سيكون الناتج‬


‫‪moon‬‬

‫‪01-JAN-96‬‬

‫دوال التحويل‬
‫يتم تحويل البيانات من شكل إلى اخر وتوجد دوال خاصة بالتحويل ومنھا‬

‫التحويل الى حروف ‪TO_CHAR‬‬ ‫‪-١‬‬


‫التحويل إلى أرقام ‪TO_NUMBER‬‬ ‫‪-٢‬‬
‫التحويل إلى تاريخ ‪TO_DATE‬‬ ‫‪-٣‬‬

‫الدالة ‪TO_CHAR‬‬ ‫‪-١‬‬

‫تستخدم ھذه الدالة لتحويل التاريخ او األرقام الى جملة حرفية حيث يتم تغيير شكل التاريخ او‬
‫االرقام من صورة إلى اخرى‬

‫اوال من تاريخ الى جملة حرفية‬

‫الشكل العام‬
‫)’‪TO_CHAR (DATE,’FMT‬‬

‫حيث أن‬

‫قيمة التاريخ‬ ‫‪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‬‬

‫‪ -٦‬اذا اردنا عرض الساعة نكتب ‪ HH24:MI:SS AM‬مثل ‪15:45:32 PM‬‬

‫ثانيا التحويل من أرقام الى جملة حرفية‬

‫الشكل العام‬

‫)’‪TO_CHAR (NUMBER,’FMT‬‬

‫حيث أن‬

‫‪ NUMBER‬الرقم‬
‫الصورة الجديدة‬ ‫‪FMT‬‬

‫مثال‬

‫)‪SELECT TO_CHAR (6500500,’$9,999,999‬‬


‫;‪FROM S_EMP‬‬

‫عند التنفيذ سيكون الناتج‬

‫)‪TO_CHAR (6500500,’$9,999,999‬‬
‫‪-----------------------------------‬‬
‫‪6,500,500‬‬

‫مالحظة‬
‫عندما نكتب ‪ 9‬فإننا نعني يھا خاتة رقم‬ ‫‪-١‬‬
‫عندما نكتب ) ‪ ( ,‬يتم طباعة الفاصلة‬ ‫‪-٢‬‬
‫عندما نكتب) ‪ ( .‬يتم طباعة الفاصلة العشرية‬ ‫‪-٣‬‬

‫الدالة ‪TO_NUMBER‬‬

‫تقوم ھذه الدالة بتحويل القيمة الرقمية المخزنة عى شكل حرف ‪ CHAR‬إلى قيمة رقمية فعليه‬
‫‪NUMBER‬‬

‫الشكل العام‬

‫)‪TO_NUMBER (VALUE‬‬

‫حيث‬
‫قيمة مخزنة على شكل أرقام حرفية سيتم عرضھا على شكل قيم رقمية‬ ‫‪VALUE‬‬
‫‪moon‬‬

‫مثال‬

‫لنفرض أن لدينا حقل اسمه ‪ NUM‬في جدول ‪ DATA‬به ارقام ولكنھا ارقام حرفيه أي انھا‬
‫تعامل معاملة الحروف فال تدخل في العمليات الحسابية فعند تنفيذ ھذه الدالة ستم تحويل القيم إلى‬
‫فيم رقمية يمكن ان تدخل في العمليات الحسابية‬

‫)‪SELECT NUM, TO_ NUMBER (NUM‬‬


‫;‪FROM DATA‬‬

‫عند التنفيذ سيكون الناتج‬

‫‪NUM‬‬ ‫)‪TO_NUMBER(NUM‬‬
‫‪----------------------------------------------------------------------------------------‬‬
‫‪9236‬‬ ‫‪9236‬‬
‫‪7526‬‬ ‫‪7526‬‬

‫مالحظة‬
‫العمودان بھما نفس القيم ولكن يوجد اختالف في النوع‬

‫الدالة ‪TO_DATE‬‬

‫تقوم ھذه الدالة بتحويل المتغير الحرفي داخل اشاؤة النص الى متعير بشكل تاريخ المثال التالي‬
‫يوضح ذلك ‪:‬‬
‫)’‪SELECT TO_DATE (‘JULY 7,2003’,’MONTH DD, YY‬‬
‫;‪FROM DUAL‬‬

‫عند التنفيذ سيكون الناتج‬

‫)’‪TO_DATE (‘JULY 7,2003’,’MONTH DD, YY‬‬


‫‪--------------------------------------------------------------‬‬
‫‪07-JUL-03‬‬

‫ملخص الفصل‬
‫تناولنا في ھذا الفصل دوال التاريخ الخاصة بالتعامل مع كامل الصيغ للتاريخ والوقت‬
‫واستعراضھا بعدة أشكالھا ثم تطرقنا دوال التحويل التي تعمل تحويل حاالت الكتابة من نص إلى‬
‫تاريخ و بالعكس كذلك من أرقام الى نص‬
‫‪moon‬‬

‫الدوال الرقمية‬
‫أھداف الفصل‬

‫في نھاية ھذا الفصل ان شاء ﷲ ستكن قادر على‬


‫التعامل مع دالة القيمة المطلقة‬ ‫‪-١‬‬
‫إيجاد الجذر التربيعي لألعداد‬ ‫‪-٢‬‬
‫التعامل مع الدالة األسية لألعداد‬ ‫‪-٣‬‬
‫تقريب األعداد العشرية من خالل ‪SQL‬‬ ‫‪-٤‬‬
‫تقريب األعداد من خالل حذف المنزلة العشرية‬ ‫‪-٥‬‬
‫إيجاد باقي القسمة لألعداد‬ ‫‪-٦‬‬
‫ايجاد اشارة األعداد السالبة‬ ‫‪-٧‬‬
‫‪moon‬‬

‫الدوال المطلقة واألسية واألسية والجذر التربيعي‬

‫دالة القيمة المطلقة ‪ABS Function‬‬

‫تستخدم ھذه الدالة إليجاد القيمة المطلقة لرقم معين وغالبا يتم استخدان ھذه الدالة مع جمل أخرى‬

‫الشكل العام‬

‫)‪ABS (COL|VALUE‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود )البيانات(‬ ‫‪VALUE‬‬

‫مثال‬

‫;‪SELECT name,job,hiredate-sysdate FROM S_EMP‬‬

‫عند التنفيذ سيتم طباعة‪:‬‬

‫‪name‬‬ ‫‪job‬‬ ‫‪hierdate-sysdate‬‬


‫‪-------------------- ----------------------------‬‬
‫‪ALI‬‬ ‫‪Salesman‬‬ ‫‪-6906.3252‬‬
‫‪AHMED‬‬ ‫‪Analyst‬‬ ‫‪-6841.3252‬‬
‫‪SAMI‬‬ ‫‪Manager‬‬ ‫‪-4592.3252‬‬
‫‪Khaled‬‬ ‫‪Manager‬‬ ‫‪-6555.3252‬‬

‫نالحظ أن قيم العمود ‪ hierdate-sysdate‬قيم سالبة ولكي نجعلھا دائما موجبة نأخذ القيمة‬
‫المطلقة لھذا العمود ونكتب‬

‫;‪SELECT name,job,ABS(hiredate-sysdate) FROM S_EMP‬‬

‫عند التنفيذ سيتم طباعة‪:‬‬


‫‪name‬‬ ‫‪job‬‬ ‫‪hierdate-sysdate‬‬
‫‪------------------------------------------------‬‬
‫‪ALI‬‬ ‫‪Salesman‬‬ ‫‪6906.3252‬‬
‫‪AHMED‬‬ ‫‪Analyst‬‬ ‫‪6841.3252‬‬
‫‪SAMI‬‬ ‫‪Manager‬‬ ‫‪4592.3252‬‬
‫‪Khaled‬‬ ‫‪Manager‬‬ ‫‪6555.3252‬‬
‫‪moon‬‬

‫الدالة األسية ‪POWER Function‬‬ ‫‪-٢‬‬

‫تستخدم ھذه الدالة إليجاد قيمة رقم مرفوع ألس‬

‫الشكل العام‬

‫)‪POWER (COL|VALUE,P‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود )البيانات(‬ ‫‪VALUE‬‬
‫قيمة األس‬ ‫‪P‬‬

‫مثال‬

‫;‪SELECT DIGIT, POWER (DIGIT1, 2) FROM DIGIT‬‬

‫عند التنفيذ سيتم طباعة‪:‬‬

‫‪DIGIT1‬‬ ‫)‪POWER (DIGIT1, 2‬‬


‫‪--------------------‬‬ ‫‪--------------------‬‬
‫‪20‬‬ ‫‪400‬‬
‫‪25‬‬ ‫‪625‬‬
‫‪25.5‬‬ ‫‪650.25‬‬
‫‪30.5‬‬ ‫‪930.25‬‬

‫دالة الجذر التربيعي ‪SQRT Function‬‬ ‫‪-٣‬‬

‫تستخدم ھذه الدالة إلياد الجذر التربيعي لرقم معين‬

‫الشكل العام‬

‫)‪SQRT (COL|VALUE‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫القيمة البديلة للعمود )البيانات(‬ ‫‪VALUE‬‬
moon

‫مثال‬

SELECT name,sal, SQRT (sal) FROM S_EMP;

:‫عند التنفيذ سيتم طباعة‬

NAME SAL SQRT (SAL)


------------------------------------------------
Ali 968 31.113
Ahmed 1936 44
SAMI 1512.5 38.9805
KHALED 3599.75 59.988
‫‪moon‬‬

‫دوال التقريب وباقي القسمة واإلشارة‬


‫دالة التقريب العشري ‪ROUND Function‬‬

‫تستخدم ھذه الدالة لتقريب العدد إلى اقرب رقم عشري أو صحيح‬

‫الشكل العام‬
‫)‪ROUND (COL|VALUE, N‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫قيمة عددية‬ ‫‪VALUE‬‬
‫عدد المواقع العشرية‬ ‫‪N‬‬

‫مثال‬

‫;‪SELECT SQRT (sal), ROUND (SQRT (sal), 2) FROM S_EMP‬‬

‫عند التنفيذ سيتم طباعة‪:‬‬

‫)‪SQRT (SAL‬‬ ‫)‪ROUND (SQRT (sal), 1‬‬


‫‪------------------------------------------------‬‬
‫‪31.113‬‬ ‫‪31.11‬‬
‫‪44‬‬ ‫‪44‬‬
‫‪38.9805‬‬ ‫‪38.98‬‬
‫‪59.988‬‬ ‫‪59.99‬‬

‫دالة التقريب بالحذف ‪TRANCATE Function‬‬

‫تستخدم ھذه الدالة لتقريب الرقم بحذف بعض المواقع العشرية‬

‫الشكل العام‬

‫)‪TRUNC (COL|VALUE,N‬‬

‫حيث أن‬

‫اسم الحقل أو العمود‬ ‫‪COL‬‬


‫قيمة عددية‬ ‫‪VALUE‬‬
‫عدد المواقع العشرية‬ ‫‪N‬‬
moon

‫مثال‬

SELECT DIGIT1, TRUNC (DIGIT1,-1),


TRUNC(POWER(DIGIT1,2),1) FROM DIGITS;

:‫عند التنفيذ سيتم طباعة‬

DIGIT1 TRUNC (DIGIT1, -1) TRUNC (POWER


(DIGIT1, 2), 1)
------------------------------------------------
20 20 400
25 20 625
25.5 20 650.2
30.5 30 930.2

MOD Function ‫دالة باقي القسمة‬

‫تستخدم ھذه الدالة إليجاد باقي قسمة عددين‬

‫الصيغة العامة‬
MOD (VALUE1, VALUE2)

‫حيث أن‬

‫قيمة عدد بة‬ VALUE1


‫قيمة عددية‬ VALUE2

‫مثال‬
SELECT DIGIT1, MOD (DIGIT1, 7) FROM DIGITS

:‫عند التنفيذ سيتم طباعة‬

DIGIT1 MOD (DIGI1, 7)


------------------------------------------------
20 6
25 4
25.5 4.5
30.5 2.5
‫‪moon‬‬

‫دالة اإلشارة ‪SIGN Function‬‬

‫تستخدم ھذه الدالة لفحص إشارة الرقم فإذا كانت اإلشارة موجبة تعود بالقيمة )‪ (١‬أما اذا كانت‬
‫اإلشارة سالبة فتعود بالقيمة )‪(-١‬‬

‫الشكل العام انظر المثال التالي ‪:‬‬

‫مثال‬

‫‪SELECT DIGIT1, SIGN (DIGIT1) FROM DIGITS‬‬

‫‪DIGIT1‬‬ ‫)‪MOD (DIGI1, 7‬‬


‫‪------------------------------------------------‬‬
‫‪20‬‬ ‫‪1‬‬
‫‪25‬‬ ‫‪1‬‬
‫‪25.5‬‬ ‫‪1‬‬
‫‪30.5‬‬ ‫‪1‬‬
‫‪-50‬‬ ‫‪-1‬‬
‫‪-30.5‬‬ ‫‪-1‬‬

‫ملخص الفصل‬

‫تناولنا في ھذا الفصل الدوال الرقمية في لغة االستعالم واالستفھام في نظام قواعد البيانات‬
‫اوراكل وقد قسمنا ھذه الدوال حسب وظائفھا فمنھا مايتعامل مع سجل أو صف من البيانات‬
‫ومنھا مايتعامل مع مجموعة من السجالت ‪ RECORDS‬او األعمدة ‪ )COLUMNS‬الحقول(‬
‫حيث تطرقنا الى دالة القيمة المطلقة والدالة االسية والجذر التربيعي وكذلك دوال التقريب ودالة‬
‫باقي القسمة واالشارة‬
‫‪moon‬‬

‫استرجاع البيانات‬
‫أھداف اافصل‬

‫ان شاء ﷲ بعد دراسة ھذا الفصل ستكون قادر على‬

‫‪ -١‬استرجاع البيانات من أكثر من جدول‬


‫‪ -٢‬استرجاع البيانات بأسماء مستعارة‬
‫‪moon‬‬

‫استرجاع البيانات من أكثر من جدول‬


‫نستطيع استرجاع بيانات من أكثر من جدول اذا كان بينھم عالقة ‪ Relation‬حيث كل صف من‬
‫احدھما يرتبط مع صف من االخر عن طريق حقل مشترك‬

‫وتوجد عدة أنواع للربط ‪:‬‬

‫‪EQUAI JOIN-١‬‬

‫الصيغة العامة‬

‫‪SELECT table.column, table.column‬‬


‫‪FROM table1, table2‬‬
‫;‪WHERE table1.column1 = table2.column2‬‬

‫حيث نكتب بعد ‪ SELEST‬االعمدة التي نريد ظھورھا والحظ كذلك أنه من الضروري كتابة‬
‫االعمدة التي عن طريقھا تم الربط)التي يتساوى فيھا الحقول في الجدولين( ونكتب بعد كلمة‬
‫‪ WHERE‬العمودان اللذان تم ربط الجدولين عن طريقھما‬

‫مالحظة‬
‫نكتب اسم الجدول اوال ثم اسم العمود وبينھما نقطه ‪table.column‬‬
moon

‫مثال‬

SELECT S_EMP.DEPT_ID, S_EMP.LAST_NAME,S_DEPT.NAME


FROM S_EMP, S_DEPT
WHERE S_EMP.DEPT_ID = S_DEPT.ID;

: ‫عند التفيذ ينتج‬

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

‫ فنكتب‬AND ‫ وذلك باستخدام‬WHERE ‫ويمكن اضافة شرط اخر بعد‬

SELECT S_EMP.DEPT_ID, S_EMP.LAST_NAME,S_DEPT.NAME


FROM S_EMP, S_DEPT
WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_DEPT = 41;
moon

: ‫عند التفيذ ينتج‬

DEPT_ID L A S T_ N A M E NAME
------------------------------------------------
41 NGAO OPERATOPNS
41 URGIHART OPERATOPNS

NON- EQUAI JOIN-٢

‫يستخدم ھذه النوع عندما ال يوجد اعمدة مشتركة بين الجدولين‬

‫مثال‬
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-٣

‫يستخدم ھذا النوع لرؤية السجالت في الجدول الثاني التي ال يقابلھا سجالت في الجدول األول‬

‫الصيغة العامة‬

SELECT table.column, table.column


FROM table1, table2
WHERE table1.column(+) = table2.column;

‫مالحظة‬
‫( في ھذا النوع من الربط حيث نكتبه بجوار االسم الحقل الذي ال يحتوي على‬+) ‫نسنخدم المعامل‬
‫قيمة‬
moon

‫مثال‬

‫اذا اردنا االستعالم عن الجزء الذي ال يتواجد به موظف نكتب‬

SELECT s_emp.last_name, s_emp.id, ,


s_customer.name
FROM s_emp, s_customer
WHERE s_emp.id (+) = s_customer.sales_rep_id
ORDER BY s_emp.id;

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;

‫عند التنفيذ سيتم طباعة‬

worker.last_name||' works for '||


manager.last_name
------------------------------------------------
Nago works for Velasquez
Nagayama works for Velasquez
Ropeburn works for Velasquez
Urguhart works for Nago
Biri works for Nago
Magee works for Nagayama
Giljum Nagayama
‫‪moon‬‬

‫استرجاع البيانات بأسماء مستعارة‬

‫في اخر مثال قمنا باستدعاء الجدول ‪ s_emp‬باسم مستعار ‪ worker‬ومرة أخرى ياسم‬
‫‪ manager‬وھذا االسم يقوم محل اسم الجدول وقد استخدمناه للتسھيل‬

‫مثال‬

‫‪SELECT‬‬ ‫‪e.ename, e.job, e.sal, s.grade‬‬


‫‪FROM‬‬ ‫‪S_EMP e, salgrade s‬‬
‫‪WHERE‬‬ ‫;‪e.sal BETWEEN s.losal AND s.hisal‬‬
‫مثال‬

‫‪SELECT‬‬ ‫‪e.last_name, e.id, c.name‬‬


‫‪FROM s_S_EMP e, s_customer c‬‬
‫‪WHERE‬‬ ‫‪e.id (+) = c.sales_rep_id‬‬
‫;‪ORDER By e.id‬‬

‫تناولنا في ھذا الفصل جمل ‪ SQL‬الخاصة باسترجاع بيانات من اكثر من جدول كعرض رقم‬
‫اقسام الموظفين من جدول الموطفين وتطرقنا كذلك إلى عملية استرجاع البيانات من خالل اسم‬
‫مستعار‬
‫‪moon‬‬

‫الدوال الرياضية واإلحصائية ودوال المجموعات‬

‫أھداف الفصل‬

‫في نھاية ھذا الفصل ان شاء ﷲ ستكون قادر على ‪:‬‬


‫‪ -١‬التعامل مع الدوال الرياضية واالحصائية‬
‫‪ -٢‬التعامل مع دوال المجموعات‬
‫‪moon‬‬

‫الدوال الرياضية واإلحصائية‬

‫ھناللك مجموعة من االقترانات الرياضية واالحصائية التي تتعامل مع مجموعة من السجالت‬


‫إلخراج قيمة واحدة محدودة ومن ھذه االقترانات مايلي‪:‬‬

‫‪ -١‬دالة العد ‪COUNT‬‬


‫‪ -٢‬دالة أكبر قيمة‪MAX‬‬
‫‪ -٣‬دالة أصغر قيمة ‪MIN‬‬
‫‪ -٤‬دالة المجموع ‪SUM‬‬
‫‪ -٥‬دالة المتوسط الحسابي ‪AVG‬‬
‫‪ -٦‬دالة االنحراف المعياري ‪STDDEV‬‬
‫‪ -٧‬دالة المعيار ‪VARIANCE‬‬
‫دالة العد ‪COUNT‬‬ ‫‪-١‬‬

‫تقوم ھذه الدالة بعملية حصر الحقول في عمود معين والتي ال تحمل القيمة ‪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‬‬ ‫‪-٢‬‬

‫تقوم ھذه الدالة بعرض أكبر قيمة موجودة في عمود معين‬

‫الشكل العام‬

‫)‪MAX (DISTINCT|ALL|EXP‬‬

‫مثال‬
‫‪moon‬‬

‫;‪SELECT MAX (DISTINCT salary) FROM S_EMP‬‬

‫تقوم ھذه الجملة بعرض أكبر راتب في جدول الموظفين ‪S_EMP‬‬

‫دالة أكبر قيمة ‪MIN‬‬ ‫‪-٣‬‬

‫تقوم ھذه الدالة بعرض أكبر قيمة موجودة في عمود معين‬

‫الشكل العام‬

‫)‪MIN (DISTINCT|ALL|EXP‬‬

‫مثال‬
‫;‪SELECT MIN (DISTINCT salary) FROM S_EMP‬‬

‫تقوم ھذه الجملة بعرض أصغر راتب في جدول الموظفين ‪S_EMP‬‬

‫دالة المجموع ‪SUM‬‬ ‫‪-٤‬‬

‫تقوم ھذه الدالة بعرض مجموع القيم الموجودة في حقل او عمود معين‬

‫)‪SUM (DISTINCT|ALL|EXP‬‬

‫مثال‬
‫;‪SELECT SUM (salary) FROM S_EMP‬‬

‫تقوم ھذه الجملة بعرض مجموع رواتب الموظفين في جدول الموظفين ‪S_EMP‬‬

‫دالة المتوسط الحسابي ‪AVG‬‬ ‫‪-٥‬‬

‫تقوم ھذه الدالة بعرض المعدل لمجموعة قراءات قد تكون موجودة في جدول معين‬

‫الشكل العام‬

‫)‪AVG (COLUMN‬‬

‫‪ COLUMN‬ھو اسم العمود الموجود في جدول معين‬

‫مثال‬
‫‪moon‬‬

‫;‪SELECT AVG (SALARY) FROM S_EMP‬‬

‫تقوم ھذه الجملة بحساب المتوسط الحسابي لمرتبات الموظفين‬

‫دالة االنراف المعياري ‪STDDEV‬‬ ‫‪-٦‬‬

‫تقوم ھذه الدالة بإيجاد االنحراف المعياري لمجموعة مشاھدات أو قراءات‬

‫الشكل العام‬
‫)‪STDDEV (DISTINCT|ALL‬‬

‫مثال‬
‫إلبجاد االنحراف المعياري لألرقام الواردة في حقل الرواتب في جدول الموظفين ‪S_EMP‬‬

‫;‪SELECT STDDEV (SALARY) FROM S_EMP‬‬

‫دالة المعيار ‪VARIANCE‬‬ ‫‪-٧‬‬

‫تقوم ھذه الدالة بإيجاد المعيار لمجموعة مشاھدات أو قراءات‬

‫مثال‬
‫;‪SELECT VARIANCE (SALARY) FROM S_EMP‬‬
‫‪moon‬‬

‫دوال المجموعات‬

‫ھي عبارة عن جميع الدوال السابقة او أي دوال اخرى ولكن باستخداماھا مع الدالة‬
‫‪ GROUP BY‬ممايؤدي إلى تجزئة الجدول الرئيسي إلى مجموعات اصغر منه حسب شرط‬
‫مغين‬

‫الشكل العام‬
‫‪GROUP BY COL_NAME‬‬

‫ھو اسم العمود في الجدول والذي سيتم تقسيم‬ ‫‪COL_NAME‬‬


‫الجدول إلى مجموعات صغيرة بناء غليه‬

‫ولفھم ھذه الدالة ننظر الى المثال التالي‬

‫اذا كتبنا الجملة التالية‬


‫‪SELECT‬‬ ‫‪id, last_name, dept_id DEPARTMENT‬‬
‫‪FROM s_emp‬‬
‫;‪WHERE dept_id = 41‬‬
‫فان المخرجات ھي‬

‫‪ID‬‬ ‫‪LAST_NAME‬‬ ‫‪DEPARTMENT‬‬


‫‪--‬‬ ‫‪---------‬‬ ‫‪----------‬‬
‫‪2‬‬ ‫‪Ngao‬‬ ‫‪41‬‬
‫‪6‬‬ ‫‪Urguhart‬‬ ‫‪41‬‬
‫‪16‬‬ ‫‪Maduro‬‬ ‫‪41‬‬
‫‪17‬‬ ‫‪Smith‬‬ ‫‪41‬‬

‫‪SELECT‬‬ ‫”‪dept_id, COUNT (*) ”Number‬‬


‫‪FROM s_emp‬‬
‫‪WHERE‬‬ ‫‪dept_id = 41‬‬
‫;‪GROUP BY dept_id‬‬

‫‪DEPT_ID Number‬‬
‫‪------- ------‬‬
‫‪41‬‬ ‫‪4‬‬
‫نالحظ ظھور سطر واحد من البيانات للقسم ‪ ٤١‬فالدالة ‪ GROUP BY‬قامت بتجميع القسم ‪٤١‬‬
‫مع بعضه )وكأنھا عملت جدول خاص بھا( وھذه واضح عندما استخدمنا دالة ‪COUNT‬‬
‫اظھرت ان عدد السجالت ‪ ٤‬رغم أن عدد االسطر ھو واحد‬
‫‪moon‬‬

‫الستخدام شرط مع دالة المجموعات نكتب االمر ‪HAVING‬‬


‫فيكون شكل جملة االستعالم كاالتي‬

‫‪SELECT‬‬ ‫‪column, group_functionFROM‬‬


‫]‪table[WHERE condition‬‬
‫‪[GROUP BY‬‬ ‫‪group_by_expression][HAVING‬‬
‫]‪group_condition‬‬
‫‪[ORDER BY‬‬ ‫;]‪column‬‬

‫اذا اردنا اظھر بيانات من جدول الموظفين ‪ EMP‬وعمل مجموعات بشرط أن تكون الوظيفة‬
‫‪MANAGER‬‬
‫)‪SELECT DEPTNO, JOB, COUNT (*), SUM (SAL‬‬
‫‪FROM S_EMP‬‬
‫‪GROUP BY DEPARTNO, JOB‬‬
‫;’‪HAVING JOB=’MANAGER‬‬

‫مثال‬
‫اذا اردنا اظھار بيانات من جدول الموظفين ‪ EMP‬وعمل مجموعات بشرط أن تكون الوظيفة‬
‫‪ MANAGER‬أو ‪ANALYST‬او ‪SALESMAN‬‬

‫)‪SELECT DEPTNO, JOB, COUNT (*), SUM (SAL‬‬


‫‪FROM S_EMP‬‬
‫‪GROUP BY DEPARTNO, JOB‬‬
‫;)’‪HAVING JOB IN (’MANAGER’,’ ANALYST’,’ SALESMAN‬‬

‫ملخص الفصل‬

‫ركزنا في ھذا الفصل على جمل ‪ SQL‬الخاصة بالدوال الرياضية واالحصائية التي تقوم بعرض‬
‫قيمة واحدة من البيانات مثل ‪ MAX,MIN,AVG‬وغيرھا ومن ثم دوال المجموعات التي‬
‫تكون غالبا مع االمر ‪ GROUP BY‬والتي تقوم بفرز الجدول الى جدول اصغر منه أو يساويه‬
‫‪moon‬‬

‫االستعالمات الفرعية‬
‫أھداف الفصل‬
‫في نھاية ھذا الفصل ان شاء ﷲ ستكون قادرعلى‬

‫تحديد الحاالت التي يمكن ان تستخدم فيھا االستعالمات الفرعية‬ ‫‪-١‬‬


‫تعريف االستعالمات الفرعية والمتداخلة‬ ‫‪-٢‬‬
‫معرفة أنواع االستعالمات الفرعية‬ ‫‪-٣‬‬
‫كتابة استعالم فرعي احادي الصف وآخر متعدد الصفوف‬ ‫‪-٤‬‬
‫‪moon‬‬

‫االستعالم الفرعي‬
‫مقدمة‬

‫لنفترض أنك ترغب في كتابة استعالم إليجاد بيانات الموظفين الذين تزيد رواتبھم عن راتب أحد‬
‫الموظفين‬
‫في ھذه الحالة تحتاج الى استعالمين‬
‫استعالم اليجاد راتب الموظف المعني‬ ‫‪-١‬‬
‫استعالم اليجاد الموظفين الذين تزيد رواتبھم عن المبلغ المحسوب في االستعالم األول‬ ‫‪-٢‬‬

‫ويمكنك دمج االستعالمين وذلك بتركيب احد االستعالمين في االخر ‪ ،‬االستعالم الداخلي سوف‬
‫يعود بقيمة )قيم( والتي يستخدمھا االستعالم الخارجي )الرئيسي(‬
‫إن استخدام االستعالمات الفرعية يشبه تماما تنفيذ االستعالمين بشكل متتال واستالم نتيجة‬
‫االستعالم االول كنتيجة بحث في االستعالم الثاني‬

‫تعريف االستعالم الفرعي‬

‫ھو جملة استفسار ‪ SELECT‬مضمنة داخل جملة استفسار رئيسية السترجاع قيمة أو مجموعة‬
‫من القيم ليتم استخدامھا في االستعالم الرئيسي انظر الشكل التالي‬

‫الشكل العام‬

‫‪SELECT select_listFROM tableWHERE expr operator‬‬


‫‪(SELECT‬‬ ‫‪select_list‬‬
‫‪FROM‬‬ ‫;)‪table‬‬

‫االستعالم الداخلي)الفرعي( ينفذ اوال‬ ‫‪-١‬‬


‫ناتج االستعالم الداخلي)الفرعي( يستخدم في االستعالم الرئيسي‬ ‫‪-٢‬‬
‫‪moon‬‬

‫متطلبات االستعالم الفرعي‬

‫وضع االستعالم الفرعي بين قوسين )‪(.......‬‬ ‫‪-١‬‬


‫‪.‬وضع االستعالم الفرعي يمين عملية المقارنة‬ ‫‪-٢‬‬
‫ال يمكن استخدام ‪ ORDER BY‬داخل االستعالم الفرعي‬ ‫‪-٣‬‬
‫استخدام المعامالت أحادية الصف مع االستعالمات الفرعية األحادية الصف‬ ‫‪-٤‬‬
‫استخدام المعامالت متعددة الصف مع االستعالمات الفرعية المتعددة الصف‬ ‫‪-٥‬‬
‫‪moon‬‬

‫أنواع االستعالمات الفرعية‬


‫يمكن تصنيف االستعالم الفرعي حسب‬

‫استعالم فرعي أحادي الصف يسترجع صفا واحدا‬ ‫‪-١‬‬


‫استعالم فرعي متعدد الصفوف يسترجع أكثر من صف واحد‬ ‫‪-٢‬‬
‫استعالم فرعي متعدد األعمدة يسترجع اكثر من عمود‬ ‫‪-٣‬‬

‫استعالم فرعي أحادي الصف يسترجع صفا واحدا‬ ‫‪-١‬‬

‫نستخدم ھذا االستعالم في حالة ان االستعالم الفرعي ال يعود اال بسطر واحد انظر الى المثال‬
‫التالي‬

‫‪SELECT‬‬ ‫‪last_name, title, salary‬‬


‫‪FROM s_emp‬‬
‫< ‪WHEREsalary‬‬
‫)‪(SELECT AVG(salary‬‬
‫‪FROM‬‬ ‫;)‪s_emp‬‬
‫توسط الحسابي ويأخذ‬
‫االستعالم الرئيسي ھذه القيمة ويستخرج اسماء وورواتب الموظفين الذين يعتبر راتبھم اعلى من‬
‫المتوسط الحسابي‬

‫مالحظة‬
‫‪ -١‬أنواع معامالت المقارتة الخاصة بھذا النوع ھي‬
‫>< ‪>, <, <=, >=.‬‬

‫استعالم فرعي متعدد الصفوف يسترجع أكثر من صف واحد‬ ‫‪-٢‬‬


‫نستخدم ھذا االستعالم في حالة ان االستعالم الفرعي يعود بعدة اسطر انظر المثال التالي‬

‫‪SELECT‬‬ ‫‪last_name, first_name, title‬‬


‫‪FROM s_emp‬‬
‫‪WHERE dept_in IN‬‬
‫‪(SELECT ID‬‬
‫‪FROM‬‬ ‫‪s_dept‬‬
‫'‪WHERE name = 'Finance‬‬
‫;)‪OR region_id = 2‬‬
‫‪moon‬‬

‫يقوم االستعالم الفرعي في ھذا المثال ياستخراج أرقام الموظفين الذين اسمھم '‪'Finance‬‬
‫او رقم منطقتھم ‪ ٢‬من جدول االقسام فھذا االستعالم سيعود بعدة فيم يأخذھا االستعالم الرئيسي‬
‫ويستخرج اسماء الموظفين على اساسھا‬

‫مالحظة‬
‫أنواع معامالت المقارتة الخاصة بھذا النوع ھي‬ ‫‪-١‬‬
‫‪IN, ALL, ANY‬‬
‫اذا استخدمنا معامالت االستعالم احادي الصف مع استعالم متعدد فان البرنامج يعطيك‬ ‫‪-٢‬‬
‫رسالة خطأ‬
‫‪ORA-01427:single-row sub query returns more‬‬
‫‪than one row‬‬

‫ملخص الفصل‬

‫في ھذا الفصل تعرفنا على االستعالمات الفرعية واھميتھا وشروطھا وانواعھا األحادية‬
‫والمتعددة‬
‫‪moon‬‬

‫أھداف الفصل‬

‫في نھابة ھذا الفصل ستكون قادر انشاء ﷲ على مايلي‪:‬‬


‫التعرف على الجداول وشروط تسميتھا‬ ‫‪-١‬‬
‫التعرف على أنواع البيانات‬ ‫‪-٢‬‬
‫إنشاء الجداول بواسطة األمر‪CREAT E‬‬ ‫‪-٣‬‬
‫إنشاء مفتاح أساسي في الجدول‬ ‫‪-٤‬‬
‫إنشاء جدول بواسطة جدول اخر‬ ‫‪-٥‬‬
‫عرض مواصفات الجدول‬ ‫‪-٦‬‬
‫‪moon‬‬

‫تعريف الجدول‬
‫قلنا سايقا أن الجدول أو الملف يتكون من مجموعة من السجالت ‪ RECORDS‬وكل سجل‬
‫يتكون من مجموعة من الحقول ‪ FIELDS‬كل حقل به مجموعة من الحروف او االرقام وھذه‬
‫الحقول لھا طول أو عرض‬

‫ويعرف الملف أو الجدول بأنه مجموعة من األعمدة ويمثل كل عمود بحقل من الحقول ولكل حقل‬
‫نوع بياناته‬

‫تسمية الجدول‪/‬ملف ‪TABLE/FILE NAMES‬‬

‫ال يتجاوز طول اسم الجدول أو الملف عن ‪ ٣٠‬حرف‬ ‫‪-١‬‬


‫يمكن ان يكون حروفا كبيرة أو صغيرة‬ ‫‪-٢‬‬
‫االسم يبدأ بحرف وال يمكن أن يبدأ برقم‬ ‫‪-٣‬‬
‫يمكن أن يحتوي االسم على رموز خاصة مثل ‪ .... #,$,%‬الخ‬ ‫‪-٤‬‬

‫أنواع الحقول ‪Fields Types‬‬

‫المتغير الحرفي ‪CHAR‬‬ ‫‪-١‬‬

‫يتكون ھذا الحقل من الحروف األبجدية ‪ ،‬األرقام ‪ ،‬والرموز الخاصة ‪ .‬وطول أو عرض ھذا‬
‫الحقل يصل الى ‪ ٢٤٠‬حرف وال بد من تحديد طول أو عرض الحقل وھو اجباري واذا لم يتم‬
‫التحديد سيفترض البرنامج انه ‪١‬‬

‫الشكل العام‬
‫)‪var CHAR (size‬‬

‫مثال‬
‫)‪FirstName CHAR (20‬‬

‫المتغير الحرفي ‪VARCHAR2‬‬ ‫‪-٢‬‬

‫يتكون ھذا الحقل من الحروف األبجدية ‪ ،‬األرقام ‪ ،‬والرموز الخاصة ‪ .‬وطول أو عرض ھذا‬
‫الحقل يصل الى ‪ ٢٤٠‬حرف ال يوجد طول افتراضي للحقل‬

‫مثال‬
‫)‪FirstName VARCHAR2 (20‬‬
‫‪moon‬‬

‫‪ -٣‬متغير رقمي صحيح ‪Integer Number‬‬

‫ويتكون من األرقام )‪ (0,1,2-9‬واالشارة ‪ +‬أو _ ويمكن أن يحتوي على العالمة العشرية أو‬
‫الفاصلة العشرية ) ‪ (.‬والحد األقصى لعدد خانات الرقم يصل إلى ‪ ٤٠‬خانة وتحديد طول‬
‫أوعرض الحقل اختياري وكذلك االشارة أو الفاصلة العشرية‬

‫مثال‬
‫)‪Serial_No NUMBER (10‬‬

‫‪ -٤‬المتغير الرقمي ذو العالمة العشرية‬

‫ويتكون من األرقام )‪(0,1,2-9‬‬

‫مثال‬
‫)‪Mark NUMBER (10,3‬‬

‫متغير طويل ‪LONG‬‬ ‫‪-٥‬‬


‫يستخدم للحقول التي تحتوي على بيانات تصل مساحتھا الى ‪ ٢‬جيجا‬
‫مثال‬
‫‪Detail LONG‬‬

‫المتغير الدال على التاريخ )‪(Date‬‬ ‫‪-٦‬‬

‫يتكون ھذا الحقل من مجموعة األرقام للداللة على اليوم والشھر والسنة وطول ھذا الحقل ‪٨‬‬
‫خانات على األقل ويمكن أن يتغير شكل كتابة التاريخ بذكر اسم الشھر‬

‫مثال‬
‫‪HireDate DATE‬‬
‫‪moon‬‬

‫إنشاء جدول‬
‫إنشاء جدول باستخدام أمر ‪CREATE‬‬

‫الشكل العام‬

‫‪CREATE TABLE table-name (field type [(size [,‬‬


‫;)]‪field2 type [(size‬‬

‫حيث ان‬

‫اسم الملف أو الجدول المطلوب‬ ‫‪table-name‬‬


‫اسم الحقل أو الحقول المطلوب تصميمھا مع وجود اسم حقل على األقل‬ ‫‪field1,field2‬‬
‫نوع حقل البيانات‬ ‫‪type‬‬
‫طول او عرض الحقل‬ ‫‪Size‬‬

‫مثال‬
‫( ‪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‬‬ ‫•‬

‫الشكل العام‬

‫]‪column [CONSTRAINT constraint_name‬‬


‫‪constraint_type,‬‬

‫اسم التقييد‬ ‫‪constraint_name‬‬


‫نوع التقييد‬ ‫‪constraint_type‬‬
‫‪moon‬‬

‫‪ -١‬غير فارغ ‪NOT NULL‬‬

‫ھذا األمر ال يسمح بترك حقل فارغ‬

‫مثال‬
‫‪CREATE TABLE friend...‬‬
‫‪phone VARCHAR2(15) NOT NULL,...‬‬
‫)‪last_name VARCHAR2(25‬‬
‫‪CONSTRAINT friend_last_name_nn NOT NULL,...‬‬

‫‪ -٢‬فريد ‪UNIQUE‬‬

‫ھذا األمريجعل الحقل )العمود( فريد فال يسمح بتكرار صف من الصفوف فكل صف ال يوجد اال‬
‫مرة واحدة‬

‫مالحظة‬
‫‪ -١‬يمكن أن يحتوي الحقل الفريد ‪ UNIQUE‬على قيمة فارغة بشرط أن يكون حقل واحد فقط‬
‫فريد ‪UNIQUE‬‬
‫‪ -٢‬وبمكن أن يوجد في الجدول أكثر حقل فريد‬

‫مثال‬

‫‪... phone‬‬ ‫)‪VARCHAR2(10‬‬


‫‪CONSTRAINT s_emp_phone_uk UNIQUE,...‬‬

‫‪ -٣‬مفتاح أساسي ‪Primary Key‬‬

‫ال يمكن ألي جدول أن يحتوي اال على مفتاح أساسي واحد وإذا قمنا بتحويل حقل الى مفتاح‬
‫أساسي فھذا الحقل يعتبر حقل فريد ولكن ال يمكن أن يحتوي على قيم فارغة‬

‫مثال‬

‫‪... id‬‬ ‫)‪NUMBER(7‬‬


‫‪CONSTRAINT s_emp_id_pk PRIMARY KEY,...‬‬

‫يمكن تعيين حقل )عمود( واحد أو أكثر ليكون مفتاح خارجي حيث يكون ھذا العمود مرتبط‬
‫بعمود اخر به مفتاح اساسي او فريد من نفس الجدول أو جدول اخر ومن الضروري أن يكون‬
‫مرتبط بقيمة اخرى من عمود اخر او يكون فارغ‬
‫انظر المثال التالي‬
‫‪moon‬‬

‫)‪... dept_id NUMBER(7‬‬


‫‪CONSTRAINT s_emp_dept_id_fk‬‬
‫)‪FOREIGN KEY (department_id‬‬
‫)‪REFERENCES s_dept(id‬‬
‫;‪ON DELETE CASCADE‬‬

‫‪Foreign Key -١‬‬


‫تكتب بجوارھا اسم الحقل المراد أن يكون مفتاح خارجي في الجدول االبن‬
‫‪REFERENCES -٢‬‬
‫نكتب بجوارھا الحقل الذي سيتم الربط به من الجدول االخر‬

‫‪ON DELETE CASCADE -٣‬‬


‫اذا تم مسح احد الصفوف في الجدول االب سيمسح الصف المقابل له في الجدول االبن‬

‫انشاء جدول بواسطة جدول آخر‬

‫إلنشاء جدول بواسطة جدول آخر يجب أن يكون الجدول اآلخر منشأ مسبقا ثم نكتب األمر‬
‫كالتالي‬

‫الشكل العام‬

‫‪CREATE TABLE tablename‬‬


‫;‪[column(, column...)]AS Select statement‬‬

‫مثال‬

‫‪CREATE TABLE EMPLOYEE‬‬


‫‪AS‬‬
‫‪SELECT NAME, SAL, JOB FROM S_EMP‬‬

‫قمنا في ھذه الجملة بعمل جدول جديد ثم نقلنا بيانات الجدول ‪ S_EMP‬اليه‬

‫انشاء جدول بواسطة استعالم فرعي‬

‫إلنشاء جدول بواسطة استعالم فرعي يجب أن يكون االستعالم الفرعي قائم على االستعالم من‬
‫جدول منشأ مسبقا ثم نكتب األمر كالتالي‬
‫‪moon‬‬

‫الشكل العام‬

‫‪CREATE TABLE tablename‬‬


‫;‪[column(, column...)]AS subquery‬‬

‫مثال‬

‫‪CREATE TABLE‬‬ ‫‪emp_41‬‬


‫‪AS‬‬
‫‪SELECT‬‬ ‫‪id, last_name, userid, start_date‬‬
‫‪FROM‬‬ ‫‪s_emp‬‬
‫‪WHERE‬‬ ‫;‪dept_id = 41‬‬

‫جملة عرض مواصفات جدول ‪DESCIRBE‬‬

‫تستخدم ھذه الجملة لغرض مواصفات الجدول ويمكن كتابتھا كلمة كاملة أو مختصرة ‪DESC‬‬

‫الشكل العام‬
‫;‪DESCRIBE tablename‬‬

‫مثال‬
‫;‪DESCRIBE S_EMP‬‬

‫ملخص الفصل‬

‫في ھذا الفصل قمنا بالتعرف على الجداول وأنواع التقييد وكيفية إنشائھا وإدراج المفتاح‬
‫األساسي والخارجي في الجدول وكيفية انشاء جدول من جدول اخر وكذلك من استعالم فرعي‬
‫ومعرفة كيفية عرض معلومات الجدول‬
‫‪moon‬‬

‫تعديل بنية الجدول وحذفه‬


‫أھداف الفصل‬

‫في نھاية ھذا الفصل ستكون قادر ان شاء ﷲ على‪:‬‬

‫التعرف على جميع عمليات التعديل على الجدول‬ ‫‪-١‬‬


‫إضافة حقول جديدة إلى الجدول‬ ‫‪-٢‬‬
‫تعديل مواصفات حقول الجدول‬ ‫‪-٣‬‬
‫حذف المفتاح األساسي من الجدول‬ ‫‪-٤‬‬
‫حذف الجدول‬ ‫‪-٥‬‬
‫‪moon‬‬

‫تعديل الجداول‬
‫تتيح لك الـ‪ SQL‬عملية تعديل الجدول بعد إنشائه في الحاالت التالية‬

‫اضافة حقل جديد‬ ‫‪-١‬‬


‫تعديل مواصغات حقل‬ ‫‪-٢‬‬
‫حذف المفتاح األساسي من الجدول‬ ‫‪-٣‬‬
‫ويجب االنتباه الى عدم إمكانية حذف حقل من الجدول‬

‫جملة تعديل الحقول ‪ALTER Command‬‬

‫تستخدم ھذه الجملة إلضافة حقول أو لتعديل الحقول في الجدول ويشمل ھذا التعديل اسم الحقل‬
‫ونوعه الحقل وحجم بياناته أو الحاق عبارة فارغ أو غير فارغ الى الحقل‬

‫اضافة حقل جديد‪New Field‬‬

‫الشكل العام‬

‫‪ALERT TABLE tablename ADD (field Type (size) [NOT‬‬


‫)]‪NULL] | [NULL‬‬

‫حيث أن‬
‫اسم الجدول المراد تعديله‬ ‫‪tablename‬‬
‫اسم الحقل‬ ‫‪field‬‬
‫نوع البيانات‬ ‫‪Type‬‬
‫طول أو حجم الحقل‬ ‫‪size‬‬

‫تعديل مواصفات حقل‬

‫يمكن عن طريق جملة ‪ ALTER‬تعديل مواصفات حقل‬

‫الشكل العام‬

‫‪ALERT TABLE tablename MODIFY Type (size) [NOT‬‬


‫)]‪NULL] | [NULL‬‬
‫‪moon‬‬

‫حذف الجداول‬
‫يمكن أن نحذف الجدول من قاعدة البيانات بواسطة األمر ‪ DROP TABLE‬بشرط أن تكون‬
‫مالك الجدول أو لك صالحية للحذف‬

‫الشكل العام ‪:‬‬


‫;‪DROP TABLE tablename‬‬

‫حيث‬
‫اسم الجدول المراد حذفه‬ ‫;‪tablename‬‬

‫حذف المفتاح األساسي‬

‫نكتب األمر التالي‬


‫‪ALTER TABLE tablename‬‬
‫;‪DROP PRIMARY KEY CASCADE‬‬

‫عبارة ‪ CASCADE‬ھنا اللغاء أي عالقة تعتمد على المفتاح األساسي‬

‫ملخص الفصل‬

‫في ھذا الفصل تناولنا عملية تعدبل الجداول من إضافة وتعديل قول الجدول مع عدم امكانية‬
‫حذف حقل موجود في الجدول وكذلك كيفية حذف المفتاح األساسي من الجدول وحذف الجدول‬
‫من قاعدة البيانات بواسطة االمر ‪DROP‬‬
‫‪moon‬‬

‫إدخال البيانات إلى الجداول‬


‫أھداف الفصل‬

‫إن شاء ﷲ في نھاية ھذا الفصل ستكون قادر على‬

‫اإللمام بالطرق المختلفة إلدخال البيانات إلى الجدول‬ ‫‪-١‬‬


‫إدخال سجل واحد إلى جدول البيانات‬ ‫‪-٢‬‬
‫إضافة عدة سجالت الى الجدول‬ ‫‪-٣‬‬
‫‪moon‬‬

‫إضافة بيانات‬

‫مقدمة‬

‫لقد قمنا في الفصول السابقة بإنشاء الجداول والتعرف على أنواع البيانات وتعديل مواصفات‬
‫الحقول وبھذا نكون قد أنشأنا جدول البيانات وحددنا خصائص الحقول من حيث نوع البيانات‬
‫والحجم أي أننا أعددنا الوعاء الذي سيحوي البيانات وفي ھذا الفصل سنتعلم بمشيئة ﷲ كيفية‬
‫إضافة البيانات إلى ھذه الجداول واألمور المتعلقة بعمليات اإلضافة وأنواعھا ‪ ،‬كما أن ھذا‬
‫الفصل يشكل مدخال وجزأ أساسيا للغة تناول البيانات )‪ (DML‬في نظام قواعد بيانات أوراكل‬
‫التي تعتبر إحدى النظم القوية في نظم إدارة قواعد البيانات )‪ (DBMS‬لما لھا من أثر فعال في‬
‫معالجة البيانات داخل الجدول حيث تشمل لغة تناول البيانات )‪ (DML‬على األجزاء التالية ‪:‬‬

‫إدخال البيانات إلى الجداول ‪INSERT‬‬ ‫‪-١‬‬


‫تعديل البيانات في الجداول ‪UPDATE‬‬ ‫‪-٢‬‬
‫حذف البيانات من الجداول ‪DELETE‬‬ ‫‪-٣‬‬
‫في ھذا الفصل سنتاناول ادخال البيانات‬

‫إدخال البيانات إلى الجداول ‪INSERT‬‬

‫ھي العملية التي يتم بھا إدخال سجل ‪ /‬سجالت إلى جدول البيانات من خالل جملة ‪INSERT‬‬
‫وتتم ھذه العملية بعدة طرق‬

‫أوال ‪ :‬إضافة سجل واحد إلى جدول البيانات‬

‫الصيغة العامة‪:‬‬

‫‪INSERT INTO‬‬ ‫])]‪table [(column1 [, column2...‬‬


‫‪VALUES‬‬ ‫;)]‪(value1 [, value2...‬‬

‫حيث أن‬
‫اسم الجدول المراد إلحاق السجل به‬ ‫‪Table‬‬
‫اسماء األعمدة)الحقول( المطلوب إدخال البيانات إليھا‬ ‫‪Column1,Column2‬‬
‫القيم المطلوب إضافتھا في‬ ‫‪Value1, value2‬‬
‫حقول السجل الجديد وكل‬
‫قيمة يتم إدراجھا في الحقل‬
‫المناسب في القائمة وبالتالي‬
‫سيتم إضلفة القيمة‪ ١‬في الحقل‬
‫‪ ١‬وھكذا‬

‫الشرح‬
‫‪moon‬‬

‫بعد تنفيذ جملة اإلدخال بھذه الطريقة سوف يتم إضافة بيانات سجل واحد فقط في الجدول‬
‫المذكور يحتوي على قيم تم إ دراجھا في جملة اإلدخال وللحقول المذكورة فقط‬
‫القواعد التي يجب التقيد بھا في ھذه الطريقة‬

‫يجب أن يكون عدد القيم التي سيتم إدخالھا ھو نفس عدد الحقول المذكور في جملة‬ ‫‪-١‬‬
‫‪INSERT‬‬
‫يجب أن يكون نوع بيانات القيم التي سيتم إدخالھا من نفس نوع بيانات الحقول وأن‬ ‫‪-٢‬‬
‫تكون ھذه القيم مرتبة حسب ترتيب الحقول في جملة ‪INSERT‬‬
‫مثال‬

‫‪INSERT INTO s_dept‬‬


‫‪VALUES‬‬ ‫;)‪(11, 'Finance', 2‬‬
‫عند إدخال حقول التاريخ والنصوص يجب وضع القيم المدخلة بين عالمتي تنصيص‬ ‫‪-٣‬‬
‫مفردتين‬
‫يجب مراعاة وجوب إدخال قيم في الحقول اإلجبارية التي تم تعريفعا على أنھا ال تحتوي‬ ‫‪-٤‬‬
‫فراغ ‪ NOT NULL‬ويتم ادخال ‪ NULL‬في الحقول التي بھا فراغ‬

‫مثال‬
‫‪INSERT INTO s_dept‬‬
‫‪VALUES‬‬ ‫;)‪(13, 'Administration', NULL‬‬

‫يجوز عدم ذكر أسماء الحقول في جملة ‪ INSERT‬في حالة إدخال بيانات جميع‬ ‫‪-٥‬‬
‫الحقول لھذا السجل على أن تكون القيم المدخلة مرتبة حسب الترتيب االفتراضي للحقول في‬
‫الجدول عند بنائه‬

‫مالحظة‬
‫لمعرفة الترتيب االفتراضي للحقول في الجدول نستخدم األمر ‪DESC‬‬

‫مثال‬

‫ثانيا ‪ :‬اضافة عدة سجالت إلى جدول البيانات‬

‫من خالل ھذه الطريقة يمكن ادخال أكثر من سجل واحد إلى جدول البيانات عن طريق استخدام‬
‫متغيرات االدخال وھي عبارة عن متغيرات توضع في جملة االدخال بدال من القيم نفسھا ةيمكن‬
‫أن نطلق على ھذه الطريقة جملة االدخال متعددة السجالت‬

‫‪INSERT INTO‬‬ ‫])]‪table [(column1 [, column2...‬‬


‫‪VALUES‬‬ ‫;)]‪(&variable1 [,&variable1 ...‬‬
‫‪moon‬‬

‫حيث ان‬
‫اسم الجدول المراد إلحاق السجل به‬ ‫‪Table‬‬
‫اسماء األعمدة)الحقول( المطلوب إدخال البيانات إليھا‬ ‫‪Column1,Column2‬‬
‫متغيرات‬ ‫‪Variable1, Variable 2‬‬
‫اإلدخال التي‬
‫سوف يتم‬
‫استبدالھا بقيم‬
‫حقيقية بعد‬
‫تنقيذ جملة‬
‫االدخال‬

‫الشرح‬

‫بعد تنفيذ جملة بھذه الطريقة سوف يطلب منك إدخال القيم للمتغيرات المذكورة في جملة اإلدخال‬
‫وبعد االنتھاء من ادخال القيمة تضغط مفتاح ‪ ENTER‬من لوحة المفاتيح وھكذا حتى تنتھي من‬
‫إدخال حقول السجل األول وإلدخال سجل آخر يمكنك الضغط على حرف )‪ (R‬ثم مفتاح‬
‫‪ ENTER‬من لوحة المفاتيح وھو يعني تكرار اإلدخال لسجالت اخرى‬

‫مثال‬

‫‪INSERT INTO‬‬ ‫‪s_dept (id, name,‬‬


‫)‪region_id‬‬
‫‪VALUES‬‬ ‫‪(&department_id,‬‬
‫‪‘&department_name’,‬‬
‫;)‪&region_id‬‬
‫‪Enter value for department_id: 61‬‬
‫‪Enter value for department_name: Accounting‬‬
‫‪Enter value for region_id: 2‬‬

‫تنطبق على ھذه الطريقة جميع القواعد المذكورة في الطريقة األولى ويضاف إليھا مايلي ‪:‬‬
‫تستبدل القيم في جملة اإلدخال بمتغيرات‬ ‫‪-١‬‬
‫يعود اختيار أسماء المتغيرات إلى المستخدم مع مراعاة شروط تسمية المتغيرات‬ ‫‪-٢‬‬
‫يجب أن توضع عالمة & قبل متغير االدخال‬ ‫‪-٣‬‬
‫في جملة اإلدخال يمكن وضع عالمتى تنصيص مفردتين حول متغير االدخال الخاص‬ ‫‪-٤‬‬
‫بالحقول النصبة‬
‫‪moon‬‬

‫إضافة سجالت عن طريق نسخھا من جدول آخر‬

‫من خالل ھذه الطريقة يمكن إدخال أكثرمن سجل واحد إلى جدول البيانات عن طريق نسخ ھذا‬
‫السجل ‪ /‬السجالت من جدول آخر بواسطة جملة االستفسار ‪ SELECT‬حيث نستخدم جملة‬
‫‪ INSERT‬مع استعالم فرعي انظر الى المثال التالي‬

‫‪INSERT INTO history(id, last_name, salary, title,‬‬


‫)‪start_date‬‬
‫‪SELECT id, last_name, salary,title, start_date‬‬
‫‪FROM s_emp‬‬
‫;'‪WHERE start_date < '01-JAN-94‬‬

‫الشرح‬

‫بعد تنفيذ جملة اإلدخال بھذه الطريقة ينم نسخ السجالت التي تحقق الشرط من الجدول ا لمصدر‬
‫إلى الجدول الھدف وللحقول االمذكورة في جملة اإلدخال‬

‫القواعد التي يجب التقيد بھا في ھذه الطريقة‬


‫كتابة جملة اإلدخال ‪ INSERT‬محتوية على جملة استفسار ‪SELECT‬‬ ‫‪-١‬‬
‫تستبدل القيم في جملة اإلدخال بأسماء حقول الجدول المصدر‬ ‫‪-٢‬‬
‫عدم استخدم العبارة ‪VALUES‬‬ ‫‪-٣‬‬
‫يجب مراعاة وجوب إدخال قيم في الحقول االجبارية التي تم تعريفھا على أنھا ال تحتوي‬ ‫‪-٤‬‬
‫فراغ ‪NOT NULL‬‬
‫مطابقة الحقول بين الجدولين من حيث ترتيب الحقول ونوع البيانات وعدد الحقول‬ ‫‪-٥‬‬
‫‪moon‬‬

‫ملخص الفصل‬

‫تناولنا من خالل ھذا الفصل موضوع اضافة البيانات إلى الجداول بواسطة جملة ‪INSERT‬‬
‫وھنالك ثالثة طرق إلجراء عملية اإلضافة‬

‫أوال‪ :‬إضافة سجل واحد إلى جدو ل البيانات‬

‫بھذه الطريفة سوف يتم إضافة بيانات سجل واحد فقط إلى جدول يحتوي على القيم التي ستذكر‬
‫في جملة اإلدخال‬

‫ثانيا ‪ :‬إضافة عدة سجالت إلى جدول البيانات‬

‫بھذه الطريقة يمكن إدخال أكثر من سجل واحد إلى جدول البيانات عن طريق استخدام متغيرات‬
‫االدخال وھي عبارة عن متغيرات توضع في جملة اإلدخال بدال من القيم نفسھا ويمكن أن نطلق‬
‫على ھذه الطريقة جملة االدخال متعددة السجالت‬

‫ثالثا‪ :‬إضافة سجالت في جدول عن طريق نسخھا من جدول آخر‬

‫بھذه الطريقة يمكن إدخال أكثر من سجل واحد إلى جدول البيانات عن طريق نسخ ھذا السجل ‪/‬‬
‫السجالت من جدول آخر بواسطة جملة ‪ SELECT‬الموجودة بداخل جملة ‪INSERT‬‬
‫‪moon‬‬

‫تعديل وحذف بيانات الجداول‬


‫أھداف الفصل‬

‫بعد نھاية ھذا الفصل ستكون ان شاء ﷲ قادر على‬

‫اإللمام بالطرق المختلفة لتعديل البيانات في الجدول‬ ‫‪-١‬‬


‫إتقان تعديل بيانات سجل واحد أو أكثر في جدول البيانات‬ ‫‪-٢‬‬
‫إتقان تعديل بيانات جميع السجالت في جدول البيانات‬ ‫‪-٣‬‬
‫إتقان حذف سجل أو أكثر من جدول البيانات‬ ‫‪-٤‬‬
‫إتقان حذف جميع السجالت من جدول البيانات‬ ‫‪-٥‬‬
‫‪moon‬‬

‫تعديل بيانات الجدول‬

‫في ھذا الفصل سنتعلم كيفية تعديل البيانات وحذف السجالت كما أن ھذا الفصل يشكل جزأ‬
‫أساسيا مكمال للغة تناول البيانات ‪ DML‬في نظام أوراكل التي يعتبر احدى النظم القوية في نظم‬
‫إدارة قواعد البيانات ‪ DBMS‬لما لھا من أثر فعال في معالجة البيانات داخل الجدول حيث‬
‫تشتمل لغة تناول البيانات ‪ DML‬على االجزاء التالية‬

‫إدخال البيانات إلى الجداول ‪INSERT‬‬ ‫‪-١‬‬


‫تعديل البيانات في الجداول ‪UPDATE‬‬ ‫‪-٢‬‬
‫حذف البيانات من الجداول ‪DELETE‬‬ ‫‪-٣‬‬

‫ولقد تناولنا ادخال البيانات في الفصل السابق وسندرس تعديل البيانات وحذفھا في ھذا الفصل‬

‫تعديل البيانات في الجدول‬

‫ھي العملية التي يتم بھا تعديل بيانات حقل ‪ /‬حقول في سجل واحد أو اكثر في جدول البيانات من‬
‫خالل جملة ‪UPDATE‬وتتم ھذه العملية بطريقتين‪:‬‬

‫أوال‪ :‬تعديل بيانات حقل ‪ /‬حقول لسجل واحد أو اكثر‬

‫الصيغة العامة‬

‫‪UPDATE‬‬ ‫‪tableSET‬‬ ‫= ‪column1 = value [, column2‬‬


‫]‪value‬‬
‫‪[WHERE‬‬ ‫;]‪condition‬‬
‫حيث أن‬
‫اسم الجدول المراد تعديل البيانات فيه‬ ‫‪Table‬‬
‫اسماء الحقول)االعمده( المراد تعديل بياناتھا‬ ‫‪Column1,column2‬‬
‫القيم الجديدة التي سيتم‬ ‫‪Value1, value2‬‬
‫إعطاؤھا للحقول )االعمدة(‬
‫حقل ‪ ١‬وحقل ‪ ٢‬وبالتالي‬
‫فإن قيمة ‪ ١‬ستؤول الى الحقل‬
‫‪ ١‬وھكذا‬
‫جملة شرط تحدد السجالت‬ ‫‪Condition‬‬
‫التي سيتم تعديل بياناتھا ھي‬
‫السجالت التي تحقق الشرط‬

‫الشرح‬
‫بعد تنفيذ جملة التعديل بھذه الطريقة سوف يتم تعديل بيانات الحقل ‪/‬الحقول المذكورة بحيث يتم‬
‫إلغاء القيم الموجودة فيھا لتحتوي القيم الجديدة المذكورة في جملة التعديل علما بأن السجالت التي‬
‫سيتم تعديل بياناتھا ھي فقط السجالت التي تحقق الشرط في الجملة الشرطية‬
‫‪moon‬‬

‫القواعد التي يجب التقيد بھا في ھذه الطريقة‬


‫قد تكون القيمة الجديدة عبارة عن تعبير حسابي يعتمد على قيم الحقول في الجدول‬ ‫‪-١‬‬
‫قد تكون القيمة الجديدة ناتجة عن جملة استعالم فرعي ‪SELECT‬‬ ‫‪-٢‬‬
‫يجب أن يكون نوع بيانات القيم الجديدة من نفس نوع بيانات الحقول التي سيتم تعديلھا‬ ‫‪-٣‬‬
‫عند تعديل حقول التاريخ والنصوص يجب وضع القيم الجديدة بين عالمتي تنصيص‬ ‫‪-٤‬‬
‫مفردتين‬
‫يجب مراعاة وجوب إعطاء قيم للحقول التي سيتم تعديلھا والتي تم تعريفھا على أنھا‬ ‫‪-٥‬‬
‫حقول إجبارية أي ال تحتوي فراغ ‪NOT NULL‬‬

‫مثال‬

‫‪UPDATE‬‬ ‫‪s_emp‬‬
‫‪SET‬‬ ‫‪dept_id = 10‬‬
‫‪WHERE‬‬ ‫;‪id = 2‬‬

‫ثانيا ‪ :‬تعديل بيانات حقل ‪ /‬حقول لجميع السجالت في الجدول‬

‫الصيغة العامة‬

‫‪UPDATE‬‬ ‫‪tableSET‬‬ ‫= ‪column1 = value [, column2‬‬


‫]‪value‬‬

‫الشرح‬
‫بعد تنفيذ جملة التعديل بھذه الطريقة سوف بتم تعديل بيانات الحقل ‪ /‬الحقول المذكورة بحيث يتم‬
‫إلغاء القيم الموجودة فيھا لتحتوي القيم الجديدة المذكورة في جملة التعديل علما بأن السجالت التي‬
‫سيتم تعديل بياناتھا ھي حميع السجالت في الجدول‬

‫مثال‬
‫‪UPDATE‬‬ ‫‪s_emp‬‬
‫‪SET‬‬ ‫‪commission_pct = 10‬‬
‫‪moon‬‬

‫حذف البيانات من الجداول‬


‫ھي العملية التي يتم بھا حذف بيانات سجل ‪ /‬سجالت من جدول البيانات من خالل جملة‬
‫‪ DELETE‬وتتم ھذه العملية بطريقتين‬

‫أول‪:‬ا حذف سجل أو أكثر من الجدول‬

‫الصيغة العامة‬
‫;]‪DELETE [FROM] table[WHERE condition‬‬

‫بعد تنفيذ جملة الحذف الطريقة سوف يتم حذف السجل ‪ /‬السجالت التي تحقق الشرط في الجملة‬
‫الشرطية‬
‫‪.‬‬
‫القواعد التي يجب التقيد بھا في ھذه الطريقة ‪:‬‬

‫يجب التأكد من بيانات السجالت التي سيتم حذفھا قبل تنفيذ جملة الحذف وكذلك التأكد‬ ‫‪-١‬‬
‫من الشرط في الجملة الشرطية ألن السجالت التي ستحذف تعتمد على الشرط المذكور‬

‫ثانيا‪ :‬حذف جميع سجالت الجدول‬

‫الصيغة العامة‬
‫;‪DELETE [FROM] table‬‬

‫الشرح‬

‫بعد تنفيذ جملة الحذف بھذه الطريقة سوف يتم حذف جميع السجالت في الجدول‬
‫‪moon‬‬

‫ملخص الفصل‬

‫تناولنا في ھذا الفصل موضوع تعديل البيانات في الجدول بواسطة جملة ‪ UPDATE‬وھنالك‬
‫طريقتان الجراء عملية التعديل وھما‬

‫أوال تعديل بيانات حقل‪ /‬حقول لسجل واحد أو اكثر‬

‫حيث يتم الغاء القيم الموجودة بھا لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما بأن‬
‫السجالت التي سيتتم التعديل بھا ھي السجالن التي تحقق الشرط‪.‬‬

‫ثانيا‪ :‬تعديل بيانات حفل ‪ /‬حقول لجميع السجالت في الجدول‬

‫حيث يتم الغاء القيم الموجودة بھا لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما انه‬
‫سيتم تعديل بيانات جميع الحقول لعدم وجود شرط‬

‫ثم تناولنا موضوع حذف السجالت عن‪ DELETE‬وھنالك طريقتان إلجراء عمليةا الحذف‬

‫أوال‪ :‬حذف سجل أو أكثر من الجدول‬

‫بھذه الطريقة سوف يتم حذف السجل ‪ /‬السجالت التي تحقق الشرط في جملة الشرط‬

‫ثانيا ‪ :‬حذف جميع سجالت الجدول‬

‫بھذه الطريقة سوف يتم حذف جميع السجالت في الجدول‬


‫‪moon‬‬

‫المتسلسالت والفھارس والعروض‬

‫أھداف الفصل‬

‫في نھاية ھذا الفصل ستكون ان شاء ﷲ قادر على‬

‫التعامل مع المتسلسالت‬ ‫‪-١‬‬


‫تكوين متسلسلة‬ ‫‪-٢‬‬
‫التعديل في متسلسلة‬ ‫‪-٣‬‬
‫حذف متسلسله‬ ‫‪-٤‬‬
‫معرفة الفرق بين الفھرسه التلقائية والفھرسه العادية‬ ‫‪-٥‬‬
‫عمل فھرسه للبيانات‬ ‫‪-٦‬‬
‫الغاء الفھرسه‬ ‫‪-٧‬‬
‫التعامل مع العروض ‪View‬‬ ‫‪-٨‬‬
‫تكوين عرض‬ ‫‪-٩‬‬
‫تعديل العروض‬ ‫‪-١٠‬‬
‫الغاء العروض‬ ‫‪-١١‬‬
‫‪moon‬‬

‫المتسلسالت‬
‫‪.‬المتسلسلة عبارة عن مجموعه من االرقام المتتالية تتولد تلقائيا مثل ‪١‬و‪٢‬و‪ ،،، ٣‬حيث تستخدم‬
‫كمفتاح أساسي ‪ Primary Key‬النھا عبارة عن قيم فريده وتتعامل معھا الذاكره بسھولة وبكفائه‬

‫الصيغة العامة‬

‫‪CREATE SEQUENCE name‬‬


‫]‪[INCREMENT BY n1‬‬
‫]‪[START WITH n2‬‬
‫]}‪[{MAXVALUE n3 | NOMAXVALUE‬‬
‫]}‪[{MINVALUE n4 | NOMINVALUE‬‬
‫]}‪[{CYCLE | NOCYCLE‬‬
‫]}‪[{CACHE n5 | NOCACHE‬‬

‫حيث أن‬
‫اسم المتسلسلة‬ ‫‪Name‬‬
‫مقدار الزيادة كل مرة‬ ‫‪N1‬‬
‫اول رقم تبدأ منه المتسلسلة‬ ‫‪N2‬‬
‫اقصى قيمه للمتسلسلة‬ ‫‪N3‬‬
‫ادنى قيمة للمتسلسلة‬ ‫‪N4‬‬
‫عدد الخانات في الذاكره‬ ‫‪N5‬‬

‫الشرح‬

‫السطر االول قمنا بتعريف اسم المتسلسلة‬ ‫•‬


‫السطر الثاني يتم تحديد مقدار الزيادة‬ ‫•‬
‫السطر الثالث الرقم الذي ستبدأ منه ھذه المتسلسله‬ ‫•‬
‫السطر الرابع نحدد اقصى قيمه تصل اليھا المتسلسلة والوضع االفتراضي عدم وجود‬ ‫•‬
‫(‬
‫قيمة قصوى‪ NOMAXVALUE‬حيث يمكن للمتسلسلة ان تصل الى) ‪١٠٢٧‬‬
‫للمتسلسلة التصاعديه وللتنازليه )‪(١-‬‬
‫السطر الخامس يتم تحديد ادنى قيمه للمتسلسله والوضع االفتراضي عدم وجود قيمة‬ ‫•‬
‫‪ NOMINVALUE‬حيث يمكن للمتسلسلة تصل الى )‪ (١‬في حالة المسلسلة التصاعدية‬
‫وحالة التنازليه الى )‪(١٠٢٦-‬‬
‫السطر السادس ‪ cycle‬يسمح بتكرارا المتسلسلة اذا وصلت الى‬ ‫•‬
‫أقصى قيمه وأدنى قيمه والوضع االفتراضي ھو عدم التكرار‬
‫• السطر السادس يتم فيه حجز اماكن في الذاكره للمتسلسلة وذلك لسرعه التعامل مع‬
‫المتسلسلة حيث نكتب في ‪ n5‬عدد الخانات والوضوع االفتراضي أن اكون ‪ ٢٠‬واذا‬
‫اخترنا ‪ NOCACHE‬فانه اليتم حجز اماكن في الذاكره‬
‫‪moon‬‬

‫مثال‬

‫‪CREATE SEQUENCE s_dept_id‬‬


‫‪INCREMENT BY 1‬‬
‫‪START WITH 51‬‬
‫‪MAXVALUE 9999999‬‬
‫‪NOCACHE‬‬
‫;‪NOCYCLE‬‬

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

‫لذلك نستخدم مايسمى مولد المتسلسالت ‪sequence generator‬‬

‫استخدام المتسلسالت‬ ‫‪-٩‬‬


‫اذا اردنا اضافة قيمه جديدة الى متسلسلة تستخدم‬

‫‪Table_name.NEXTVAL‬‬ ‫‪-١٠‬‬

‫واذا اردنا القيمة الحاليه نستخدم‬

‫‪Table_name.CURRVAL‬‬

‫ولنأخذ ھذا المثال‬

‫)‪INSERT INTO s_dept(id, name, region_id‬‬


‫;)‪VALUES (s_dept_id.NEXTVAL, ‘Finance’, 2‬‬

‫حيث قمنا بإضافة قيمه جديدة الى المتسلسلة في خانة ‪ id‬ثم قمنا باضافة‬
‫‪ finance‬الى خانة ‪ name‬و ‪ 2‬في خانة ‪region_id‬‬

‫واذا اردنا القيمة الحالية نستخدم‬

‫‪SELECT s_dept_id.CURRVAL‬‬
‫;‪FROM SYS.dual‬‬

‫لكن توجد ثغرات في المتسلسالت‬


‫‪ -١‬اذا تم نقل سجل من مكان الى اخر فإانه يحدث خلل في المتسلسلة‬
‫‪ -٢‬المتسلسلة يمكن أن تستخدم في اكثر من جدول‬
‫‪moon‬‬

‫تعديل متسلسلة‬

‫يمكن تعديل مقدار الزياده أو القيمه االبتدائية للمتسلسله وتحديد اكبر وقيمه وادنى قيمه أو تغيبر‬
‫خيار التكراراو الذاكره عن طريق االمر ‪ALTER‬‬

‫الصيغه العامه‬

‫‪ALTER SEQUENCE sequence‬‬


‫]‪[INCREMENT BY n‬‬
‫]}‪[{MAXVALUE n | NOMAXVALUE‬‬
‫]}‪[{MINVALUE n | NOMINVALUE‬‬
‫]}‪[{CYCLE | NOCYCLE‬‬
‫]}‪[{CACHE n | NOCACHE‬‬

‫ولكن توجد قواعد لھذا التغيير‬

‫يجب أن تكون لك السماحية لتعديل ھذه المتسلسله‬ ‫‪-١‬‬


‫سيتم تطبيق التغيير الحادث على القيم الجديده‬ ‫‪-٢‬‬
‫اذا اردت ان يتم التغيير على جميع المتسلسلة يجب أـن نقوم بمسحھا اوال ثم‬ ‫‪-٣‬‬
‫اعادة انشائھا‬

‫حذف متسلسلة‬

‫يتم حذف متسلسلة عن طريق األمر ‪DROP‬‬

‫مثال‬

‫;‪DROP SEQUENCE s_dept_id‬‬


‫‪moon‬‬

‫الفھرسة‬

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

‫كيف تتم الفھرسة ؟‬

‫الفھرسه التلقائية‬

‫عندما نقوم بتعريف حقل على انه مفتاح أساسي أو اذا جعلناه حقل فريد فانه تلقائيا يفھرس‬

‫الفھرسة العادية‬

‫يمكن أن نقوم بفھرسة بيانات غير فريدة لتسھيل الوصول اليھا‬

‫أنواع الفھرسة‬

‫توجد عدة أنواع للفھرسه حيث يمكن فھرسة حقل )عمود( واحد او مجموعة من األعمدة منھا‬

‫الفھرسة الفريدة ‪unique index‬‬


‫ھي عبارة عن قيم مفھرسة ولكن بتقييد حيث ان كل قيمة ال تتكرر اال مرة واحدة‬

‫الفھرسة الغير فريدة ‪nonunique index‬‬


‫ھي عبارة عن قيم مفھرسة ولكن بدون أي تقييد‬

‫الفھرسة المركبة ‪composite index‬‬


‫حيث يتم فھرسة عدة اعمدة حيث أن كل عمود له قيم مختلفة‬

‫وتستخدم الفھرسة المركبه عندما تعود جملة ‪ SELECT‬بعدة قيم فيتم ترتيبھا عن طريق‬
‫استخدام الفھرسة المركبة‬
‫‪moon‬‬

‫كيف يقوم االوراكل بالتعامل مع الفھرسة‬

‫عندما نقوم بفھرسة حقل فإن االوراكل يقوم بتكوين مايسمى ‪ index segment‬يتم فيھا تخزين‬
‫معلومات خاصة بالفھرسة والتي تسرع الوصول الى البيانات حيث أن ھذه المعلومات توضح‬
‫أماكن السجالت وتوضح أقصر الطرق للوصول اليھا عن طريق وسائل االخرج واالدخال‬

‫والمصطلح الذي تعتمد عليه الفھرسة يسمى ‪ B*-tree index‬ھي عبارة عن مخطط شجري‬
‫لمجموعة من القيم مرتبة تنازليا حيث كلما ننتقل الى قيمة تاليه يتم مقارنتھا مع كتلة القيم التي‬
‫تعلوھا وتسمى ھذه الكتل ‪ branch blocks‬وناتج ھذه المقارنه يتم مقارنته مع كتل اخرى إلى‬
‫أدنى درجة في ھذه الكتل ويسمى ‪ leaf blocks‬حيث تحتوي ھذه الكتلة على كل البيانات‬
‫المفھرسه ويوجد ما يسمى ‪ ROWID‬لھذه البيانات‬

‫اذا كانت البيانات فردية فإنه يوجد ‪ ROWID‬لكل قيمة ولكن اذا لمت تكن فردية فانه يمكن ان‬
‫يتواجد أكثر من ‪ ROWID‬وفي ھذه الحالة يتم ترتيبھا البيانات حسب مفتاح الفھرسه ثم حسب‬
‫‪ROWID‬‬

‫الصيغة العامة‬

‫;)‪CREATE INDEX indexON table (column[, column]...‬‬

‫حيث أن‬

‫‪ Index‬اسم الفھرس‬
‫‪ Table‬اسم الجدول‬
‫اسن الحقل المراد فھرستة‬ ‫‪Column‬‬
‫‪moon‬‬

‫مثال‬

‫‪CREATE INDEX‬‬ ‫‪s_emp_last_name_idx‬‬


‫‪ON‬‬ ‫;)‪s_emp(last_name‬‬

‫عند الفھرسة يجب مراعاة مايلي‬

‫ال نفھرس الجداول التي استعلم عنھا بعدد كبير من الصفوف حيث نستخدم‬ ‫‪-١‬‬
‫الفھرسه عندما يكون االستعالم ال يتجاوز ‪ % ٥‬من الجدول‬
‫ال نفھرس الحقول التي يتم التعديل فيھا باستمرار‬ ‫‪-٢‬‬
‫ال نفھرس الجداول التي تحتوي على قيم متكررة بكثرة‬ ‫‪-٣‬‬
‫نفھرس الحقول التي يكون االستعالم عنھا سھل غالبا فال نستخدم الفھرسه مع‬ ‫‪-٤‬‬
‫استعالمات شروطھا معقدة‬
‫ال نفھرس غالبا الحقول التي ال تحتوي على قيم فريدة‬ ‫‪-٥‬‬
‫نفھرس الحقول التي تعتبر حقول رابطه بين جدول واخر‬ ‫‪-٦‬‬

‫حذف الفھرسة‬

‫لحذف الفھرسة نستخدم األمر ‪DROP INDEX‬‬

‫مثال‬

‫;‪DROP INDEX s_emp_last_name_idx‬‬


‫‪moon‬‬

‫العروض‬

‫العرض عبارة عن استعالم من جدول واحد أو اكثر حيث يعتبر جدول وھمي يحتوي‬
‫على البيانات التي يأخذھا من جملة ‪ SELECT‬ولكن حقيقة ان ھذا الجدول غير موجود‬

‫ويمكن استخدم العروض في عدة مھام منھا ‪:‬‬

‫يحافظ على التحكم في مستوي االمان‬ ‫•‬


‫اخفاء تعقيد البينات عن المستخدم‬ ‫•‬
‫اعادة تسمية األعمدة‬ ‫•‬

‫الصيغة العامة‬

‫‪CREATE VIEW view-name‬‬


‫)‪(column1,...,columnN‬‬
‫‪AS‬‬
‫‪select-statement‬‬

‫حيث أن‬

‫اسم العرض‬ ‫‪view-name‬‬


‫‪ Column1‬اسم الحقول التي ستم عرضھا‬

‫مثال‬

‫‪CREATE VIEW empvu45‬‬


‫‪AS SELECT id, last_name, title‬‬
‫‪FROM s_emp‬‬
‫;‪WHERE dept_id = 45‬‬
‫‪moon‬‬

‫ويمكنك مشاھدة المعلومات الخاصة بھذا العرض عن طريق االمر ‪ DESCRIBE‬فنكتب‬

‫;‪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‬‬

‫رابعا‬

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

‫‪alter table S_EMP‬‬


‫‪add‬‬
‫;))‪(username varchar2(31‬‬

‫خامسا‬

‫‪update S_EMP‬‬
‫|| )‪set username = substr(first_name,1,1‬‬
‫;‪last_name‬‬

‫سادسا‬

‫االن سنقوم بعمل عرض اسمه ‪ Re_SALARY‬مربوط بالجدول ‪S_EMP‬‬

‫‪create view Re_SALARY as‬‬


‫‪select e.id, e.last_name, e.first_name,‬‬
‫‪decode(s.manager,'Y',e.salary,null) salary‬‬
‫‪from S_EMP e, S_EMP s‬‬
‫‪where‬‬
‫;)‪user = s.username(+‬‬

‫‪ user‬اسم المستخدم لقاعدة البيانات الحالي لذلك قيمة ھذا المتغير تعتمد على المستخدم الحالي‬
‫للقاعدة حيث قمنا بعمل عملية ربط خارجي ‪ outer-join‬شرطھا أنه اذا كان المستخدم الحالي‬
‫لقاعدة البيانات اسمه موجود في حقل اسماء المستخدمين في جدول الموظفين فانه يعود بقيمة في‬
‫حقل ‪ Manager‬اما ‪ Y‬او ‪ N‬كما قلنا حسب رقم الموظف والدالة ‪ Decode‬تقوم مشاھدة قيمة‬
‫‪ Manager‬اذا كانت ‪ Y‬فإن المستخدم مدير وبتم عرض حقل المرتب واذا كانت ‪ N‬ال يتم‬
‫عرض حقل المرتب‬
moon

‫ ھو المدير فاذا قام بكتابة االستعالم‬Ahmed‫فلنفرض أن‬

select *
from Re_Salary;

‫فان المخرجات ستكون‬

ID LAST_NAME FIRST_NAME SALARY


----------- ------------------------------ ------
1001 AHMED AHMED 1500
1002 HERNANDEZ RANDY 3000
1003 EASON PAUL 1500
1004 BARRETT SARAH 1500
1005 HIGGINS BEN 3000
1006 YEN CINDY 1500
1007 GILROY MAX 1500
1008 CARSON BETH 3000
1009 SWANSON HARRY 2500

: ‫ باالستعالم فإن المخرجات‬MAX ‫ولكن اذا قام‬

ID LAST_NAME FIRST_NAME SALARY


----------- ------------------------------ ------
1001 AHMED AHMED
1002 HERNANDEZ RANDY
1003 EASON PAUL
1004 BARRETT SARAH
1005 HIGGINS BEN
1006 YEN CINDY
1007 GILROY MAX
1008 CARSON BETH
1009 SWANSON HARRY
‫‪moon‬‬

‫تعديل العرض‬

‫يتم التعديل في العرض عن طريق االمر‬

‫‪11- CREATE OR REPLACE‬‬

‫مثال‬

‫‪CREATE OR REPLACE VIEW empvu45‬‬


‫)‪(id_number, employee, job‬‬
‫‪AS SELECT id, last_name, title‬‬
‫‪FROM s_emp‬‬
‫;‪WHERE dept_id = 45‬‬

‫العرض من عرض اخر‬

‫يمكن أن نقوم بعمل عرض من عرض اخر‬

‫مثال‬

‫‪create view EMBVY45‬‬


‫‪as‬‬
‫‪select ID, Last_Name, First_Name,‬‬
‫‪Middle_Initial,HireDate,‬‬
‫;‪from S_EMP‬‬

‫حذف عرض‬

‫اللغاء عرض نستخدم االمر ‪DROP‬‬

‫;‪DROP VIEW empvu45‬‬

‫ملخص الفصل‬

‫تناولنا في ھذا الفصل كيفية تكوين المتسلسالت وتعدبلھا وطريقة حذفھا ثم تطرقنا الى الفھرسة‬
‫وفوائدھا وانواعھا وكيفية عملھا وتعديلھا وكذلك الغائھا وفي اخر الفصل تطرقنا الى العروض‬
‫مفھومھا وفوائدھا وافكارھا وكيفية تعديلھا والغائھا‬
‫‪moon‬‬

‫نبذه ‪PL/SQL‬‬

‫أھداف الفصل‪.‬‬
‫‪ -١‬التعرف على ‪PL/SQL‬‬
‫‪ -٢‬استخدام عبارة الشرط ‪IF - THEN‬‬
‫‪ -٣‬استخدام التكرار‬
‫‪moon‬‬

‫التعرف على ‪PL/SQL‬‬


‫ھي عبارة عن كتل برمجية تشبه في في طريقة كتابتھا لغة ‪ C‬باإلضافة لدعمھا ‪ SQL‬وتحتوي‬
‫ھذه اللغة على اجراءات خاصة بھا واومر مثل ‪ IF‬وغيرھا وكذلك دوال وويمكن تمثيل بنية‬
‫البرنامج في ‪ PL/SQL‬في الشكل التالي‬

‫برامج ‪ pl/sql‬تتم كتابتھا في كتل من اوامر البرمجة تحتوي على مقاطع منفصلة لالعالن عن‬
‫المتغيرات واوامر البرامج ومعالجة االستثناءت)االخطاء( ‪.‬‬
‫ومن الممكن تخزبن االجراء في قاعدة البيانات كبرنامج فرعي له اسم محدد او كتابتھا مباشرة‬
‫في ‪ sql * plus‬ككتله مجھولة‪.‬‬

‫وكتلة البرنامج كمايلي‪:‬‬

‫سنبدا اوال كتابة االجراء مباشرة في ‪ sql * plus‬وھي كمايلي‪:‬‬

‫‪DECLARE‬‬
‫هﻨﺎ ﺗﻮﺟﺪ ﺗﻌﺮﻳﻔﺎت اﻟﻤﺘﻐﻴﺮات واﻟﻤﻮﺷﺮات‬
‫‪BEGIN‬‬
‫ﺟﺴﻢ اﻟﺒﺮﻧﺎﻣﺞ‬

‫‪EXCEPTION‬‬
‫رﻣﻮز ﻣﻌﺎﻟﺠﺔ اﻻﺧﻄﺎء‬
‫‪END:‬‬

‫مع مالحظة مايلي‪:‬‬

‫ان قسم ‪ declare‬وقسم ‪ exception‬ھما اختيارين اي اليشترط وجودھما‬


‫‪moon‬‬

‫اي اذا كان اليوجد لديك تعريف متغيرات التستخدم ‪ declare‬واذا كنت الن تتعامل مع االخطاء‬
‫التستخدم ‪exception‬‬
‫والصيغة العامة لتعريف المتغيرات في ‪declare‬‬

‫]‪identifier [CONSTANT] datatype [NOT NULL‬‬


‫;]‪[:= | DEFAULT expr‬‬

‫مثال‬

‫;)‪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‬‬

‫المتغير ‪BINARY_INTEGER‬‬ ‫‪-١‬‬

‫وتشمل األرقام الصحيحة بين –‪٢.١٤٧.٤٨٣.٦٤٧‬و ‪٢.١٤٧.٤٨٣.٦٤٧‬‬

‫المتغير ‪PLS_INTEGER‬‬ ‫‪-٢‬‬

‫وتشمل األرقام الصحيحة بين –‪٢.١٤٧.٤٨٣.٦٤٧‬و ‪ ٢.١٤٧.٤٨٣.٦٤٧‬وھذا النوع ال يشغل‬


‫مساحة كبيرة من الذاكر ة وأسرع من ‪ BINARY_INTEGER‬و ‪Number‬‬

‫‪NATURAL -٣‬‬

‫وتشمل االرقام من ‪ ٠‬الى ‪٢.١٤٧.٤٨٣.٦٤٧‬‬

‫‪POSITIVE -٤‬‬
‫وتشمل االرقام الموجبة فقط من ‪ ١‬الى ‪٢.١٤٧.٤٨٣.٦٤٧‬‬

‫‪BOOLEAN -٣‬‬

‫وھو متغير يحمل القيمة ‪ TRUE‬أو ‪ FALSE‬أو ‪NULL‬‬

‫‪%TYPE-٤‬‬

‫صمم ھذا المتغير ليحمل نفس نوع البيانات التي يحملھا حقل معين‬

‫‪%ROWTYPE -٤‬‬
‫‪moon‬‬

‫صمم ھذا المتغير ليكون متغير مركب يحمل نفس توع البيانات التي يحملھا صف معين‬

‫طريقة تعريف المتغير من النوع ‪%TYPE‬‬

‫الصيغة العامة‬

‫‪variable-name‬‬ ‫;‪table-name.column-name%TYPE‬‬

‫مثال‬

‫‪v_last_name‬‬ ‫;‪s_emp.last_name%TYPE‬‬
‫لمتغير‬
‫‪ last_name‬في جدول ‪ S_EMP‬ويحتوي على نفس القيم‬

‫طريقة تعريف المتغير من النوع ‪% ROWTYPE‬‬

‫الصيغة العامة‬

‫‪variable-name‬‬ ‫;‪table-name%ROWTYPE‬‬

‫مثال‬

‫‪emp_record‬‬ ‫;‪s_emp%ROWTYPE‬‬
‫يف المتغير المركب‬
‫‪s_emp‬‬

‫طرق االسناد‬

‫مثل اذا اردت ان تقول ان قيمة ‪ i=5‬فيتم ذلك كمايلي‪:‬‬

‫;‪i:=5‬‬

‫يجب وضع النقطتين قبل =‬

‫سوف ناخذ مثال على ذلك‬

‫يوجد ضمن اوامر ‪ sql‬االمر ‪DBMS_OUTPUT.PUT_LINE‬‬


‫يستخدم لكي تعرض النتيجة في ‪ sql * plus‬وھو أمر تابع للحزمة ‪DBMS_OUTPUT‬‬
‫فھذا االمر يقوم بعرض الجمل ويمكن أن يعرض كذلك التواريخ واالرقام واذا اردنا ان يعرض‬
‫انواع بيانات اخرى نستخدم االمر ‪TO_CHAR‬‬
‫‪moon‬‬

‫والصيغة العامة له ‪:‬‬

‫)‪DBMS_OUTPUT.PUT_LINE(massege‬‬

‫حيث‬

‫ھي النص او الشي الذي تريد عرضة‬ ‫‪massage‬‬

‫تم شرح ھذا االمر لكي نبدأ به ونستخدمه لفھم اوامر ال ‪ pl/sql‬لكن في المستقبل سوف تعرف‬
‫ان ھذا االمر اليھمك كثيرا‬

‫‪.‬مثال ‪:‬‬

‫نريد طباعة "‪ "hi all‬على الشاشة ‪ sql * plus‬يتم ذلك كمايلي‪:‬‬

‫;‪SET SERVEROUTPUT ON‬‬


‫‪BEGIN‬‬
‫;)'‪DBMS_OUTPUT.PUT_LINE('hi all‬‬
‫;‪End‬‬

‫جرب ھذا والحظ النتائج ولعلك تتسال عن سبب وجود السطر االول‬
‫السطر االول يخبر ‪ sql * plus‬بأن يكتب كل مايعود به الخادم‪.‬‬
‫ويكفي كتابته مرة واحدة عندما تدخل ‪sql * plus‬‬

‫مثال اخر باستخدام المتغيرات‬


‫‪Declare‬‬
‫‪i‬‬ ‫;)‪number(5‬‬
‫‪BEGIN‬‬
‫;‪i:=5‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE('i = ' || i‬‬
‫;‪END‬‬

‫فائدة || الموجدة ضمن عملة الطباعة ھي للوصل بين التعبيرين‬


‫‪moon‬‬

‫عبارة الشرط ‪IF -THEN‬‬

‫تستخدم ھذه العبارة مثل اي العبارت الشرطية في لغة سي او س ي‪ ++‬او فيج وال بيس ك وغيرھ ا‬
‫‪ ،‬ولھا استخدمات عديدة وسوف نعرف كيف نستخدمھا مقدما مع حقول قواعد البيان ات وذل ك بع د‬
‫اخذ المؤشرات‬

‫الصيغة العامة لھا كمايلي‪:‬‬

‫‪IF condition THEN‬‬


‫;‪statement; ... statement‬‬
‫‪[ELSIF condition THEN‬‬
‫];‪statement; ... statement‬‬
‫‪...‬‬
‫‪[ELSIF condition THEN‬‬
‫];‪statement; ... statement‬‬
‫‪[ELSE‬‬
‫];‪statement; ... statement‬‬
‫;‪END IF‬‬

‫حيث أن‬

‫ھي الشرط‬ ‫‪conditional‬‬

‫مالحظة‬
‫• ‪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 -١‬‬

‫وھنا البد من وضع شرط ألنھاء الحلقة‬


‫نأخذ مثال بسيط على ذلك‬
‫‪Declare‬‬
‫‪i‬‬ ‫;)‪number(5‬‬
‫‪BEGIN‬‬
‫;‪i:=1‬‬
‫‪LOOP‬‬
‫‪IF i>10 then‬‬
‫;‪EXIT‬‬
‫;‪END IF‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE('i =' || i‬‬
‫;‪i:=i+1‬‬
‫;‪End loop‬‬
‫;‪END‬‬
‫‪/‬‬

‫الشرح‬

‫السطر الثاني ‪ :‬تعريف متغير من نوع رقم‬


‫السطر الثالث ‪:‬البداية‬
‫السطر الرابع ‪ :‬اعطاء المتغير قيمة ابتدائية وھي ‪i=1‬‬
‫السطر الخامس ‪ :‬شرط االنھاء‬
‫السطر السادس ‪ :‬االنھاء اذا كان ‪ i>10‬وال يكمل‬
‫السطر السابع ‪:‬انھا ‪if‬‬
‫السطر الثامن ‪ :‬طباعة ‪i‬‬
‫السطر التاسع ‪:‬زيادة قيمة ‪ i‬بواحد‬
‫السطر العاشر ‪ :‬نھاية الحلقة‬
moon

:‫وبعد كتابة ھذا الكود يكون الناتج كمايلي‬

i =1
i =2
i= 3
i =4
i =5
i =6
i =7
i =8
i =9
i =10

WHEN - END LOOP- EXIT -٢

Declare
i number(5);
BEGIN
i:=1;
LOOP
EXIT WHEN i>10;
DBMS_OUTPUT.PUT_LINE('i =' || i);
i:=i+1;
End loop;
END;
/

‫ويكون الناتج نفس السابق لكن الحظ استخدم شرط االنھاء‬

EXIT WHEN i>10;

WHILE - 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 - IN - LOOP - END -٤‬‬

‫وھذه ايضا طريقة اخرى الستخدام حلقات التكرار وھي نفس عمل اسلوب حلقات ‪ for‬في اي لغة‬
‫برمجة‬
‫والصيغة العامه لھا ھي على االتي‬

‫‪LOOP‬‬ ‫‪ FOR‬اﻟﻨﻬﺎﻳﺔ‪ ..‬اﻟﺒﺪاﻳﺔ‬ ‫‪i‬‬ ‫‪IN‬‬


‫اﻟﺠﻤﻞ اﻟﻤﺮاد ﺗﻜﺮارهﺎ‬
‫‪END LOOP‬‬

‫مثـــال‪:‬‬
‫‪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>>

‫حيث أن‬

‫عنوان النقظة التي سيتم االنتقال اليھا‬ 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;
/

‫التعليقات‬

‫ بعدة طرق‬PL/SQL ‫يمكن كتابة التعليقات في‬

‫( ثم التعليق‬--) ‫كتابة‬ -١

‫مثال‬

-- DON’T FORGET MY NAME


moon

‫كتابة )***( ثم التعليق ثم )***( مرة أخرى‬ -٢

‫مثال‬
*** DON’T FORGET MY NAME ***

‫*( مرة اخرى‬/ ) ‫( ثن التعليق ثم‬/*) ‫كتابة‬ -٣

‫مثال‬
/* DON’T FORGET MY NAME */

PL/SQL‫ في كتل‬SQL ‫استخدام أوامر‬

‫ ولكن مع وجود‬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;
/

SQL ‫ وھي من أوامر‬sysdate‫ و‬INSERT‫في ھذا المثال قمنا باستخدام االمر‬


‫‪moon‬‬

‫المؤشرات‬

‫اھداف الفصل‬

‫قي مھاية ھذا الفصل إن شاء ﷲ ستكون قادر على‬


‫التعامل مع المؤشرات الصريحه‬ ‫‪-١‬‬
‫النعامل مع المؤشرات الضمنية‬ ‫‪-٢‬‬
‫‪moon‬‬

‫ﺍﻟﻤﺅﺸﺭﺍﺕ ‪CURSORS‬‬

‫تستخدم ‪ pl/sql‬المؤشرات ‪ cursors‬ألدارة عبارات التحديد ‪ select‬في لغة ‪ sql‬وكما الحظنا‬


‫االوامر السابقة مثل ‪ if‬والتكرار لم نستخدمھا مع بيانات الجداول المخزنه ولعمل ذلك البد من‬
‫استخدام ھذه المؤشرات‪.‬‬
‫وھناك نوعين من المؤشرات ھي الضمنية والصريحة وسوف نتطرق لك واحد بالتفصيل‬
‫واالمثلة الالزمة‪.‬‬

‫‪ -١‬المؤشرات الصريحه ‪:‬‬

‫يتم تعريف ھذا النوع من المؤشرات كجزء من االعالن ‪ declare‬ويجب ان تشتمل عبارة ‪sql‬‬
‫المعرفه على عبارة التحديد ‪ select‬فقط حيث اليمكن استخدام الكلمات االساسية‬
‫‪insert,update,delete‬‬
‫وعند استخدام المؤشرات الصريحه دائما ماستكتب اربعة مكونات كمايلي‪:‬‬
‫‪ -١‬يتم تعريف المؤشر في الجزء ‪declare‬‬
‫‪ -٢‬يتم فتح المؤشر بعد عبارة ‪begin‬‬

‫الصيغة العامة لتعريف المؤشر الصريح كمايلي‪:‬‬

‫‪DECLARE‬‬
‫‪IS‬‬ ‫اﺳﻢ اﻟﻤﺆﺷﺮ‬ ‫‪CURSOR‬‬
‫اﻻﺳﺘﻌﻼم‬

‫تقوم باستبدال اسم المؤشر باسم مؤشر حقيقي‬


‫وتقوم بوضع جملة االستعالم ‪ select‬في مكان االستعالم‬

‫ولكي تقوم بفتح ھذا المؤشر وتستخدمه نقوم بفتحه باستخدام االمر ‪ open‬كمايلي‪:‬‬

‫اسم المؤشر ‪OPEN‬‬

‫وبعد فتح المؤشر تقوم باسترجاع او تحميل البيانات سطر)سجل( واحد من المؤشر الذي تم‬
‫تعريفه باستخدام االمر ‪ FETCH‬كمايلي‪:‬‬

‫‪ INTO‬اﺳﻢ اﻟﻤﺆﺷﺮ ‪FETCH‬‬ ‫‪،.......‬ﻣﺘﻐﻴﺮ‪،٢‬ﻣﺘﻐﻴﺮ‪١‬‬

‫ومعنى ھذا اي قم باسترجاع البيانات من المؤشر المعطى اسمه وحملھا ‪ into‬الى المتغيرات كع‬
‫مالحظة ان عدد المتغيرات يساوي عدد الحقول الموجودة في استعالم المؤشر‪.‬‬
‫وبعد االنتھاء من اجراء العمليات على المؤشر يجب عليك اغالقه ويتم اغالقه كمايلي‪:‬‬
moon

close cursor_name

: ‫مثال على طريقة تعريف مؤشر‬

‫افرض انه لدينا ھذا الجدول‬

age name no
23 mohammed 111
22 talal 222
24 majed 333

:‫اوال قم بانشاء ھذا الجدول كمايلي‬

create table stud(


no number(4),
name varchar2(40),
age number(2));

:‫ثانيا قم بادخال البيانات السابقة في ھذا الجدول كمايلي‬

insert into stud values(111,'mohammed',23);


insert into stud values(222,'talal',22);
insert into stud values(333,'majed',24);

‫ثم قم بنتفيذ مايلي‬

set serveroutput on;


DECLARE
name_stu varchar2(40);
CURSOR name_student IS
select name from stud
where no=111;
BEGIN
OPEN name_student;
FETCH name_student INTO name_stu;
DBMS_OUTPUT.PUT_LINE(name_stu);
CLOSE name_student;
END;
/
:‫بعد التنفيذ سوف يظھر لك الناتج كمايلي‬
‫‪moon‬‬

‫‪mohammed‬‬

‫وھذا الشي صحيح‬


‫الحظ اننا اتبعنا نفس الخطوات التي ذكرناه لكي نتعامل مع مؤشر صريح‬

‫الحظنا في المثال السابق ان االستعالم في ‪ cursor‬سوف يعود بسجل واحد لكن ماذا يحدث لو‬
‫اعاد المؤشر اكثر من سجل واردنا المرور على كافة السجالت ؟‬

‫لحل السؤال السابق البد من استخدام حلقة بھا شرط وھذا ھو ھل سجالت المؤشر انتھت ام ال‬
‫ونعرف ذلك من خالل خاصية ‪ found‬للمؤشر كمايلي‪:‬‬

‫‪found%mycur‬‬

‫حيث ‪:‬‬

‫‪ mycur :‬ھي اسم المؤشر‪.‬‬

‫‪ : %‬توضح انا مايلي اسم المؤشر ھي احد خصائصه‪.‬‬

‫‪ found :‬خاصية التي من خاللھا نعرف ھل تم االنتھاء من جميع السجالت ام ال‬

‫مثال ‪:‬‬

‫اسم الطالب‬ ‫كود المقرر‬ ‫الدرجة‬ ‫النتيجة‬


‫‪NO_STU SUBJECT‬‬ ‫‪MARK RESULT‬‬
‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬

‫نريد انشاء اجراء يقوم بالمرور على الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر‬
‫ام ال فاذا كان ‪ mark‬اكبر او يساوي ‪ ٥٠‬ضع قيمة ‪ true‬في حقل ‪ result‬واال ضع قيمة ‪false‬‬
‫في حقل ‪result‬‬

‫نقوم اوال بانشاء ھذا الجدول ‪:‬‬

‫(‪create table stu_study‬‬


‫‪NO_STU number(4),‬‬
‫‪SUBJECT varchar2(8),‬‬
‫‪MARK number(3),‬‬
‫;))‪RESULT varchar2(20‬‬
moon

‫المدخالت السابقة وبعد انشاء الجدول نقوم بادخال‬

insert into stu_study (NO_STU,SUBJECT,MARK)


values (111,'216CS',88);

insert into stu_study (NO_STU,SUBJECT,MARK)


values (222,'225CS',75);

insert into stu_study (NO_STU,SUBJECT,MARK)


values (333,'225CS',40);

:‫بعد ذلك نقوم بانشاء االجراء‬

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 SUBJECT MARK RESULT


111 216CS 88 TRUE
222 225CS 75 TRUE
333 225CS 40 FALSE
‫‪moon‬‬

‫ھناك طريقة اخرى لتعريف المتغيرات الحظ في الجدول السابق ان الحقل ‪ no_Stu‬تم تعريفه‬
‫على انه من نوع ‪ number‬وتم تعريف المتغير ‪ no‬في االجراء على انه ‪ number‬ايضا لكي‬
‫يتم وضع رقم الطالب فيه لكن الحظ لو تم تغير نوع الحقل في الجدول من ‪ number‬الى‬
‫‪ varchar2‬فانه يجب عليك تغير نوع المتغير ‪ no‬في االجراء ايضا لكن ھناك طريقه تجعلك‬
‫التعدل االجراء كل مرة وھي استخدام االمر التالي لتعريف المتغير ‪ no‬في االجراء‬

‫‪type%no_stu.stu_study NO‬‬

‫حيث ‪:‬‬

‫‪ NO‬ھي اسم المتغير‬

‫‪ : stu_study‬اسم الجدول‬

‫‪ : no_stu‬الحقل المطلوب في الجدول‬

‫‪ : type%‬خاصية نوع الحقل‬

‫ومعنى ماسبق قم بتعريف متغير اسمه ‪ 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‬ودرسنا النوع االول منھا وفي ھذا الفصل عندنا‬
‫نوع اخر وھو المؤشرات الضمنية وھي اسھل من المؤشرات الصريحه‬

‫وتوجد نقطتين ھامتين عند التعامل مع المؤشرات الضمنيه ‪:‬‬

‫* يظھر المؤشر الضمني في جسم االجراء ‪ body‬وليس في ‪ declare‬الخاص باالجراء كمافي‬


‫المؤشرات الصريحه‬

‫* البد ان يسترجع مؤشر ‪ select‬الضمني سطر واحد‪.‬‬

‫والصيغة العامه للمؤشر الضمني كمايلي‪:‬‬

‫‪SELECT COLUM1,COLUM2,.......‬‬ ‫‪INTO‬‬


‫‪VARIABLE1,VARIABLE2,.....‬‬

‫‪FROM‬‬ ‫‪table_name‬‬

‫ومعنى ھذا قم باختيار الحقل‪ ١‬و الحقل‪ ٢‬وضعھا في المتغيرات منغير‪ ١‬و متغير‪ ٢‬من الجدول‬
‫‪table_name‬‬

‫سوف نأخذ مثال على ذلك وسوف نستخدم الجدول الذي انشئناه سابق في الدرس الثاني عندما‬
‫تعاملنا مع المؤشرات الصريحة وكان اسم الجدول ‪stud‬‬

‫‪no‬‬ ‫‪name‬‬ ‫‪age‬‬


‫‪111‬‬ ‫‪mohammed‬‬ ‫‪23‬‬
‫‪222‬‬ ‫‪talal‬‬ ‫‪22‬‬
‫‪333‬‬ ‫‪majed‬‬ ‫‪24‬‬

‫واردنا مثال كتابة اجراء يقوم بحساب متوسط اعمار الطالب ) قد يقول البعض انه اليحتاج ذلك‬
‫الى اجراء فمجرد استخدام جملة ‪ select‬نستطيع عمل ذلك انا اقول نعم ھذا صحيح لكن احب‬
‫استخدام االجراء في ھذا المثال لكي نرى طريقة عمل المؤشر الضمني ولكن سوف نرى بعد‬
‫قليل مثال شامل يتم فيه استخدام الموشرات الصريحه والضمنية في نفس الوقت( واالن نقوم‬
‫بكتابة االجراء كمايلي ‪:‬‬
moon

set serveroutput on;


declare
aveage number(4,2);
begin
select avg(age)
into aveage
from stud;
DBMS_OUTPUT.PUT_LINE(aveage);
end;
/

: ‫*** مثال شامل الستخدام الموشرات الصريحة والضمنيه في نفس الوقت‬

:(‫ )المقررات‬courses ‫ الجدول االول اسمه‬: ‫لنفرض انه لدينا الجدولين التاليين‬

‫رقم المقرر‬ ‫اسم المقرر‬ ‫عدد الساعات‬


code course_name hours
216CS NETWORK 3
225CS ASSEMBLY 3
325CS DATABASE 4

:‫وقم بانشاء الجدول كمايلي‬

create table courses(


code varchar2(8),
course_name varchar2(40),
hours number(3),
primary key(code));

:‫وقم بادخال البيانات الموجود بالجدول كمايلي‬

insert into courses values('216CS','NETWORK',3);

insert into courses


values('225CS','ASSEMBLY',3);
moon

insert into courses


values('325CS','DATABASE',4);

: studys ‫ثم نقوم بتكوين الجدول الثاني وھو‬

‫عدد‬
‫اسم الطالب‬ ‫كود المقرر‬ ‫الدرجة‬
‫النقاط‬
NO_STU COURSE_CODE MARK POINT
111 216CS 88
222 225CS 75
333 225CS 40
111 225CS 90
222 216CS 78
333 216CS 85

:‫ويتم االنشاء كمايلي‬

create table studys(


NO_STU varchar2(6),
COURSE_CODE varchar2(8),
MARK number(3),
point number(5,2),
primary key(NO_STU,COURSE_CODE));

‫ ويتم ادخال‬:‫بالبيانات الموجودة بالجدول كمايلي‬

insert into studys(NO_STU,COURSE_CODE,MARK)


values ('111','216CS',88);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','225CS',75);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('333','225CS',40);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('111','225CS',90);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','216CS',75);
‫‪moon‬‬

‫)‪insert into studys(NO_STU,COURSE_CODE,MARK‬‬


‫;)‪values ('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‬‬

‫ويتم حساب النقاط كمايلي ‪:‬‬

‫عدد النقاط في اي مقرر = معدل المادة )وليس الدرجة كمافي الجدول السابق( * عدد ساعات‬
‫المقرر‬

‫مثال لحساب معدل الطالب الذي رقمه ‪ ١١١‬في المقرر ‪216CS‬‬

‫نالحظ من جدول ‪ 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

select NO_STU,COURSE_CODE,MARK from studys;


BEGIN
open st_point;
loop
exit when st_point%notfound;
fetch st_point into no_Student,cou_code,mark;
select hours
into hou
from courses
where code=cou_code ;
if (mark>=95)and(mark<=100) then
poi:=5 * hou;
elsif mark>=90 then
poi:=4.75 * hou;
elsif mark>=85 then
poi:=4.5 * hou;
elsif mark>=80 then
poi:=4 * hou;
elsif mark>=75 then
poi:=3.5 * hou;
elsif mark>=70 then
poi:=3 * hou;
elsif mark>=65 then
poi:=2.5 * hou;
elsif mark>=60 then
poi:=2 * hou;
else
poi:=1 * hou;
end if;
update studys set POINT=poi
where NO_STU=no_Student and COURSE_CODE=cou_code
;
end loop;
close st_point;
end;

‫الحظ ھنا اننا استخدمنا المؤشرات الصريحة والمؤشرات الضمنيه والصريحة استخدمناه لكي‬
‫ والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كل‬studys ‫تقوم بفتح سجالت الجدول‬
.‫مرة يدور بالحلقة‬
‫‪moon‬‬

‫شرح االجراء ‪:‬‬

‫في التعريفات اتوقع انه التوجد ھناك مشكلة لديكم ‪ ،‬اما جسم البرنامج ابتدأً من ‪ begin‬فھو‬
‫كمايلي ‪:‬‬

‫اوال يفتح المؤشر الصريح والذي يحتوي على جميع سجالت الجدول ‪ studys‬ثم يكون حلقة‬
‫دورانية لكي يمر على جميع سجالت الطالب الموجودة في المؤشر الصريح وطبعا شرط االنھاء‬
‫لھذه الحلقة ھو الوصول الى اخر سجل ‪ .‬ثم يقوم بعملية تحديث سجالت الطالب االولى في‬
‫المتغيرات كمايلي‪:‬‬

‫;‪fetch st_point into no_Student,cou_code,mark‬‬

‫وطبعا المتغيرات ھي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض االن نحن االن عند‬
‫السجل االول ووھو الطالب الذي رقمه ‪ ١١١‬ورقم المقرر ‪ CS٢١٦‬ودرجته ھي ‪ ٨٨‬سوف‬
‫يضع ھذه البيانات في المتغيرات‪ ،‬ثم يستخدم مؤشر ضمني لكي يحضر عدد ساعات المادة التي‬
‫درسھا الطالب ‪ ١١١‬وھي ‪ CS٢١٦‬و المؤشر ھو‬

‫‪select hours‬‬
‫‪into hou‬‬
‫‪from courses‬‬
‫; ‪where code=cou_code‬‬

‫ومعنى ھذا احضر عدد ساعات المقرر الذي رقمه ھو ‪ cou_code‬وھذا المتغير ھو معروف‬
‫من المؤشر الصريح االول وسبب استخدامنا ھذا المؤشر ھو ان عدد ساعات المقرر موجودة في‬
‫جدول اخر والبد من استخدام ھذا المؤشر لكي يحضر عدد الساعات‪ .‬وبما اننا فرضنا اننا عند‬
‫السجل االول فسوف يحضر عدد ساعات المقرر ‪ CS٢١٦‬وھي ‪ ٣‬ساعات ثم بدأ يختبر الدرجة‬
‫وذلك طبقا للجدول الدرجات والمعدالت حيث كانت درجة الطالب الذي رقمه ‪ ١١١‬في المقرر‬
‫‪ cCS٢١٦‬ھي ‪ ٨٨‬وبالتالي يكون عدد النقاط كمايلي = ‪ ، ١٣.٥ = ٣ * ٤.٧٥‬وبعد االنتھاء‬
‫من حساب المعدل يقوم بنعديل الجدول وتحديث قيمة ‪ point‬بقيمتھا الجديدة ‪ ،‬وھكذا يمر على‬
‫كل طالب بنفس الطريقة السابقة الى ان يصل الى نھاية السجالت‪.‬وبالتالي تكون النتائج كمايلي‬
‫في الجدول ‪: studys‬‬

‫‪NO_STU COURSE_CODE MARK POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪moon‬‬

‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬


‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫بعد االنتھاء من ھذا المثال نكون انھينا المؤشرات بنوعيھا بشكل تام وبامثله واقعيه‬
‫‪moon‬‬

‫المصفوفات و االجرائيات و الدوال المخزنة‬


‫اھداف الفصل‬
‫سنتعلم في ھذا القصل باذن ﷲ‬
‫انشاء المصفوفات والتعامل معھا‬ ‫‪-١‬‬
‫كيفية انشاء اجراء‬ ‫‪-٢‬‬
‫التعامل مع الوظائف المخزنة‬ ‫‪-٣‬‬
‫‪moon‬‬

‫الجـداول في ‪ ) pl/sql‬المصفوفات(‬
‫تستخدم ھذه الجداول )المصفوفات( مثل المصفوفات في ھي لغة من لغات البرمجة مثل لو كانت‬
‫لديك سلسلة من االرقام وتريد تخزينھا فانك تستخدم ھذه الجداول للتخزين ويتم تعريف متغير من‬
‫ھذا النوع كمايلي اوال يتم تعريف ھذا النوع ‪:‬‬

‫‪TYPE‬‬ ‫‪ INDEX BY‬ﻧﻮع_اﻟﻤﺘﻐﻴﺮ ‪ IS TABLE OF‬اﺳﻢ_اﻟﻨﻮع‬


‫‪BINARY_INTEGER‬‬

‫مثال على ذلك ‪:‬‬

‫‪DECLARE‬‬
‫‪TYPE num_array IS TABLE OF number(4) INDEX BY‬‬
‫;‪BINARY_INTEGER‬‬
‫;‪num num_array‬‬
‫‪BEGIN‬‬
‫‪........‬‬
‫‪........‬‬
‫;‪END‬‬

‫الحظ اوال تم تعريف نوع واسماه ‪ ، num_array‬ثم قام بتعريف متغير ‪ num‬واعطاه نوع‬
‫‪ num_array‬وھو النوع الجديد الذي قمنا بانشاءه‪.‬‬

‫مثال عملي ‪/‬‬

‫;‪set serveroutput on‬‬


‫‪DECLARE‬‬
‫‪TYPE num_array IS TABLE OF number(4) INDEX BY‬‬
‫;‪BINARY_INTEGER‬‬
‫‪i‬‬ ‫;)‪number(4‬‬
‫‪num‬‬ ‫;‪num_array‬‬
‫‪BEGIN‬‬
‫‪FOR i IN 1..10 LOOP‬‬
‫; ‪num(i) := i * i‬‬
‫;‪END LOOP‬‬
‫‪FOR i IN 1..10 LOOP‬‬
‫|| ' =' || ‪DBMS_OUTPUT.PUT_LINE(i || '*' || i‬‬
‫;) )‪num(i‬‬
‫;‪END LOOP‬‬
‫;‪END‬‬
‫‪/‬‬
‫‪moon‬‬

‫وويكون عمل ھذا االجراء كمايلي ‪ :‬الحلقة االولى تقوم بضرب العدد ‪ 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‬لكي احصل على النتائج لكن ماھو رأيك لو نقوم بتخزين ھذا‬
‫االجراء في قاعدة البيانات ونعطية اسم وحينما نحتاجه نستدعية باسمه وھذا يوفر علينا الشيء‬
‫الكثير لذلك فصلنا ھو االجرائيات المخزنة‪.‬‬

‫ولكي نقوم بانشاء اجراء مخزن نقوم بمايلي ‪:‬‬

‫‪CREATE [OR REPLACE] PROCEDURE procedure-name‬‬


‫‪[(argument1 ... [, argumentN) ] IS‬‬
‫]‪[local-variable-declarations‬‬
‫‪BEGIN‬‬
‫‪executable-section‬‬
‫]‪[exception-section‬‬
‫;]‪END [procedure-name‬‬

‫حيث أن‬

‫اسم االجراء المستخدم‪.‬‬ ‫‪procedure_name‬‬

‫اما ‪ OR REPLACE‬فھي توضع حينما تعلم ان االجراء موجود من السابق‪.‬‬

‫اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب‬
‫معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت‬
‫ولتعريف متغير بھذا الشكل يكون كمايلي ‪:‬‬

‫‪student_id‬‬ ‫)‪in number(9‬‬

‫الحظ اسم المتغير ھو ‪ student_id‬ثم بعده وضعنا الكلمة ‪ in‬ومعنى ان ھذا المتغير يعتبر‬
‫كمدخل‬

‫اما لتعريف متغير يعود بقيمة من االجراء مثال لو اردنا تعرف متغبر يرجع بمعدل الطالب يتم‬
‫التعريف كمايلي ‪:‬‬

‫)‪ave out number(5,2‬‬

‫بعد تنفيذ االجراء يكون ھذا المتغير يحتوي على معدل الطالب الذي تم تمرير رقمه مثال‪.‬‬
‫‪moon‬‬

‫مع العلم انه يمكن تعريف متغير للمدخالت والمخرجات حيث تمرر به القيمه اوال وبعد تنفيذ‬
‫االجراء يتم وضع القيمه في نفس المتغير وتتم كمايلي ‪:‬‬

‫)‪ave in out number(5,2‬‬

‫ومعنى ھذا اي مدخل ومخرج في نفس الوقت ‪.‬‬

‫مــــثال ‪:‬‬

‫في الجدول الذي قمنا بدراسته في الفصول السابقة وكان بأسم ‪studys‬‬

‫وكان كمايلي ‪:‬‬

‫‪NO_STU COURSE_CODE MARK‬‬ ‫‪POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬
‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫لو اردنا تصميم اجراء مخزن لكي يقوم بطباعة درجة الطالب بعد تمرير رقم الطالب ورقم‬
‫المقرر‪.‬‬

‫االجراء المخزن سوف يكون كمايلي ‪:‬‬

‫(‪create or replace procedure stu_mark‬‬


‫‪stu_id in studys.NO_STU%type,‬‬
‫)‪cou in studys.COURSE_CODE%type‬‬
‫‪as‬‬
‫;‪mar studys.mark%type‬‬
‫‪begin‬‬
‫‪select mark‬‬
‫‪into mar‬‬
‫‪from studys‬‬
‫‪where NO_STU=stu_id‬‬
‫;‪and COURSE_CODE=cou‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(mar‬‬
‫;‪end‬‬
‫‪/‬‬
‫‪moon‬‬

‫بعد االنتھاء من تنفيذ االجراء يكون االجراء مخزن في قاعدة البيانات ولكي نقوم باستدعاءه نقوم‬
‫بمايلي‬

‫‪begin‬‬
‫;)'‪stu_mark(111,'216CS‬‬
‫;‪end‬‬
‫‪/‬‬

‫الحظ كيف تم استدعاء االجراء السابق من خالل اسم االجراء وبذلك سوف يكون الناتج على‬
‫الشاشة كمايلي ‪ 88‬وھي صحيحة بعد تمرير رقم الطالب ‪ 111‬ومقرر ‪216CS‬‬

‫لكن الحظ اننا لم نستخدم متغيرات اخراج لكن مأرايك ان نصمم اجراء اخر يقوم بنفس الوظيفة‬
‫التي يقوم بھا االجراء السابق لكن عملية الطباعة تكون بعد االستدعاء لكي نجعل االجراء يقوم‬
‫بارجاع درجة الطالب بمتغير لذلك فان االجراء كمايلي ‪:‬‬

‫(‪create or replace procedure stu_mark22‬‬


‫‪stu_id in studys.NO_STU%type,‬‬
‫‪cou in studys.COURSE_CODE%type,‬‬
‫)‪mara out studys.mark%type‬‬
‫‪as‬‬
‫‪begin‬‬
‫‪select mark‬‬
‫‪into mara‬‬
‫‪from studys‬‬
‫‪where NO_STU=stu_id‬‬
‫;‪and COURSE_CODE=cou‬‬
‫;‪end‬‬
‫‪/‬‬

‫بعد ذلك نقوم باستدعاء االجراء ومن ثم طباعة الدرجة الن لو الحظت االجراء اليقوم بالطباعة‬
‫والحظ ايضا ان الدرجة تم وضعھا في المتغير ‪ mara‬ولذلك سوف يعود بھذه القيمة وسوف‬
‫يكون االستدعاء كمايلي ‪:‬‬

‫‪declare‬‬
‫;‪m studys.mark%type‬‬
‫‪begin‬‬
‫;)‪stu_mark1(111,'225CS',m‬‬
‫;)‪DBMS_OUTPUT.PUT_Line(m‬‬
‫;‪end‬‬
‫‪/‬‬

‫وسوف يكون الناتج ھو ‪ ٩٠‬وھذا صحيح بناء على الجدول‪.‬‬


‫‪moon‬‬

‫الوظائف المخزنة‬
‫كان درسا السابق عن االجراءات المخزنة واليوم لدينا درس مشابه له وھو الوظائف المخزنة‬
‫لكن الفرق ان الوظائف البد ان تعيد قيمة‬

‫والصسغة العامة لتكوين وظيفة كمايلي‪:‬‬

‫‪CREATE [OR REPLACE] FUNCTION function-name‬‬


‫] )‪[(argument1 ... [, argumentN‬‬
‫‪RETURN function-datatype IS‬‬
‫]‪[local-variable-declarations‬‬
‫‪BEGIN‬‬
‫‪executable-section‬‬
‫]‪[exception-section‬‬
‫‪RETURN function-value‬‬
‫;]‪END [function-name‬‬

‫حيث أن‬

‫‪ function_name‬اسم الوظيفة المستخدمه‪.‬‬

‫اما ‪ REPLACE OR‬فھي توضع حينما تعلم ان االجراء موجود من السابق‪.‬‬

‫اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب‬
‫معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت ‪ ،‬وھي‬
‫بنفس الطريقة التي تعاملنا بھا مع االجراءت المخزنة التغير على المتغيرات وطرق تعريفھا‪.‬اما‬
‫‪ datatype RETURN‬فھي تدل على نوع القيمة المعادة من الوظيفة ‪.‬‬

‫مثــــــــال ‪ :‬في الجدول الذي قمنا بدراسته في الدرس الرابع وكان بأسم ‪ studys‬وكان كمايلي‬
‫‪:‬‬

‫‪NO_STU COURSE_CODE MARK‬‬ ‫‪POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬
‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى الوظيفة ثم يتم‬
‫حساب المعدل الفصلي للطالب‬
moon

‫ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات لمقررات‬

: ‫والنشاء الوظيفة كمايلي‬

create or replace function stu_avea(stnum in


1
studys.NO_STU%type)
2
return real
3
as
4
hour courses.hours%type;
5
avrage number(4,2);
6
sum_hours courses.hours%type:=0;
7
point studys.POINT%type;
8
total_Point studys.POINT%type:=0;
9
codem courses.CODE%type;
10
cursor sumpoint
11
is
12
select COURSE_CODE,POINT
13
from studys
14
where NO_STU=stnum;
15
begin
16
open sumpoint;
17
loop
18
fetch sumpoint into codem,point;
19
exit when sumpoint%notfound;
20
select hours
21
into hour
22
from courses
23
where code=codem;
24
total_Point:=total_Point+point;
25
sum_hours:=sum_hours+hour;
26
end loop;
27
close sumpoint;
28
avrage:=total_Point/sum_hours;
29
return avrage;
30
end;

: ‫الشرح‬

‫ لتعريف الوظيفة‬:١ ‫السطر رقم‬


‫ نوع القيمة التي سوف ترجع بھا الوظيفة‬:٢ ‫السطر رقم‬
‫ تعريف متغير عدد الساعات وھو نفس حقل عدد ساعات المقرر الموجودة في‬:٤ ‫السطر رقم‬
courses ‫جدول‬
‫‪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‬‬

‫وھذا سبب ظھور الدالة ‪distinct‬‬


‫‪moon‬‬

‫الحزم البرمجية و الزنادات‬


‫أھداف الفصل‬

‫سنتناول في ھذا الفصل ان شاء ﷲ ‪:‬‬

‫ماھية الحزم البرمجية‬ ‫‪-١‬‬


‫كيقية انشاء الحزم البرمجية ومكوناتھا‬ ‫‪-٢‬‬
‫ماھية الزنادات‬ ‫‪-٣‬‬
‫التعامل مع الزنادات‬ ‫‪-٤‬‬
‫قوائد الزنادات‬ ‫‪-٥‬‬
‫‪moon‬‬

‫الحزم البرمجية‬
‫تعلمنا سابقا كيفية انشاء االجراءت والوظائف المخزنة‪ .‬لكن مارأيك لو وجد لدينا قاعدة بيانات‬
‫كبيرة جدا ولنضرب مثال انھا تحتوي على ‪ ٥٠‬اجراء او وظيفة وظيفة او اجراء لھا عمل خاص‬
‫ولنفرض ان ھذه القاعدة ھي لمحل تجاري ضخم يحتوي على بيانات العمالء وبيانات الموظفين‬
‫وبيانات االصناف التجارية وبيانات المخزون وغيرھا من بيانات ‪ ،‬ولذلك فان بعض ھذه‬
‫االجرائيات والوظائف المخزنة مختص بالعمالء مثال وجود اجراء لحساب اجمالي عميل‬
‫وغيرھا من االجرائيات ‪ ،‬ومثل وجود اجرئيات خاصة بالموظفين مثال اجرائية خاصة بحساب‬
‫راتب الموظف بعد حذف الحسومات واضافة العالوات وغيرھا ايضا ‪ ،‬لكن وضعھا في ھذا‬
‫الشكل في قاعدة البيانات قد يسسب لك بعض االرباك لذلك مارأيك بان تجمع كل الوظائف‬
‫واالجرائيات الخاصة بكل قسم في مجموعة لوحدھا وھذه المجموعة تدعي الحزمه ‪package‬‬
‫مثال نجمع كل اجرائيات والوظائف الخاصة بالعمالء في حزمة خاصة‬

‫فوائد استخدام الحزمة‬

‫‪ -١‬تجميع وحدات ‪ pl/sql‬المرتبطة‪.‬‬


‫‪ -٢‬اداء افضل‪.‬‬
‫‪ -٣‬تكون السرية افضل‪.‬‬
‫‪ -٤‬اھم شيء ھو في عملية الصيانه حيث تسھل عملية الصيانة باستخدامم الحزم‪.‬‬

‫مكونات الحزم‬

‫تتكون الحزمة من جزءين االول وھو الوصف ‪ specification‬ويحتوي على التعاريف مثل‬
‫متغيرات او مؤشرات او اسماء االجراءت ومتحولتھا‪.‬‬
‫اما الجز الثاني فھو جسم الحزمة ويحتوي على تفاصيل االجراءت والعمليات وغيرھا‬
‫والصيغة العامة النشاء الجزء االول كمايلي ‪:‬‬

‫‪CREATE OR REPLACE PACKAGE pack_name AS‬‬


‫‪.........‬‬
‫‪.........‬‬
‫‪.........‬‬
‫;‪end‬‬

‫والصيغة العامة النشاء الجزء الثاني كمايلي ‪:‬‬

‫‪CREATE OR REPLACE PACKAGE BODY pack_name AS‬‬


‫‪.........‬‬
‫اﻟﺤﺰﻣﺔ ﺟﺴﻢ‬
‫‪.........‬‬
‫;‪end‬‬

‫لكن يجب ان يكون اسم الحزمة في الجزء االول ھو نفس اسم الحزمة في الجزء الثاني‪.‬‬
moon

: ‫مــثال‬

‫لنقم بانشاء حزمة تحتوي على وظيفة لحساب معدل طالب واجراء لطباعة المعدل‬
stu_avea ‫ولذلك سوف نستخدم نفس الوظيفة التي انشناھا في الدرس السادس والتي اسمھا‬
‫ الجزء االول من الحزمة‬. ‫والتي تقوم بحساب معدل الطالب واالن نبداء بانشاء الحزمة‬
: ‫ كمايلي‬specification

CREATE OR REPLACE PACKAGE student AS


function stu_avea(stnum in
studys.NO_STU%type)return real;
procedure print_ave(avrage in real);
end;

‫كمايلي‬.‫االن نقوم بانشاء جسم الحزمة والتي تحتوي على التفاصيل‬

CREATE OR REPLACE PACKAGE BODY student AS


function stu_avea(stnum in studys.NO_STU%type)
return real
as
hour courses.hours%type;
avrage number(4,2);
sum_hours courses.hours%type:=0;
point studys.POINT%type;
total_Point studys.POINT%type:=0;
codem courses.CODE%type;
cursor sumpoint
is
select COURSE_CODE,POINT
from studys
where NO_STU=stnum;
begin
open sumpoint;
loop
fetch sumpoint into codem,point;
exit when sumpoint%notfound;
select hours
into hour
from courses
where code=codem;
total_Point:=total_Point+point;
sum_hours:=sum_hours+hour;
end loop;
‫‪moon‬‬

‫;‪close sumpoint‬‬
‫;‪avrage:=total_Point/sum_hours‬‬
‫;‪return avrage‬‬
‫;‪end‬‬

‫)‪procedure print_ave(avrage in real‬‬


‫‪as‬‬
‫‪begin‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(avrage‬‬
‫;‪end‬‬
‫;‪end‬‬

‫ويحتوي جسم الحزمة كمانالحظ على مكونات الوظيفة واالجراء الذي تم تعريفھما في وصف‬
‫الحزمة حيث ان الوظيفة لحساب المعدل واالجراء لطباعة المعدل‪.‬‬

‫طريقة استدعاء اجراء او وظيفة موجود داخل حزمة ‪:‬‬

‫تتم عملية االستدعاء كمايلي ‪:‬‬

‫‪pack_name.func_proc_name‬‬

‫اي اسم الحزمة اوال ثم نقطة ثم اسم االجراء او الوظيفة مـــــــثال ‪:‬‬

‫‪set serveroutput on‬‬


‫‪declare‬‬
‫;‪aa real‬‬
‫‪begin‬‬
‫;)‪aa:=student.stu_avea(111‬‬
‫;)‪student.print_ave(aa‬‬
‫;‪end‬‬
‫‪/‬‬

‫وبعد التفيذ يكون الناتج ھو معدل الطالب الذي رقمه ‪ ١١١‬الحظ اول شي استدعينا داله حساب‬
‫المعدل ووضعناھا في المتغير ‪ aa‬ثم استدعينا اجراء الطباعة ليتم طبعة على الشاشة‪.‬‬

‫واالن و بعد ان تعرفت على فائدة الحزم مارأيك من االن فصاعد ان تستخدم الحزم في كتابة‬
‫االجرائيات والوظائف‬
‫‪moon‬‬

‫الزنادات ‪TRRIGERs‬‬
‫تتشابه الزنادات مع البرامج الفرعية اال في الطرق التالية ‪:‬‬

‫* يتم تنفيذ الزنادات ضمنيا‪،‬عندما يعدل الجدول بالرغم من عمل المستخدم او التطبيقات على‬
‫الجدول ‪.‬‬

‫* يتم تعريف الزنادات للجدول الخاص بقاعدة البيانات‬

‫* التقبل الزنادات المعامالت‬

‫تعد الزنادات ھامة جدا في تطوير نظم البيانات الموجھة الخاصة باالنتاج ‪.‬‬

‫تركيب الزناد ‪:‬‬

‫>‪create [or replace] Trigger <TRRIGER_NAME‬‬


‫>‪<before|after] [instead of] trigger event on <table name‬‬
‫]]‪[for Each row [whene triggering restriction‬‬
‫>‪<trigger body‬‬

‫كماھو مع االجراءات المخزنة امكانية استخدام ‪ replace‬لكي تقوم بالتعديل على الزناد اذا كان‬
‫موجود والتقوم بانشاءه من جديد‪.‬‬
‫ينفذ التوقيت الخاص بالزناد سواء نفذ الزناد قبل او بعد اغالق الزناد بواسطة الخيارين ‪before‬‬
‫و ‪ ، after‬لكن خيار ‪ after‬اكثر كفاءة الن قطع البيانات المؤثرة يجب ان تقراء منطقيا مرة‬
‫للزناد ومرة لعبارة ‪trigger‬‬
‫مالحظة‪ /‬ان حدث اطالق الزناد ھو جملة ‪ sql‬التي تجعل الزناد وحدث االطالق اما ‪ update‬او‬
‫‪ delete‬او ‪ insert‬او بكليھما‪..‬‬
‫ويوجد اربعة انواع من الزنادات‪:‬‬
‫‪ -١‬صف ‪after.‬‬
‫‪ -٢‬جملة ‪after.‬‬
‫‪ -٣‬صف ‪before.‬‬
‫‪ -٤‬جملة ‪before.‬‬
‫وكل زناد من اجل جملة ‪ update‬او ‪ insert‬او ‪ delete‬كل زناد يعد نوع واحد من ) ‪instead‬‬
‫‪ (of , after,before‬ويمكن تعريف تسع زنادات للجدول الواحد‪..‬‬

‫* معالجة احداث اطالق الزناد ‪:‬‬


‫او على توليفة من ھذه ‪ delete‬او ‪ update‬او ‪insert‬يحتوي حدث اطالق الزناد على عملية‬
‫العمليات عندما يتعامل زناد واحد مع اكثر من عملية واحدة‪ ،‬فيمكنك ان تستخدم دعائم شرطية‬
‫للتعرف على نوع العبارة التي تستخدم لتنفيذ الجزء الخاص بالرمز في الزناد‬
‫والدعائم ھي كمايلي‪:‬‬
‫;‪IF inserting then .....end if‬‬
‫;‪IF updating then .....end if‬‬
‫;‪IF deleting then .....end if‬‬
‫‪moon‬‬

‫قيد الزناد‬

‫يحدد ھذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد‪.‬‬
‫على سبيل المثال الزناد التالي ‪ stduent_trigger‬ال يتم حدوثة اال اذا كان رقم الطالب‬
‫‪ student_id‬اقل من ‪١٠٠‬‬

‫‪create or replace trigger stduent_trigger‬‬


‫‪before insert or update on student‬‬
‫‪for each row‬‬
‫)‪when(new.student_id<100‬‬

‫قيود على انشاء الزنادات‪:‬‬

‫‪ -١‬يمكن للنص ان يحتوي على جمل ‪ dml sql‬لكن جمل ‪ select‬يجب ان تكون جمل ‪select‬‬
‫‪into‬‬
‫‪ -٢‬اليسمح بجمل التحكم )‪( commit,savepoint,rollback‬‬
‫‪-٣‬اليمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد‪.‬‬

‫مـــــــــــــــــثال ‪:‬‬

‫لنفرض انه لدينا الثالث جداول التالية‪:‬‬

‫االول ‪ :‬ھو جدول ‪ player‬بيانات جميع الالعبين في النادي سواء درجة شباب او درجة ممتاز ‪:‬‬

‫‪no_player name‬‬ ‫‪date_birth phone address levels‬‬


‫‪1‬‬ ‫‪talal‬‬ ‫‪11/11/1973 123456 riyadh1 1‬‬
‫‪2‬‬ ‫‪mohammed 1/1/1982 654321 riyadh2 2‬‬
‫‪3‬‬ ‫‪sami‬‬ ‫‪1/1/1988 123789 riyadh3 2‬‬
‫‪4‬‬ ‫‪yosif‬‬ ‫‪12/3/1970 123123 riyadh4 1‬‬

‫حيث ‪ level‬تمثل الدرجة التي يلعب بھا الالعب حيث ‪ ١‬تمثل الدرجة االولى الممتاز ‪ -‬و ‪ ٢‬تمثل‬
‫الشباب ‪.‬‬
‫‪moon‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table player‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪name varchar2(50),‬‬
‫‪date_birth date,‬‬
‫‪phone varchar2(9),‬‬
‫‪address varchar2(20),‬‬
‫;))‪levels number(2‬‬

‫الثاني ‪ :‬ھو جدول الالعبين في درجة الممتاز وھو خاص بالرواتب واسم الجدول ‪larg_player‬‬

‫‪no_player‬‬ ‫‪level_no‬‬ ‫‪salary‬‬


‫‪1‬‬ ‫‪1‬‬
‫‪4‬‬ ‫‪1‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table larg_player‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪level_no number(2),‬‬
‫;))‪salary number(7,2‬‬

‫الثالث ‪ :‬ھو جدول الالعبين في درجة الشباب وھو خاص بالرواتب واسم الجدول ‪youth‬‬

‫‪no_player‬‬ ‫‪level_no‬‬ ‫‪salary‬‬


‫‪2‬‬ ‫‪2‬‬
‫‪3‬‬ ‫‪2‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table youth‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪level_no number(2),‬‬
‫;))‪salary number(7,2‬‬

‫االن نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم العب جديد وتحديد مستواه )شباب‬
‫او ممتاز( يقوم الزناد باختبار المستوى فاذا كان شباب اضاف رقم الالعب في جدول الشباب‬
‫وكذلك لوكان مستواه درجة اولى الممتاز فانه يضيف رقم الالعب في جدول ‪larg_player‬‬
‫وبذلك يكون الزناد كمايلي ‪:‬‬
moon

create or replace trigger player_age


before insert on player
for each row
begin
if inserting then
if :new.levels=1 then
insert into larg_player(no_player,level_no) values
(:new.no_player,:new.levels);
elsif :new.levels=2 then
insert into larg_player(no_player,level_no) values
(:new.no_player,:new.levels);
end if;
end if;
end;

: ‫بعد ذلك قم بادخال مايلي‬

insert into player values('1','talal','11/11/1973','123456','riyadh1',1);

‫ بعد ذلك اذھب وقما باالستعالم في جدول‬player ‫الحظ ان المدخالت تمت على جدول‬
.‫ سوف تجد انه اضاف رقم الالعب ھناك‬larg_player
‫‪moon‬‬

‫التجميعات‬
‫انواع التجميعات في قاعدة البيانات‪:‬‬
‫التجميعة ھي مجموعة من العناصر من نفس النوع‬

‫والتجميعات ھي على نوعين‪:‬‬

‫• التجميعة ‪varray‬‬

‫وھي كمصفوفة متغيرة ومشابھة للمصفوفات في اي لغة من لغات البرمجة مثل ‪ c‬و‪ c++‬وتتم‬
‫االشارة الى اي عنصر في ھذه التجميعة باستخدام االرقام السفلية ويتم التخزين في ھذه‬
‫التجميعة بصورة خطية ‪inline‬‬

‫• التجميعة ‪nested table‬‬

‫تعتبر كجدول موجود في قاعة البيانات واالشارة الى اي عنصر في ھذه التجميعة ايضا‬
‫باستخدام االرقام السفلية ويتم تخزين البيانات في جدول تخزين منفصل‪.‬‬

‫‪--‬اوال ‪:‬التعامل مع التجميعات في ‪sql plus‬‬

‫أ ‪-‬التجميعة ‪ varray‬من النوع البسيط‬

‫مثال‪ /‬نفرض انك تريد انشاء جدول االقسام في مستشفى والذي سوف يحتوي على رقم القسم‬
‫‪ ،‬اسم القسم ‪ ،‬واسم القسم ‪ ،‬ومن ثم اسماء موظفين القسم ‪.‬مع العلم ان اسماء الموظفين سوف‬
‫تكون في تجميعة‪. varray‬‬

‫نقوم اوال بانشاء التجميعة كمايلي‪:‬‬

‫;)‪Create type namev as varray(30) of varchar2(50‬‬

‫‪/‬‬

‫حيث لو فرضنا ان اكبر عدد للموظفين ھو ‪ 30‬واكبر طول لالسم ھو ‪. 50‬‬

‫ثم نقوم بأنشاء الجدول ونقوم بانشاءه كمايلي‪/‬‬

‫‪Create table deptv‬‬


‫‪(nodept number(5) primary key,‬‬
‫‪namedept varchar2(50),‬‬
‫;)‪emp namev‬‬

‫ونقوم فيمايلي بتنفيذبعض اوامر ‪ sql‬على الجدول‬


moon

: 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 ‫بتخزين المؤشر والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير‬
.‫يستخدم كعداد‬

‫ثم نقوم بعمل مؤشر الستخراج اسماء الموظفين وھي كمايلي‬

Select emp into editname

From deptv where nodept=10;


‫‪moon‬‬

‫يقوم ھنا باستخراج اسماء الموظفين للقسم ‪ ١٠‬وتخزين ناتج االستعالم في المتغير‬
‫‪ editname‬والذي ھو من نفس نوع التجميعة‬

‫ثم يبدأ حلقة ومن ثم يختبر ھل ‪ I‬وصلت الى نھاية التجميعة اذا كان نعم قام بانھاء االجراء‬
‫واذا لم يصل الى نھاية التجميعة يختبر عنصر التجميعة الحالي ھل ھو يساوي ‪ sami‬ام ال‬
‫اذا كان يساوي ‪sami‬يقوم بتغير ھذه القيمة الى ‪ mohammed‬ومن ثم يزيد العداد بواحد‬
‫ومن ثم يعود من جديد الى ان يصل الى نھاية التجميعة وبعد االنتھاء من جميع العناصر يقوم‬
‫بعمل التحديث للجدول‬

‫;‪update deptv set emp=editname where nodept=10‬‬

‫ومن ثم يقوم بانھاء االجراء‪.‬‬

‫الحذف )‪: delete(Trim‬‬ ‫‪-٢‬‬

‫حذف عنصر من التجميعة يتطلب عمل اجراء ‪pl/sql‬‬

‫والحذف في التجميعات ‪ varray‬يتم على اخر عنصر في التجميعة اي لو حذفنا عنصر‬


‫واحد فانه يتم على اخر عنصر وال يمكن تحديد العنصر‬

‫مثال‪:‬‬

‫‪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‬‬
‫‪/‬‬

‫‪ -٤‬التحديث باالضافة )‪update(append‬‬

‫ھذا االمر يستخدم لالضافة‬

‫ألم يتبادر الى ذھنك كيف نضيف مزيدا من الموظفين الى القسم ‪ ١٠‬يمكن ان تقول نستخدم االمر‬
‫‪ insert‬لكن ھذا غير صحيح الننا عندما نستخدم االمر ‪ insert‬وندخل رقم القسم ‪ ١٠‬يظھر لنا‬
‫خطاء الن حقل رقم القسم مفتاح رئسي‬

‫لذلك اذا اردنا اضافة المزيد من الموظفين اوال نقوم بعمل توسع ‪ extend‬للتجميعة لكي تسمح‬
‫لنا باضافة عنصر جديد ‪.‬ونستخدم االجراء لذلك‬

‫ويكون االجراء كمايلي‪:‬‬


moon

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;
/

:‫ من النوع الشيء‬varray ‫ التجميعة‬- ‫ب‬

‫ھذه التجميعة ھي تجميعة معرفة بواسطة المستخدم‬

: ‫مثال ذلك‬

‫لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر ن ّكون تجميعة تحتوي على‬
‫اسم الموظف وراتبة لجميع موظفين ھذه الوظيفة‬

JOB_NAME EMPLOYEE
manager (ali,5000),(sami,6000),(fahad,4000)
Analysis (laui,7500),(mohammed,7500)
Programming (fady,8000),(saed,6000)

‫ كمايلي‬object ‫وبالتالي فإن الخطوة االولى ھي انشاء‬

Create type empobj

as object (nameemp varchar2(50),salary number(6));

‫ثم نقوم بانشاء التجميعة‬

Create type employeeobj as varray(20) of empobj;

‫ الذي انشئناه ولذلك سمي ھذا النوع بھذا االسم‬object ‫الحظ الفرق اننا استخدمنا‬

:‫وبعد انشاء التجميعة نقوم بإنشاء الجدول كمايلي‬

Create table jobobj


(job_name varchar2(50),
‫‪moon‬‬

‫;)‪employee employeeobj‬‬

‫وبعد انشاء الجدول سوف نتعرف االن على كيفية التعامل مع ھذا الجدول من خالل * ‪sql‬‬
‫‪plus‬‬

‫‪ -١‬االضافة ‪:‬‬

‫الضافة صف إلى الجدول السابق نقوم بمايلي ‪:‬‬

‫‪Insert into jobobj values‬‬

‫( ‪('manager',employeeobj‬‬

‫‪empobj('ali',5000),‬‬

‫‪empobj('sami',6000),‬‬

‫;)))‪empobj('fahad',4000‬‬

‫وبھذا نكون قد اضفنا الصف االول في الجدول السابق‬

‫ولو ذھبنا الى ‪ sql * plus‬وطلبنا منه مايلي‬

‫‪Select * from jobobj‬‬

‫‪JOB_NAME‬‬

‫‪---------------------------------------------------‬‬

‫)‪EMPLOYEEobj(NAMEEMP, SALARY‬‬

‫‪-------------------------------------------------------------‬‬

‫‪manager‬‬

‫‪EMPLOYEE1(EMPOBJ('ali', 5000), EMPOBJ('sami', 6000),‬‬


‫))‪EMPOBJ('fahad', 4000‬‬

‫ونالحظ لقد تم اضافة الصف الجديد‬

‫‪ -٢‬التحديث ‪:‬‬
‫يجب تطبيق قطعة ‪ 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';

‫وبھذا يتم حذف سجل واحد وھو اخر صف من التجميعة‬

:‫ من النوع البسيط‬NESTED TABLE ‫ التجميعة‬-‫ج‬

‫ من النوع البسيط والتي نقوم بتعريفھا بواسطة احد‬varray ‫تعتبر ھذه التجميعة نفس التجميعة‬
‫ وسوف نستخدم ھنا نفس المثال الذي‬varchar2 ‫ و‬number ‫انواع البيانات الموجودة مثل‬
. ‫ من النوع الشيئ‬varray ‫استخدمناه في التجميعة‬
‫‪moon‬‬

‫مثال‪ /‬نفرض انك تريد انشاء جدول االقسام في مستشفى والذي سوف يحتوي على رقم القسم ‪،‬‬
‫اسم القسم ‪ ،‬واسم القسم ‪ ،‬ومن ثم اسماء موظفين القسم ‪.‬مع العلم ان اسماء الموظفين سوف تكون‬
‫في تجميعة‪nested table‬‬

‫اوال نقوم بانشاء التجميعة وتكون كمايلي‪:‬‬

‫;)‪Create type namenested as table of varchar2(50‬‬

‫‪/‬‬

‫ثم نقوم بأنشاء الجدول كمايلي‪:‬‬

‫‪Create table deptnested‬‬


‫‪(nodept number(5) primary key,‬‬
‫‪namedept varchar2(50),‬‬
‫)‪emp namenested‬‬
‫;‪nested table emp store as nestedtablesimple‬‬

‫الحظ السطر االخير الذي تم اضافنته‬

‫فيجب دائم وضعه اذا استخدمنا ‪ nested table‬مع تغير المكتوب باللون االحمر والذي يمثل‬
‫اسم الحقل الذي ھو من النوع ‪.nested table‬‬

‫والذي تحته خط يعتبر كأسم لھذا ‪nested table‬‬

‫**التعامل مع الجدول السابق من خالل اوامر ‪sql‬‬

‫‪ -١‬االضافة ‪:‬‬

‫‪Insert into deptnested‬‬


‫;))'‪values(1,'medical',namenested('ali','sami','fahad','fady‬‬

‫‪ -٢‬التحديث ‪: 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‬وھو يستخدم‬
‫كعداد‪.‬‬

‫ثم نقوم بعمل مؤشر الستخراج اسماء الموظفين وھي كمايلي‬

‫‪Select emp into editname‬‬

‫;‪From deptnested where nodept=1‬‬


‫‪moon‬‬

‫يقوم ھنا باستخراج اسماء الموظفين للقسم ‪ ١‬وتخزين ناتج االستعالم في المتغير ‪editname‬‬
‫والذي ھو من نفس نوع التجميعة‬

‫ثم يبدأ حلقة ومن ثم يختبر ھل ‪ I‬وصلت الى نھاية التجميعة اذا كان نعم قام بانھاء االجراء‬
‫واذا لم يصل الى نھاية التجميعة يختبر عنصر التجميعة الحالي ھل ھو يساوي ‪ sami‬ام ال‬
‫اذا كان يساوي ‪sami‬يقوم بتغير ھذه القيمة الى ‪ mohammed‬ومن ثم يزيد العداد بواحد‬
‫ومن ثم يعود من جديد الى ان يصل الى نھاية التجميعة وبعد االنتھاء من جميع العناصر يقوم‬
‫بعمل التحديث للجدول‬

‫;‪update deptnested set emp=editname where nodept=1‬‬

‫ومن ثم يقوم بانھاء االجراء‪.‬‬

‫‪ -٣‬التحديث باالضافة )‪: update(append‬‬

‫اذا اردنا اضافة المزيد من الموظفين اوال نقوم بعمل توسع ‪ 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‬‬
‫‪/‬‬

‫وھذه الطريقة)طريقة ‪ (delete‬ھي من ابرز الفوارق بين ‪ varray‬و ‪ nested table‬حيث‬


‫‪ varray‬ال يمكنھا حذف اي عنصر ولكن تحذف فقط العنصر االخير بعكس ‪nested table‬‬

‫د‪ -‬التجميعة ‪ NESTED TABLE‬من النوع الشيئ‪:‬‬


‫كما الحظنا ان التجميعة ‪ varray‬يتم انشاءھا من النوع الشيء فإن ‪ NESTED TABLE‬يتم‬
‫إنشاءه ايضا من النوع الشيء المعرف بواسطة المستخدم‪.‬‬

‫سوف نستخدم لشرح ھذا المثال نفس المثال الذي استخدمناه في ‪ varray‬من النوع ‪object‬‬
‫‪moon‬‬

‫مثال ذلك ‪:‬‬

‫لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر ن ّكون تجميعة تحتوي على‬
‫اسماء الموظف وراتبة لجميع موظفين ھذه الوظيفة‬

‫اول خطوة ھي انشاء الشيء ‪ empobj‬والذي تم انشاءه سابق عندما قمنا بشرح ‪vaaray‬‬
‫من النوع الشيء واذا كنت لم تقم بانشاءه فھذا الكود ‪:‬‬

‫‪Create type empobj‬‬


‫‪as object (nameemp varchar2(50),salary‬‬
‫;))‪number(6‬‬
‫‪/‬‬

‫ثاني خطوة ھي إنشاء التجميعة ‪ nested table‬باستخدام الشيء ‪ empobj‬كمايلي‬

‫;‪Create type empnestedobj as table of empobj‬‬

‫‪/‬‬

‫ثالث خطوة نقوم بإنشاء الجدول كمايلي‪:‬‬

‫‪Create table jobnested‬‬


‫‪(job_name varchar2(50),‬‬
‫)‪employee empnestedobj‬‬
‫;‪nested table employee store as nestedtablesimple‬‬

‫* التعامل مع الجدول السابق من خالل اوامر ‪sql‬‬


moon

: ‫ االضافة‬-١

:‫لكي تقوم بادراج بيانات في الجدول السابق نقوم بمايلي‬

Insert into jobnested


Values('manager',
empnestedobj(empobj('ali',6000),
empobj('sami',7000),
empobj('fahad',6500)));

: ‫التحديث‬ -١

:‫ كمايلي‬pl/sql ‫يتم التحديث باستخدام‬

٩٠٠٠ ‫ الى‬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

-: update(append) ‫ التحديث باالضافة‬-٣

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

From jobnested where job_name='manager';


Empdel.delete(2);
update jobnested set employee=empdel where
job_name='manager';
end;
/

IF -THEN ‫عبارة الشرط‬

‫ او فيج وال بيس ك وغيرھ ا‬++‫تستخدم ھذه العبارة مثل اي العبارت الشرطية في لغة سي او س ي‬
‫ ولھا استخدمات عديدة وسوف نعرف كيف نستخدمھا مقدما مع حقول قواعد البيان ات وذل ك بع د‬،
‫اخذ المؤشرات‬

:‫الصيغة العامة لھا كمايلي‬

IF condition THEN
statement; ... statement;
[ELSIF condition THEN
statement; ... statement;]
...
[ELSIF condition THEN
statement; ... statement;]
[ELSE
statement; ... statement;]
END IF;

‫حيث أن‬

‫ھي الشرط‬ conditional

‫مالحظة‬
‫ اختيارية‬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 -١‬‬

‫وھنا البد من وضع شرط ألنھاء الحلقة‬


‫نأخذ مثال بسيط على ذلك‬
‫‪Declare‬‬
‫‪i‬‬ ‫;)‪number(5‬‬
‫‪BEGIN‬‬
‫;‪i:=1‬‬
‫‪LOOP‬‬
‫‪IF i>10 then‬‬
‫;‪EXIT‬‬
‫;‪END IF‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE('i =' || i‬‬
‫;‪i:=i+1‬‬
‫;‪End loop‬‬
‫;‪END‬‬
‫‪/‬‬

‫الشرح‬

‫السطر الثاني ‪ :‬تعريف متغير من نوع رقم‬


‫السطر الثالث ‪:‬البداية‬
‫السطر الرابع ‪ :‬اعطاء المتغير قيمة ابتدائية وھي ‪i=1‬‬
‫السطر الخامس ‪ :‬شرط االنھاء‬
‫السطر السادس ‪ :‬االنھاء اذا كان ‪ i>10‬وال يكمل‬
‫السطر السابع ‪:‬انھا ‪if‬‬
‫السطر الثامن ‪ :‬طباعة ‪i‬‬
‫السطر التاسع ‪:‬زيادة قيمة ‪ i‬بواحد‬
‫السطر العاشر ‪ :‬نھاية الحلقة‬
moon

:‫وبعد كتابة ھذا الكود يكون الناتج كمايلي‬

i =1
i =2
i= 3
i =4
i =5
i =6
i =7
i =8
i =9
i =10

WHEN - END LOOP- EXIT -٢

Declare
i number(5);
BEGIN
i:=1;
LOOP
EXIT WHEN i>10;
DBMS_OUTPUT.PUT_LINE('i =' || i);
i:=i+1;
End loop;
END;
/

‫ويكون الناتج نفس السابق لكن الحظ استخدم شرط االنھاء‬

EXIT WHEN i>10;

WHILE - 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 - IN - LOOP - END -٤‬‬

‫وھذه ايضا طريقة اخرى الستخدام حلقات التكرار وھي نفس عمل اسلوب حلقات ‪ for‬في اي لغة‬
‫برمجة‬
‫والصيغة العامه لھا ھي على االتي‬

‫‪LOOP‬‬ ‫‪ FOR‬اﻟﻨﻬﺎﻳﺔ‪ ..‬اﻟﺒﺪاﻳﺔ‬ ‫‪i‬‬ ‫‪IN‬‬


‫اﻟﺠﻤﻞ اﻟﻤﺮاد ﺗﻜﺮارهﺎ‬
‫‪END LOOP‬‬

‫مثـــال‪:‬‬
‫‪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>>

‫حيث أن‬

‫عنوان النقظة التي سيتم االنتقال اليھا‬ 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;
/

‫التعليقات‬

‫ بعدة طرق‬PL/SQL ‫يمكن كتابة التعليقات في‬

‫( ثم التعليق‬--) ‫كتابة‬ -٤

‫مثال‬

-- DON’T FORGET MY NAME


moon

‫كتابة )***( ثم التعليق ثم )***( مرة أخرى‬ -٥

‫مثال‬
*** DON’T FORGET MY NAME ***

‫*( مرة اخرى‬/ ) ‫( ثن التعليق ثم‬/*) ‫كتابة‬ -٦

‫مثال‬
/* DON’T FORGET MY NAME */

PL/SQL‫ في كتل‬SQL ‫استخدام أوامر‬

‫ ولكن مع وجود‬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;
/

SQL ‫ وھي من أوامر‬sysdate‫ و‬INSERT‫في ھذا المثال قمنا باستخدام االمر‬


‫‪moon‬‬

‫المؤشرات‬

‫اھداف الفصل‬

‫قي مھاية ھذا الفصل إن شاء ﷲ ستكون قادر على‬


‫التعامل مع المؤشرات الصريحه‬ ‫‪-٣‬‬
‫النعامل مع المؤشرات الضمنية‬ ‫‪-٤‬‬
‫‪moon‬‬

‫ﺍﻟﻤﺅﺸﺭﺍﺕ ‪CURSORS‬‬

‫تستخدم ‪ pl/sql‬المؤشرات ‪ cursors‬ألدارة عبارات التحديد ‪ select‬في لغة ‪ sql‬وكما الحظنا‬


‫االوامر السابقة مثل ‪ if‬والتكرار لم نستخدمھا مع بيانات الجداول المخزنه ولعمل ذلك البد من‬
‫استخدام ھذه المؤشرات‪.‬‬
‫وھناك نوعين من المؤشرات ھي الضمنية والصريحة وسوف نتطرق لك واحد بالتفصيل‬
‫واالمثلة الالزمة‪.‬‬

‫‪ -١‬المؤشرات الصريحه ‪:‬‬

‫يتم تعريف ھذا النوع من المؤشرات كجزء من االعالن ‪ declare‬ويجب ان تشتمل عبارة ‪sql‬‬
‫المعرفه على عبارة التحديد ‪ select‬فقط حيث اليمكن استخدام الكلمات االساسية‬
‫‪insert,update,delete‬‬
‫وعند استخدام المؤشرات الصريحه دائما ماستكتب اربعة مكونات كمايلي‪:‬‬
‫‪ -١‬يتم تعريف المؤشر في الجزء ‪declare‬‬
‫‪ -٢‬يتم فتح المؤشر بعد عبارة ‪begin‬‬

‫الصيغة العامة لتعريف المؤشر الصريح كمايلي‪:‬‬

‫‪DECLARE‬‬
‫‪IS‬‬ ‫اﺳﻢ اﻟﻤﺆﺷﺮ‬ ‫‪CURSOR‬‬
‫اﻻﺳﺘﻌﻼم‬

‫تقوم باستبدال اسم المؤشر باسم مؤشر حقيقي‬


‫وتقوم بوضع جملة االستعالم ‪ select‬في مكان االستعالم‬

‫ولكي تقوم بفتح ھذا المؤشر وتستخدمه نقوم بفتحه باستخدام االمر ‪ open‬كمايلي‪:‬‬

‫اسم المؤشر ‪OPEN‬‬

‫وبعد فتح المؤشر تقوم باسترجاع او تحميل البيانات سطر)سجل( واحد من المؤشر الذي تم‬
‫تعريفه باستخدام االمر ‪ FETCH‬كمايلي‪:‬‬

‫‪ INTO‬اﺳﻢ اﻟﻤﺆﺷﺮ ‪FETCH‬‬ ‫‪،.......‬ﻣﺘﻐﻴﺮ‪،٢‬ﻣﺘﻐﻴﺮ‪١‬‬

‫ومعنى ھذا اي قم باسترجاع البيانات من المؤشر المعطى اسمه وحملھا ‪ into‬الى المتغيرات كع‬
‫مالحظة ان عدد المتغيرات يساوي عدد الحقول الموجودة في استعالم المؤشر‪.‬‬
‫وبعد االنتھاء من اجراء العمليات على المؤشر يجب عليك اغالقه ويتم اغالقه كمايلي‪:‬‬
moon

close cursor_name

: ‫مثال على طريقة تعريف مؤشر‬

‫افرض انه لدينا ھذا الجدول‬

age name no
23 mohammed 111
22 talal 222
24 majed 333

:‫اوال قم بانشاء ھذا الجدول كمايلي‬

create table stud(


no number(4),
name varchar2(40),
age number(2));

:‫ثانيا قم بادخال البيانات السابقة في ھذا الجدول كمايلي‬

insert into stud values(111,'mohammed',23);


insert into stud values(222,'talal',22);
insert into stud values(333,'majed',24);

‫ثم قم بنتفيذ مايلي‬

set serveroutput on;


DECLARE
name_stu varchar2(40);
CURSOR name_student IS
select name from stud
where no=111;
BEGIN
OPEN name_student;
FETCH name_student INTO name_stu;
DBMS_OUTPUT.PUT_LINE(name_stu);
CLOSE name_student;
END;
/
:‫بعد التنفيذ سوف يظھر لك الناتج كمايلي‬
‫‪moon‬‬

‫‪mohammed‬‬

‫وھذا الشي صحيح‬


‫الحظ اننا اتبعنا نفس الخطوات التي ذكرناه لكي نتعامل مع مؤشر صريح‬

‫الحظنا في المثال السابق ان االستعالم في ‪ cursor‬سوف يعود بسجل واحد لكن ماذا يحدث لو‬
‫اعاد المؤشر اكثر من سجل واردنا المرور على كافة السجالت ؟‬

‫لحل السؤال السابق البد من استخدام حلقة بھا شرط وھذا ھو ھل سجالت المؤشر انتھت ام ال‬
‫ونعرف ذلك من خالل خاصية ‪ found‬للمؤشر كمايلي‪:‬‬

‫‪found%mycur‬‬

‫حيث ‪:‬‬

‫‪ mycur :‬ھي اسم المؤشر‪.‬‬

‫‪ : %‬توضح انا مايلي اسم المؤشر ھي احد خصائصه‪.‬‬

‫‪ found :‬خاصية التي من خاللھا نعرف ھل تم االنتھاء من جميع السجالت ام ال‬

‫مثال ‪:‬‬

‫اسم الطالب‬ ‫كود المقرر‬ ‫الدرجة‬ ‫النتيجة‬


‫‪NO_STU SUBJECT‬‬ ‫‪MARK RESULT‬‬
‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬

‫نريد انشاء اجراء يقوم بالمرور على الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر‬
‫ام ال فاذا كان ‪ mark‬اكبر او يساوي ‪ ٥٠‬ضع قيمة ‪ true‬في حقل ‪ result‬واال ضع قيمة ‪false‬‬
‫في حقل ‪result‬‬

‫نقوم اوال بانشاء ھذا الجدول ‪:‬‬

‫(‪create table stu_study‬‬


‫‪NO_STU number(4),‬‬
‫‪SUBJECT varchar2(8),‬‬
‫‪MARK number(3),‬‬
‫;))‪RESULT varchar2(20‬‬
moon

‫المدخالت السابقة وبعد انشاء الجدول نقوم بادخال‬

insert into stu_study (NO_STU,SUBJECT,MARK)


values (111,'216CS',88);

insert into stu_study (NO_STU,SUBJECT,MARK)


values (222,'225CS',75);

insert into stu_study (NO_STU,SUBJECT,MARK)


values (333,'225CS',40);

:‫بعد ذلك نقوم بانشاء االجراء‬

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 SUBJECT MARK RESULT


111 216CS 88 TRUE
222 225CS 75 TRUE
333 225CS 40 FALSE
‫‪moon‬‬

‫ھناك طريقة اخرى لتعريف المتغيرات الحظ في الجدول السابق ان الحقل ‪ no_Stu‬تم تعريفه‬
‫على انه من نوع ‪ number‬وتم تعريف المتغير ‪ no‬في االجراء على انه ‪ number‬ايضا لكي‬
‫يتم وضع رقم الطالب فيه لكن الحظ لو تم تغير نوع الحقل في الجدول من ‪ number‬الى‬
‫‪ varchar2‬فانه يجب عليك تغير نوع المتغير ‪ no‬في االجراء ايضا لكن ھناك طريقه تجعلك‬
‫التعدل االجراء كل مرة وھي استخدام االمر التالي لتعريف المتغير ‪ no‬في االجراء‬

‫‪type%no_stu.stu_study NO‬‬

‫حيث ‪:‬‬

‫‪ NO‬ھي اسم المتغير‬

‫‪ : stu_study‬اسم الجدول‬

‫‪ : no_stu‬الحقل المطلوب في الجدول‬

‫‪ : type%‬خاصية نوع الحقل‬

‫ومعنى ماسبق قم بتعريف متغير اسمه ‪ 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‬ودرسنا النوع االول منھا وفي ھذا الفصل عندنا‬
‫نوع اخر وھو المؤشرات الضمنية وھي اسھل من المؤشرات الصريحه‬

‫وتوجد نقطتين ھامتين عند التعامل مع المؤشرات الضمنيه ‪:‬‬

‫* يظھر المؤشر الضمني في جسم االجراء ‪ body‬وليس في ‪ declare‬الخاص باالجراء كمافي‬


‫المؤشرات الصريحه‬

‫* البد ان يسترجع مؤشر ‪ select‬الضمني سطر واحد‪.‬‬

‫والصيغة العامه للمؤشر الضمني كمايلي‪:‬‬

‫‪SELECT COLUM1,COLUM2,.......‬‬ ‫‪INTO‬‬


‫‪VARIABLE1,VARIABLE2,.....‬‬

‫‪FROM‬‬ ‫‪table_name‬‬

‫ومعنى ھذا قم باختيار الحقل‪ ١‬و الحقل‪ ٢‬وضعھا في المتغيرات منغير‪ ١‬و متغير‪ ٢‬من الجدول‬
‫‪table_name‬‬

‫سوف نأخذ مثال على ذلك وسوف نستخدم الجدول الذي انشئناه سابق في الدرس الثاني عندما‬
‫تعاملنا مع المؤشرات الصريحة وكان اسم الجدول ‪stud‬‬

‫‪no‬‬ ‫‪name‬‬ ‫‪age‬‬


‫‪111‬‬ ‫‪mohammed‬‬ ‫‪23‬‬
‫‪222‬‬ ‫‪talal‬‬ ‫‪22‬‬
‫‪333‬‬ ‫‪majed‬‬ ‫‪24‬‬

‫واردنا مثال كتابة اجراء يقوم بحساب متوسط اعمار الطالب ) قد يقول البعض انه اليحتاج ذلك‬
‫الى اجراء فمجرد استخدام جملة ‪ select‬نستطيع عمل ذلك انا اقول نعم ھذا صحيح لكن احب‬
‫استخدام االجراء في ھذا المثال لكي نرى طريقة عمل المؤشر الضمني ولكن سوف نرى بعد‬
‫قليل مثال شامل يتم فيه استخدام الموشرات الصريحه والضمنية في نفس الوقت( واالن نقوم‬
‫بكتابة االجراء كمايلي ‪:‬‬
moon

set serveroutput on;


declare
aveage number(4,2);
begin
select avg(age)
into aveage
from stud;
DBMS_OUTPUT.PUT_LINE(aveage);
end;
/

: ‫*** مثال شامل الستخدام الموشرات الصريحة والضمنيه في نفس الوقت‬

:(‫ )المقررات‬courses ‫ الجدول االول اسمه‬: ‫لنفرض انه لدينا الجدولين التاليين‬

‫رقم المقرر‬ ‫اسم المقرر‬ ‫عدد الساعات‬


code course_name hours
216CS NETWORK 3
225CS ASSEMBLY 3
325CS DATABASE 4

:‫وقم بانشاء الجدول كمايلي‬

create table courses(


code varchar2(8),
course_name varchar2(40),
hours number(3),
primary key(code));

:‫وقم بادخال البيانات الموجود بالجدول كمايلي‬

insert into courses values('216CS','NETWORK',3);

insert into courses


values('225CS','ASSEMBLY',3);
moon

insert into courses


values('325CS','DATABASE',4);

: studys ‫ثم نقوم بتكوين الجدول الثاني وھو‬

‫عدد‬
‫اسم الطالب‬ ‫كود المقرر‬ ‫الدرجة‬
‫النقاط‬
NO_STU COURSE_CODE MARK POINT
111 216CS 88
222 225CS 75
333 225CS 40
111 225CS 90
222 216CS 78
333 216CS 85

:‫ويتم االنشاء كمايلي‬

create table studys(


NO_STU varchar2(6),
COURSE_CODE varchar2(8),
MARK number(3),
point number(5,2),
primary key(NO_STU,COURSE_CODE));

‫ ويتم ادخال‬:‫بالبيانات الموجودة بالجدول كمايلي‬

insert into studys(NO_STU,COURSE_CODE,MARK)


values ('111','216CS',88);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','225CS',75);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('333','225CS',40);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('111','225CS',90);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','216CS',75);
‫‪moon‬‬

‫)‪insert into studys(NO_STU,COURSE_CODE,MARK‬‬


‫;)‪values ('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‬‬

‫ويتم حساب النقاط كمايلي ‪:‬‬

‫عدد النقاط في اي مقرر = معدل المادة )وليس الدرجة كمافي الجدول السابق( * عدد ساعات‬
‫المقرر‬

‫مثال لحساب معدل الطالب الذي رقمه ‪ ١١١‬في المقرر ‪216CS‬‬

‫نالحظ من جدول ‪ 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

select NO_STU,COURSE_CODE,MARK from studys;


BEGIN
open st_point;
loop
exit when st_point%notfound;
fetch st_point into no_Student,cou_code,mark;
select hours
into hou
from courses
where code=cou_code ;
if (mark>=95)and(mark<=100) then
poi:=5 * hou;
elsif mark>=90 then
poi:=4.75 * hou;
elsif mark>=85 then
poi:=4.5 * hou;
elsif mark>=80 then
poi:=4 * hou;
elsif mark>=75 then
poi:=3.5 * hou;
elsif mark>=70 then
poi:=3 * hou;
elsif mark>=65 then
poi:=2.5 * hou;
elsif mark>=60 then
poi:=2 * hou;
else
poi:=1 * hou;
end if;
update studys set POINT=poi
where NO_STU=no_Student and COURSE_CODE=cou_code
;
end loop;
close st_point;
end;

‫الحظ ھنا اننا استخدمنا المؤشرات الصريحة والمؤشرات الضمنيه والصريحة استخدمناه لكي‬
‫ والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كل‬studys ‫تقوم بفتح سجالت الجدول‬
.‫مرة يدور بالحلقة‬
‫‪moon‬‬

‫شرح االجراء ‪:‬‬

‫في التعريفات اتوقع انه التوجد ھناك مشكلة لديكم ‪ ،‬اما جسم البرنامج ابتدأً من ‪ begin‬فھو‬
‫كمايلي ‪:‬‬

‫اوال يفتح المؤشر الصريح والذي يحتوي على جميع سجالت الجدول ‪ studys‬ثم يكون حلقة‬
‫دورانية لكي يمر على جميع سجالت الطالب الموجودة في المؤشر الصريح وطبعا شرط االنھاء‬
‫لھذه الحلقة ھو الوصول الى اخر سجل ‪ .‬ثم يقوم بعملية تحديث سجالت الطالب االولى في‬
‫المتغيرات كمايلي‪:‬‬

‫;‪fetch st_point into no_Student,cou_code,mark‬‬

‫وطبعا المتغيرات ھي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض االن نحن االن عند‬
‫السجل االول ووھو الطالب الذي رقمه ‪ ١١١‬ورقم المقرر ‪ CS٢١٦‬ودرجته ھي ‪ ٨٨‬سوف‬
‫يضع ھذه البيانات في المتغيرات‪ ،‬ثم يستخدم مؤشر ضمني لكي يحضر عدد ساعات المادة التي‬
‫درسھا الطالب ‪ ١١١‬وھي ‪ CS٢١٦‬و المؤشر ھو‬

‫‪select hours‬‬
‫‪into hou‬‬
‫‪from courses‬‬
‫; ‪where code=cou_code‬‬

‫ومعنى ھذا احضر عدد ساعات المقرر الذي رقمه ھو ‪ cou_code‬وھذا المتغير ھو معروف‬
‫من المؤشر الصريح االول وسبب استخدامنا ھذا المؤشر ھو ان عدد ساعات المقرر موجودة في‬
‫جدول اخر والبد من استخدام ھذا المؤشر لكي يحضر عدد الساعات‪ .‬وبما اننا فرضنا اننا عند‬
‫السجل االول فسوف يحضر عدد ساعات المقرر ‪ CS٢١٦‬وھي ‪ ٣‬ساعات ثم بدأ يختبر الدرجة‬
‫وذلك طبقا للجدول الدرجات والمعدالت حيث كانت درجة الطالب الذي رقمه ‪ ١١١‬في المقرر‬
‫‪ cCS٢١٦‬ھي ‪ ٨٨‬وبالتالي يكون عدد النقاط كمايلي = ‪ ، ١٣.٥ = ٣ * ٤.٧٥‬وبعد االنتھاء‬
‫من حساب المعدل يقوم بنعديل الجدول وتحديث قيمة ‪ point‬بقيمتھا الجديدة ‪ ،‬وھكذا يمر على‬
‫كل طالب بنفس الطريقة السابقة الى ان يصل الى نھاية السجالت‪.‬وبالتالي تكون النتائج كمايلي‬
‫في الجدول ‪: studys‬‬

‫‪NO_STU COURSE_CODE MARK POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪moon‬‬

‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬


‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫بعد االنتھاء من ھذا المثال نكون انھينا المؤشرات بنوعيھا بشكل تام وبامثله واقعيه‬
‫‪moon‬‬

‫المصفوفات و االجرائيات و الدوال المخزنة‬


‫اھداف الفصل‬
‫سنتعلم في ھذا القصل باذن ﷲ‬
‫انشاء المصفوفات والتعامل معھا‬ ‫‪-٤‬‬
‫كيفية انشاء اجراء‬ ‫‪-٥‬‬
‫التعامل مع الوظائف المخزنة‬ ‫‪-٦‬‬
‫‪moon‬‬

‫الجـداول في ‪ ) pl/sql‬المصفوفات(‬
‫تستخدم ھذه الجداول )المصفوفات( مثل المصفوفات في ھي لغة من لغات البرمجة مثل لو كانت‬
‫لديك سلسلة من االرقام وتريد تخزينھا فانك تستخدم ھذه الجداول للتخزين ويتم تعريف متغير من‬
‫ھذا النوع كمايلي اوال يتم تعريف ھذا النوع ‪:‬‬

‫‪TYPE‬‬ ‫‪ INDEX BY‬ﻧﻮع_اﻟﻤﺘﻐﻴﺮ ‪ IS TABLE OF‬اﺳﻢ_اﻟﻨﻮع‬


‫‪BINARY_INTEGER‬‬

‫مثال على ذلك ‪:‬‬

‫‪DECLARE‬‬
‫‪TYPE num_array IS TABLE OF number(4) INDEX BY‬‬
‫;‪BINARY_INTEGER‬‬
‫;‪num num_array‬‬
‫‪BEGIN‬‬
‫‪........‬‬
‫‪........‬‬
‫;‪END‬‬

‫الحظ اوال تم تعريف نوع واسماه ‪ ، num_array‬ثم قام بتعريف متغير ‪ num‬واعطاه نوع‬
‫‪ num_array‬وھو النوع الجديد الذي قمنا بانشاءه‪.‬‬

‫مثال عملي ‪/‬‬

‫;‪set serveroutput on‬‬


‫‪DECLARE‬‬
‫‪TYPE num_array IS TABLE OF number(4) INDEX BY‬‬
‫;‪BINARY_INTEGER‬‬
‫‪i‬‬ ‫;)‪number(4‬‬
‫‪num‬‬ ‫;‪num_array‬‬
‫‪BEGIN‬‬
‫‪FOR i IN 1..10 LOOP‬‬
‫; ‪num(i) := i * i‬‬
‫;‪END LOOP‬‬
‫‪FOR i IN 1..10 LOOP‬‬
‫|| ' =' || ‪DBMS_OUTPUT.PUT_LINE(i || '*' || i‬‬
‫;) )‪num(i‬‬
‫;‪END LOOP‬‬
‫;‪END‬‬
‫‪/‬‬
‫‪moon‬‬

‫وويكون عمل ھذا االجراء كمايلي ‪ :‬الحلقة االولى تقوم بضرب العدد ‪ 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‬لكي احصل على النتائج لكن ماھو رأيك لو نقوم بتخزين ھذا‬
‫االجراء في قاعدة البيانات ونعطية اسم وحينما نحتاجه نستدعية باسمه وھذا يوفر علينا الشيء‬
‫الكثير لذلك فصلنا ھو االجرائيات المخزنة‪.‬‬

‫ولكي نقوم بانشاء اجراء مخزن نقوم بمايلي ‪:‬‬

‫‪CREATE [OR REPLACE] PROCEDURE procedure-name‬‬


‫‪[(argument1 ... [, argumentN) ] IS‬‬
‫]‪[local-variable-declarations‬‬
‫‪BEGIN‬‬
‫‪executable-section‬‬
‫]‪[exception-section‬‬
‫;]‪END [procedure-name‬‬

‫حيث أن‬

‫اسم االجراء المستخدم‪.‬‬ ‫‪procedure_name‬‬

‫اما ‪ OR REPLACE‬فھي توضع حينما تعلم ان االجراء موجود من السابق‪.‬‬

‫اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب‬
‫معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت‬
‫ولتعريف متغير بھذا الشكل يكون كمايلي ‪:‬‬

‫‪student_id‬‬ ‫)‪in number(9‬‬

‫الحظ اسم المتغير ھو ‪ student_id‬ثم بعده وضعنا الكلمة ‪ in‬ومعنى ان ھذا المتغير يعتبر‬
‫كمدخل‬

‫اما لتعريف متغير يعود بقيمة من االجراء مثال لو اردنا تعرف متغبر يرجع بمعدل الطالب يتم‬
‫التعريف كمايلي ‪:‬‬

‫)‪ave out number(5,2‬‬

‫بعد تنفيذ االجراء يكون ھذا المتغير يحتوي على معدل الطالب الذي تم تمرير رقمه مثال‪.‬‬
‫‪moon‬‬

‫مع العلم انه يمكن تعريف متغير للمدخالت والمخرجات حيث تمرر به القيمه اوال وبعد تنفيذ‬
‫االجراء يتم وضع القيمه في نفس المتغير وتتم كمايلي ‪:‬‬

‫)‪ave in out number(5,2‬‬

‫ومعنى ھذا اي مدخل ومخرج في نفس الوقت ‪.‬‬

‫مــــثال ‪:‬‬

‫في الجدول الذي قمنا بدراسته في الفصول السابقة وكان بأسم ‪studys‬‬

‫وكان كمايلي ‪:‬‬

‫‪NO_STU COURSE_CODE MARK‬‬ ‫‪POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬
‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫لو اردنا تصميم اجراء مخزن لكي يقوم بطباعة درجة الطالب بعد تمرير رقم الطالب ورقم‬
‫المقرر‪.‬‬

‫االجراء المخزن سوف يكون كمايلي ‪:‬‬

‫(‪create or replace procedure stu_mark‬‬


‫‪stu_id in studys.NO_STU%type,‬‬
‫)‪cou in studys.COURSE_CODE%type‬‬
‫‪as‬‬
‫;‪mar studys.mark%type‬‬
‫‪begin‬‬
‫‪select mark‬‬
‫‪into mar‬‬
‫‪from studys‬‬
‫‪where NO_STU=stu_id‬‬
‫;‪and COURSE_CODE=cou‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(mar‬‬
‫;‪end‬‬
‫‪/‬‬
‫‪moon‬‬

‫بعد االنتھاء من تنفيذ االجراء يكون االجراء مخزن في قاعدة البيانات ولكي نقوم باستدعاءه نقوم‬
‫بمايلي‬

‫‪begin‬‬
‫;)'‪stu_mark(111,'216CS‬‬
‫;‪end‬‬
‫‪/‬‬

‫الحظ كيف تم استدعاء االجراء السابق من خالل اسم االجراء وبذلك سوف يكون الناتج على‬
‫الشاشة كمايلي ‪ 88‬وھي صحيحة بعد تمرير رقم الطالب ‪ 111‬ومقرر ‪216CS‬‬

‫لكن الحظ اننا لم نستخدم متغيرات اخراج لكن مأرايك ان نصمم اجراء اخر يقوم بنفس الوظيفة‬
‫التي يقوم بھا االجراء السابق لكن عملية الطباعة تكون بعد االستدعاء لكي نجعل االجراء يقوم‬
‫بارجاع درجة الطالب بمتغير لذلك فان االجراء كمايلي ‪:‬‬

‫(‪create or replace procedure stu_mark22‬‬


‫‪stu_id in studys.NO_STU%type,‬‬
‫‪cou in studys.COURSE_CODE%type,‬‬
‫)‪mara out studys.mark%type‬‬
‫‪as‬‬
‫‪begin‬‬
‫‪select mark‬‬
‫‪into mara‬‬
‫‪from studys‬‬
‫‪where NO_STU=stu_id‬‬
‫;‪and COURSE_CODE=cou‬‬
‫;‪end‬‬
‫‪/‬‬

‫بعد ذلك نقوم باستدعاء االجراء ومن ثم طباعة الدرجة الن لو الحظت االجراء اليقوم بالطباعة‬
‫والحظ ايضا ان الدرجة تم وضعھا في المتغير ‪ mara‬ولذلك سوف يعود بھذه القيمة وسوف‬
‫يكون االستدعاء كمايلي ‪:‬‬

‫‪declare‬‬
‫;‪m studys.mark%type‬‬
‫‪begin‬‬
‫;)‪stu_mark1(111,'225CS',m‬‬
‫;)‪DBMS_OUTPUT.PUT_Line(m‬‬
‫;‪end‬‬
‫‪/‬‬

‫وسوف يكون الناتج ھو ‪ ٩٠‬وھذا صحيح بناء على الجدول‪.‬‬


‫‪moon‬‬

‫الوظائف المخزنة‬
‫كان درسا السابق عن االجراءات المخزنة واليوم لدينا درس مشابه له وھو الوظائف المخزنة‬
‫لكن الفرق ان الوظائف البد ان تعيد قيمة‬

‫والصسغة العامة لتكوين وظيفة كمايلي‪:‬‬

‫‪CREATE [OR REPLACE] FUNCTION function-name‬‬


‫] )‪[(argument1 ... [, argumentN‬‬
‫‪RETURN function-datatype IS‬‬
‫]‪[local-variable-declarations‬‬
‫‪BEGIN‬‬
‫‪executable-section‬‬
‫]‪[exception-section‬‬
‫‪RETURN function-value‬‬
‫;]‪END [function-name‬‬

‫حيث أن‬

‫‪ function_name‬اسم الوظيفة المستخدمه‪.‬‬

‫اما ‪ REPLACE OR‬فھي توضع حينما تعلم ان االجراء موجود من السابق‪.‬‬

‫اما عن المغيرات التي بين القوسين فھي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب‬
‫معدل طالب وتريد تمرير رقم الطالب الذي تريد حساب معدله فھذه ھي تعتبر كمدخالت ‪ ،‬وھي‬
‫بنفس الطريقة التي تعاملنا بھا مع االجراءت المخزنة التغير على المتغيرات وطرق تعريفھا‪.‬اما‬
‫‪ datatype RETURN‬فھي تدل على نوع القيمة المعادة من الوظيفة ‪.‬‬

‫مثــــــــال ‪ :‬في الجدول الذي قمنا بدراسته في الدرس الرابع وكان بأسم ‪ studys‬وكان كمايلي‬
‫‪:‬‬

‫‪NO_STU COURSE_CODE MARK‬‬ ‫‪POINT‬‬


‫‪111‬‬ ‫‪216CS‬‬ ‫‪88‬‬ ‫‪13.5‬‬
‫‪222‬‬ ‫‪225CS‬‬ ‫‪75‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪225CS‬‬ ‫‪40‬‬ ‫‪3‬‬
‫‪111‬‬ ‫‪225CS‬‬ ‫‪90‬‬ ‫‪14.25‬‬
‫‪222‬‬ ‫‪216CS‬‬ ‫‪78‬‬ ‫‪10.5‬‬
‫‪333‬‬ ‫‪216CS‬‬ ‫‪85‬‬ ‫‪13.5‬‬

‫لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى الوظيفة ثم يتم‬
‫حساب المعدل الفصلي للطالب‬
moon

‫ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات لمقررات‬

: ‫والنشاء الوظيفة كمايلي‬

create or replace function stu_avea(stnum in


1
studys.NO_STU%type)
2
return real
3
as
4
hour courses.hours%type;
5
avrage number(4,2);
6
sum_hours courses.hours%type:=0;
7
point studys.POINT%type;
8
total_Point studys.POINT%type:=0;
9
codem courses.CODE%type;
10
cursor sumpoint
11
is
12
select COURSE_CODE,POINT
13
from studys
14
where NO_STU=stnum;
15
begin
16
open sumpoint;
17
loop
18
fetch sumpoint into codem,point;
19
exit when sumpoint%notfound;
20
select hours
21
into hour
22
from courses
23
where code=codem;
24
total_Point:=total_Point+point;
25
sum_hours:=sum_hours+hour;
26
end loop;
27
close sumpoint;
28
avrage:=total_Point/sum_hours;
29
return avrage;
30
end;

: ‫الشرح‬

‫ لتعريف الوظيفة‬:١ ‫السطر رقم‬


‫ نوع القيمة التي سوف ترجع بھا الوظيفة‬:٢ ‫السطر رقم‬
‫ تعريف متغير عدد الساعات وھو نفس حقل عدد ساعات المقرر الموجودة في‬:٤ ‫السطر رقم‬
courses ‫جدول‬
‫‪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‬‬

‫وھذا سبب ظھور الدالة ‪distinct‬‬


‫‪moon‬‬

‫الحزم البرمجية و الزنادات‬


‫أھداف الفصل‬

‫سنتناول في ھذا الفصل ان شاء ﷲ ‪:‬‬

‫‪ -٦‬ماھية الحزم البرمجية‬


‫‪ -٧‬كيقية انشاء الحزم البرمجية ومكوناتھا‬
‫‪ -٨‬ماھية الزنادات‬
‫‪ -٩‬التعامل مع الزنادات‬
‫قوائد الزنادات‬ ‫‪-١٠‬‬
‫‪moon‬‬

‫الحزم البرمجية‬
‫تعلمنا سابقا كيفية انشاء االجراءت والوظائف المخزنة‪ .‬لكن مارأيك لو وجد لدينا قاعدة بيانات‬
‫كبيرة جدا ولنضرب مثال انھا تحتوي على ‪ ٥٠‬اجراء او وظيفة وظيفة او اجراء لھا عمل خاص‬
‫ولنفرض ان ھذه القاعدة ھي لمحل تجاري ضخم يحتوي على بيانات العمالء وبيانات الموظفين‬
‫وبيانات االصناف التجارية وبيانات المخزون وغيرھا من بيانات ‪ ،‬ولذلك فان بعض ھذه‬
‫االجرائيات والوظائف المخزنة مختص بالعمالء مثال وجود اجراء لحساب اجمالي عميل‬
‫وغيرھا من االجرائيات ‪ ،‬ومثل وجود اجرئيات خاصة بالموظفين مثال اجرائية خاصة بحساب‬
‫راتب الموظف بعد حذف الحسومات واضافة العالوات وغيرھا ايضا ‪ ،‬لكن وضعھا في ھذا‬
‫الشكل في قاعدة البيانات قد يسسب لك بعض االرباك لذلك مارأيك بان تجمع كل الوظائف‬
‫واالجرائيات الخاصة بكل قسم في مجموعة لوحدھا وھذه المجموعة تدعي الحزمه ‪package‬‬
‫مثال نجمع كل اجرائيات والوظائف الخاصة بالعمالء في حزمة خاصة‬

‫فوائد استخدام الحزمة‬

‫‪ -١‬تجميع وحدات ‪ pl/sql‬المرتبطة‪.‬‬


‫‪ -٢‬اداء افضل‪.‬‬
‫‪ -٣‬تكون السرية افضل‪.‬‬
‫‪ -٤‬اھم شيء ھو في عملية الصيانه حيث تسھل عملية الصيانة باستخدامم الحزم‪.‬‬

‫مكونات الحزم‬

‫تتكون الحزمة من جزءين االول وھو الوصف ‪ specification‬ويحتوي على التعاريف مثل‬
‫متغيرات او مؤشرات او اسماء االجراءت ومتحولتھا‪.‬‬
‫اما الجز الثاني فھو جسم الحزمة ويحتوي على تفاصيل االجراءت والعمليات وغيرھا‬
‫والصيغة العامة النشاء الجزء االول كمايلي ‪:‬‬

‫‪CREATE OR REPLACE PACKAGE pack_name AS‬‬


‫‪.........‬‬
‫‪.........‬‬
‫‪.........‬‬
‫;‪end‬‬

‫والصيغة العامة النشاء الجزء الثاني كمايلي ‪:‬‬

‫‪CREATE OR REPLACE PACKAGE BODY pack_name AS‬‬


‫‪.........‬‬
‫اﻟﺤﺰﻣﺔ ﺟﺴﻢ‬
‫‪.........‬‬
‫;‪end‬‬

‫لكن يجب ان يكون اسم الحزمة في الجزء االول ھو نفس اسم الحزمة في الجزء الثاني‪.‬‬
moon

: ‫مــثال‬

‫لنقم بانشاء حزمة تحتوي على وظيفة لحساب معدل طالب واجراء لطباعة المعدل‬
stu_avea ‫ولذلك سوف نستخدم نفس الوظيفة التي انشناھا في الدرس السادس والتي اسمھا‬
‫ الجزء االول من الحزمة‬. ‫والتي تقوم بحساب معدل الطالب واالن نبداء بانشاء الحزمة‬
: ‫ كمايلي‬specification

CREATE OR REPLACE PACKAGE student AS


function stu_avea(stnum in
studys.NO_STU%type)return real;
procedure print_ave(avrage in real);
end;

‫كمايلي‬.‫االن نقوم بانشاء جسم الحزمة والتي تحتوي على التفاصيل‬

CREATE OR REPLACE PACKAGE BODY student AS


function stu_avea(stnum in studys.NO_STU%type)
return real
as
hour courses.hours%type;
avrage number(4,2);
sum_hours courses.hours%type:=0;
point studys.POINT%type;
total_Point studys.POINT%type:=0;
codem courses.CODE%type;
cursor sumpoint
is
select COURSE_CODE,POINT
from studys
where NO_STU=stnum;
begin
open sumpoint;
loop
fetch sumpoint into codem,point;
exit when sumpoint%notfound;
select hours
into hour
from courses
where code=codem;
total_Point:=total_Point+point;
sum_hours:=sum_hours+hour;
end loop;
‫‪moon‬‬

‫;‪close sumpoint‬‬
‫;‪avrage:=total_Point/sum_hours‬‬
‫;‪return avrage‬‬
‫;‪end‬‬

‫)‪procedure print_ave(avrage in real‬‬


‫‪as‬‬
‫‪begin‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(avrage‬‬
‫;‪end‬‬
‫;‪end‬‬

‫ويحتوي جسم الحزمة كمانالحظ على مكونات الوظيفة واالجراء الذي تم تعريفھما في وصف‬
‫الحزمة حيث ان الوظيفة لحساب المعدل واالجراء لطباعة المعدل‪.‬‬

‫طريقة استدعاء اجراء او وظيفة موجود داخل حزمة ‪:‬‬

‫تتم عملية االستدعاء كمايلي ‪:‬‬

‫‪pack_name.func_proc_name‬‬

‫اي اسم الحزمة اوال ثم نقطة ثم اسم االجراء او الوظيفة مـــــــثال ‪:‬‬

‫‪set serveroutput on‬‬


‫‪declare‬‬
‫;‪aa real‬‬
‫‪begin‬‬
‫;)‪aa:=student.stu_avea(111‬‬
‫;)‪student.print_ave(aa‬‬
‫;‪end‬‬
‫‪/‬‬

‫وبعد التفيذ يكون الناتج ھو معدل الطالب الذي رقمه ‪ ١١١‬الحظ اول شي استدعينا داله حساب‬
‫المعدل ووضعناھا في المتغير ‪ aa‬ثم استدعينا اجراء الطباعة ليتم طبعة على الشاشة‪.‬‬

‫واالن و بعد ان تعرفت على فائدة الحزم مارأيك من االن فصاعد ان تستخدم الحزم في كتابة‬
‫االجرائيات والوظائف‬
‫‪moon‬‬

‫الزنادات ‪TRRIGERs‬‬
‫تتشابه الزنادات مع البرامج الفرعية اال في الطرق التالية ‪:‬‬

‫* يتم تنفيذ الزنادات ضمنيا‪،‬عندما يعدل الجدول بالرغم من عمل المستخدم او التطبيقات على‬
‫الجدول ‪.‬‬

‫* يتم تعريف الزنادات للجدول الخاص بقاعدة البيانات‬

‫* التقبل الزنادات المعامالت‬

‫تعد الزنادات ھامة جدا في تطوير نظم البيانات الموجھة الخاصة باالنتاج ‪.‬‬

‫تركيب الزناد ‪:‬‬

‫>‪create [or replace] Trigger <TRRIGER_NAME‬‬


‫>‪<before|after] [instead of] trigger event on <table name‬‬
‫]]‪[for Each row [whene triggering restriction‬‬
‫>‪<trigger body‬‬

‫كماھو مع االجراءات المخزنة امكانية استخدام ‪ replace‬لكي تقوم بالتعديل على الزناد اذا كان‬
‫موجود والتقوم بانشاءه من جديد‪.‬‬
‫ينفذ التوقيت الخاص بالزناد سواء نفذ الزناد قبل او بعد اغالق الزناد بواسطة الخيارين ‪before‬‬
‫و ‪ ، after‬لكن خيار ‪ after‬اكثر كفاءة الن قطع البيانات المؤثرة يجب ان تقراء منطقيا مرة‬
‫للزناد ومرة لعبارة ‪trigger‬‬
‫مالحظة‪ /‬ان حدث اطالق الزناد ھو جملة ‪ sql‬التي تجعل الزناد وحدث االطالق اما ‪ update‬او‬
‫‪ delete‬او ‪ insert‬او بكليھما‪..‬‬
‫ويوجد اربعة انواع من الزنادات‪:‬‬
‫‪ -١‬صف ‪after.‬‬
‫‪ -٢‬جملة ‪after.‬‬
‫‪ -٣‬صف ‪before.‬‬
‫‪ -٤‬جملة ‪before.‬‬
‫وكل زناد من اجل جملة ‪ update‬او ‪ insert‬او ‪ delete‬كل زناد يعد نوع واحد من ) ‪instead‬‬
‫‪ (of , after,before‬ويمكن تعريف تسع زنادات للجدول الواحد‪..‬‬

‫* معالجة احداث اطالق الزناد ‪:‬‬


‫او على توليفة من ھذه ‪ delete‬او ‪ update‬او ‪insert‬يحتوي حدث اطالق الزناد على عملية‬
‫العمليات عندما يتعامل زناد واحد مع اكثر من عملية واحدة‪ ،‬فيمكنك ان تستخدم دعائم شرطية‬
‫للتعرف على نوع العبارة التي تستخدم لتنفيذ الجزء الخاص بالرمز في الزناد‬
‫والدعائم ھي كمايلي‪:‬‬
‫;‪IF inserting then .....end if‬‬
‫;‪IF updating then .....end if‬‬
‫;‪IF deleting then .....end if‬‬
‫‪moon‬‬

‫قيد الزناد‬

‫يحدد ھذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد‪.‬‬
‫على سبيل المثال الزناد التالي ‪ stduent_trigger‬ال يتم حدوثة اال اذا كان رقم الطالب‬
‫‪ student_id‬اقل من ‪١٠٠‬‬

‫‪create or replace trigger stduent_trigger‬‬


‫‪before insert or update on student‬‬
‫‪for each row‬‬
‫)‪when(new.student_id<100‬‬

‫قيود على انشاء الزنادات‪:‬‬

‫‪ -١‬يمكن للنص ان يحتوي على جمل ‪ dml sql‬لكن جمل ‪ select‬يجب ان تكون جمل ‪select‬‬
‫‪into‬‬
‫‪ -٢‬اليسمح بجمل التحكم )‪( commit,savepoint,rollback‬‬
‫‪-٣‬اليمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد‪.‬‬

‫مـــــــــــــــــثال ‪:‬‬

‫لنفرض انه لدينا الثالث جداول التالية‪:‬‬

‫االول ‪ :‬ھو جدول ‪ player‬بيانات جميع الالعبين في النادي سواء درجة شباب او درجة ممتاز ‪:‬‬

‫‪no_player name‬‬ ‫‪date_birth phone address levels‬‬


‫‪1‬‬ ‫‪talal‬‬ ‫‪11/11/1973 123456 riyadh1 1‬‬
‫‪2‬‬ ‫‪mohammed 1/1/1982 654321 riyadh2 2‬‬
‫‪3‬‬ ‫‪sami‬‬ ‫‪1/1/1988 123789 riyadh3 2‬‬
‫‪4‬‬ ‫‪yosif‬‬ ‫‪12/3/1970 123123 riyadh4 1‬‬

‫حيث ‪ level‬تمثل الدرجة التي يلعب بھا الالعب حيث ‪ ١‬تمثل الدرجة االولى الممتاز ‪ -‬و ‪ ٢‬تمثل‬
‫الشباب ‪.‬‬
‫‪moon‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table player‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪name varchar2(50),‬‬
‫‪date_birth date,‬‬
‫‪phone varchar2(9),‬‬
‫‪address varchar2(20),‬‬
‫;))‪levels number(2‬‬

‫الثاني ‪ :‬ھو جدول الالعبين في درجة الممتاز وھو خاص بالرواتب واسم الجدول ‪larg_player‬‬

‫‪no_player‬‬ ‫‪level_no‬‬ ‫‪salary‬‬


‫‪1‬‬ ‫‪1‬‬
‫‪4‬‬ ‫‪1‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table larg_player‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪level_no number(2),‬‬
‫;))‪salary number(7,2‬‬

‫الثالث ‪ :‬ھو جدول الالعبين في درجة الشباب وھو خاص بالرواتب واسم الجدول ‪youth‬‬

‫‪no_player‬‬ ‫‪level_no‬‬ ‫‪salary‬‬


‫‪2‬‬ ‫‪2‬‬
‫‪3‬‬ ‫‪2‬‬

‫والنشاء الجدول كمايلي ‪:‬‬

‫(‪create table youth‬‬


‫‪no_player varchar2(6) primary key,‬‬
‫‪level_no number(2),‬‬
‫;))‪salary number(7,2‬‬

‫االن نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم العب جديد وتحديد مستواه )شباب‬
‫او ممتاز( يقوم الزناد باختبار المستوى فاذا كان شباب اضاف رقم الالعب في جدول الشباب‬
‫وكذلك لوكان مستواه درجة اولى الممتاز فانه يضيف رقم الالعب في جدول ‪larg_player‬‬
‫وبذلك يكون الزناد كمايلي ‪:‬‬
moon

create or replace trigger player_age


before insert on player
for each row
begin
if inserting then
if :new.levels=1 then
insert into larg_player(no_player,level_no) values
(:new.no_player,:new.levels);
elsif :new.levels=2 then
insert into larg_player(no_player,level_no) values
(:new.no_player,:new.levels);
end if;
end if;
end;

: ‫بعد ذلك قم بادخال مايلي‬

insert into player values('1','talal','11/11/1973','123456','riyadh1',1);

‫الحظ ان المدخالت تمت على جدول‬player ‫ بعد ذلك اذھب وقما باالستعالم في جدول‬larg_player ‫سوف‬
.‫تجد انه اضاف رقم الالعب ھناك‬

‫المراجع‬

Oracle 8 Unleashed Second Edition – Sams -١


Introduction to Oracle: SQL and PL/SQL Using -٢
Procedure Builder (Electronic Presentation)1995
Oracle8 How-To -٣
Teach Yourself Oracle 8 In 21 Days -٤
moon

Mohamed ismael Mohamed


moonbook@live.com

You might also like