‫أوراكل‬

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

‫مفاهيم قواعد البيانات‬
‫قاعدة البيانات ‪Database‬‬
‫هي مجموعه من الملفات المنظمة بحيث يسهل الوصول إليها عندمت نريداستردادها‬
‫قاموس البيانات ‪Data Dictionary‬‬
‫هو مجموعة من المعلومات عن جداول وفهارس البيانات تحقظ داخل هذا القاموس ‪ ،‬يستخدمها نظام إدارة قواعد‬
‫البيانات‬
‫الستعلم ‪Query‬‬
‫هو نظام استفساري للستعلم عن بيانات معينة وغاليا ل يغير الستعلم في قاعدة البيانات حيث إن غالبية نظم‬
‫الستعلم عبارة عن قراءة فقط للبيانات‬
‫دوال ‪Function‬‬
‫عبارة عن مجموعة من تعليما ت أو أوامر تستخدم ضمن مسمى وظيفي لداء عملية محددة وغالبا تعيد الدالة قيمة‬
‫معينه بعد تنفيذها‬
‫الجراء ‪Procedure‬‬
‫مجموعة من التعليمات مثل تعليمات الدالة بهدف تنفيذ مهمة محددة لكن الجراء ل يعيد قيمة مثل الدالة‬
‫مخطط ‪Schema‬‬
‫عبارة عن مجموعة من الكائنات ‪ Objects‬مرتبطة بقواعد البيانات ويتألف مخطط الكائن من كائنات مثل الجداول‬
‫‪ Tables‬والجراءات ‪ Procedure‬والعروض ‪ Views‬والفهارس ‪... Directories‬الخ‬
‫مدير قواعد البيانات ‪(Database Administrator (DBA‬‬
‫هو الشخص المسؤؤل عن عمليات إدارة قواعد البيانات ونظم أداء هذه القواعد وكيف يتم تكوينها وهو مسوؤل أيضا‬
‫عن مراقبة أداء هذه القواعد ‪ ،‬وكذلك إجراء عمليات النسخ الحتياطي وتثبيت البرامج ‪ ،‬والمحافظة على أمن‬
‫المعلومات ‪ ,‬وإذافة مستخدمين جدد أو إلفاء صلحيات مستخدمين‬
‫ويمكن ان يقوم مدير قواعد البيانات بالتخطيط لتطير وتنمية النظام المطبق ‪ ،‬وتحديد الحاجو لهذه التطورات المستقبلية ‪.‬‬
‫ويسعى فريق العمل الذي يتكون من مديري قواعد البيانات ‪ DBA‬للحفاظ على سير العمل داخل الشركة بشكل متجانس‬
‫‪ .‬وتتم تجزئة المهام بين هؤلء المديرين ‪.‬‬
‫مهام مدير قواعد البيانات (‪)DBA‬‬
‫تتباين مهام مدير قاعدة البيانات تبعا لحجم الشركة أو المؤسسة وتبعا لفريق العمل المساعد وتشمل هذه‬
‫المهام النقاط التالية ‪:‬‬
‫‪-1‬تثبيت البرمجيا الجديدة‬
‫‪-1‬إدارة الحماية لنظام قواعد البيانات‬
‫‪-2‬النسخ الحتياطي والدوري للبيانات ونظام قواعد البيانات‬
‫‪1‬‬

‫‪ - 4‬استكشاف الخطاء ومعالجتها‬
‫‪ -5‬تسوية وإصلح إخفاقات المساخدمين للوصول إلى بياناتهم‬
‫‪-6‬متابعة ضبط أداء العمل‬
‫‪-3‬تقسسم الجهزة والنطم الجديدة‬
‫‪-4‬العمل على تطوير النظام بالشركة‬
‫نظام إدارة قاعد البيانات ‪)Data Base Management System )DBMS‬‬
‫هو عبارة عن مجموعة الدوات البرمجيه ( البرامج ( التي تدير وتنظم قاعدة البيانات وتوجد علقة ارتباط بين هذه‬
‫البيانات تسمى علقة (‪ (Relation‬لذا احبانا يطلق عليها ‪ RDBMS‬أي نظام إدارة قواعد البيانات العلئقية‬
‫( الرتباطية (‬
‫مميزات نظام إدارة قاعدة البيانات أوراكل‬
‫يتميز نظام قاعدة البيانات أوراكل عن غيره من نظم إدارة قواعد البيانات الخرى بالتي‪:‬‬
‫‪-1‬القدرة الفائقة على استيعاب كميات كبيرة من البيانات قد يصل عدد السجلت إلى المليين مع الحفاظ على‬
‫المستوى العالي في الداء والسرعة عند استرجاع والتخزين والحذف‬
‫‪-2‬لسرية التامة والمن ل حتوائه على نظام الصلحيات والحقوق الذي يضمن تطبيق الشروط القياسية‬
‫والمنية للحفاظ على قاعدة البيانات‬
‫‪-3‬فعالية التحكم المركزي بالبيانات لذي يضمن ‪:‬‬
‫•تقليل التكررات عير اللزمة في البيانات الدخلة (‪(No Repetition‬‬
‫•تجنب التناقض بين البيانات (‪(No Contradiction‬‬
‫•إمكانية التشارك في البيانات (‪(Data Sharing‬‬
‫•الحفاظ على تكامل البيانات فيما بينها (‪(Data Integrity‬‬
‫‪-4‬السيطرة التامة على عملية النسخ الحتياطي لقاعدة البيانات وحمايتها من الفقدان أو التلف مع امكانية‬
‫استرجاعها في أي لحظة‬

‫‪2‬‬

‫عمليات نظام إدارة قاعدة البيانات‬
‫يشتمل نظام إدارة قاعدة البيانات اوراكل على العمليات التالية‬
‫‪-1‬أوامر لغة تعريف البيانات ‪)Data Definition Language )DDL‬‬
‫تستخدم هذه اللغة في تعريف وإنشاء الكائن ‪ ، Object‬ويمكن أن يكون الكائن ملفات وجداول بيانات ‪ ،‬فيمكننا‬
‫إنشاء وتعديل وحذف الكائن ويمكننا إنشاء امتياز لمستخدم معين ‪ ،‬أو انشاء كائن خيارات لفحص وإضافة‬
‫تعليقات إلى قاموس البيانات ومن هذه الوامر ‪CREAT , DROP and ALTER :‬‬
‫‪-2‬أوامر لغة معاملة البيانات ‪)Data Manipulation Language )DML‬‬
‫تتيح هذه الوامر التعامل مع البيانات وتعديلها ضمن الكائن الموجود ‪ Object‬ومن هذه الوامر ‪SELECT, :‬‬
‫‪DELETE,UPDATE and INSERT‬‬
‫‪-3‬أوامر لغة التحكم في البيانات ‪)Data Control Language )DCL‬‬
‫تتيح هذه الوامر التحكم في قاعدة البيانات وأدائها كالصلحيات والمستخدمين والحقوق وغالبا ماتكون هذه‬
‫الوامر مخصصة للستخدام من قبل مدير قاعدة البيانات (‪ (DBA‬ومن هذه الوامر ‪GRANT and :‬‬
‫‪REVOKE‬‬

‫التركيب الداخلي لنظام أوراكل‬
‫أهداف الفصل‬
‫يتناول هذا الفصل التركيب الداخلي لنظام قتعدة البيانات أوراكل وفي نهاية هذا الفصل ستكون قادرا بمشيئة ال‬
‫على ‪:‬‬
‫‪-1‬فهم العلقات بين الجداول‬
‫‪-2‬تعريف نمذجة العلقة‬
‫‪-3‬فهم مكونات قاعدة البيانات العلئقية‬
‫‪-4‬فهم العلقة بين الخادم والمستفبد‬
‫‪-5‬قهم الخادم ‪SERVER‬‬
‫‪-6‬فهم المستفيد ‪Client‬‬

‫مقدمة في قواعد البيانات العلئقية‬
‫يقدم هذا الفصل التركيب والبناء الداخلي لنظام إدارة قواعد البيانات أوراكل ‪ ،‬فيحتوي على وصف سريع لمكونات‬
‫أوراكل وتعتمد غالبية تطبيقات نظم قواعد البيانات في بنائها على أحد نماذج قاعد البيانات التالية‪:‬‬
‫‪-1‬نموذج هيكلي (هرمي ( ‪Hierarchical Model‬‬
‫‪-2‬نموذج شبكي ‪Network Model‬‬
‫‪-3‬نموذج علئقي ‪Relational Model‬‬
‫‪-4‬نموذج شيئي ‪Object Model‬‬
‫‪3‬‬

‫في الماضي كان النموذج الول ( الهرمي ( الكثر انتشارا مع أجهزة الكمبيوتر الكبيرة ‪ Main Frame‬ثم بدا النظام‬
‫الثاني ( الشبكي ( في النتشار وخاصة مع التوسع في بناء وتركيب شبكات الحاسب وكانت هناك صعوبات في‬
‫استخدام النظامين الول والثاني ( الهرمي والشبكي ( نتيجة لستخدام مؤشرات البرمجة ( ‪ ( Pointers‬لربط سجلت‬
‫البيانات بعضها مع بعض ‪ ،‬لذا نجد أن إضافة أو تعديل أو حذف السجلت يحتاج إلى المزيد من قهم طبيعة وعمل‬
‫المؤشرات وفي هذه الفترة الماضية طرق برمجة المؤشرات تكتب بلغة الكوبول (‪.(COBOL‬‬
‫أما النموذج العلئقي (‪ (Relational‬فهو الكثر سهولة في الستخدام وفي برمجة تطبيقات نظم قواعد البيانات ومن‬
‫الناحية النظرية الكاديمية فيلزمك دراسة المفاهيم الساسية والضروربة لهذا النموذج العلئقي لهذا سنركز هنا على‬
‫‪-1‬هيكل البيانات العلئقية ‪Relational Data Structure‬‬
‫‪-2‬الضوابط الحاكمة للبيانات العلئقية ‪Constraint that govern organization of data structure‬‬
‫‪-3‬العمليات التي تجرى على هذه البيانات ‪Operations that are performance data structure‬‬
‫ويعتمد نام هياكل البيانات العلئقبة (‪ (Relational Database‬على هيكل منطقي ويطلق عليه علقة (‬
‫‪ (Relational‬وعلى شكل ثنائي البعاد (‪ ( Tow dimensional data structure‬يتكون من صفوف‬
‫وأعمدة ويسمى جدول (‪ (Table‬هذا بالضافة إلى عناصر البيانات (‪ (Data elements‬تسمى في هذه‬
‫الحالة ‪ attributes‬علوة على هذا يتم تنظيم هذه البيانات الفعلية في وحدة أو وحدات تسمى ‪ Tuples‬تقسم إلى‬
‫صفوف ‪ Rows‬أو (سجلت ‪ ( Records‬وأعمدة ‪( Columns‬حقول ‪ ( Fields‬والشكل التالي يبين‬
‫العناصر الساسية لجدول الموظقين ‪Employees‬‬

‫‪4‬‬

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

‫نمذجة العلفة ‪Relational Model Algebra‬‬
‫تعرف بانها العمليات التي يتم اجراؤها على جدول أو مجموعة من الجداول تبعا لعلقة محددة ويوجد معاملن‬
‫‪ Operators‬هما ‪ Unary‬والثاني ‪ Binary‬والجدول التالي يعدد سبعة انواع لهذه العمليات‬
‫وصف العملية‬
‫تجميع الصفوف السجلت من جدولين مع عدم‬
‫السماح بنكرار سجلت‬
‫تحديد السجلت (الصفوف( المشتركة بين‬
‫جدولين‬
‫اظهار السجلت الموجودة في الجدول الول‬
‫ول توجد في الجدول الثاني‬
‫إظهار السجلت مع بعض العمدة (مصدر‬
‫البيانات(‬
‫إظهار السجلت من جدول مصدر البيانات تبعا‬
‫لمعيار البحث ‪Criteria‬‬
‫وصل كل سجل من جدول البيانات الول مع كل‬
‫سجل في الجدول الثاني‬
‫وصل وتمديد السجلت من الجدول الل مع‬
‫مايقابله من سجلت في الجدول الثاني‬

‫‪5‬‬

‫نوع العملية ‪Type‬‬
‫‪Binary‬‬

‫العملية ‪Operation‬‬
‫‪Union‬‬

‫‪Binary‬‬

‫‪Intersection‬‬

‫‪Binary‬‬

‫‪Difference‬‬

‫‪Unary‬‬

‫‪Projection‬‬

‫‪Unary‬‬

‫‪Selection‬‬

‫‪Unary‬‬

‫‪Product‬‬

‫‪Unary‬‬

‫‪Join‬‬

‫مكونات قاعدة البيانات العلئقية ‪RDBMS Components‬‬
‫تتكون قاعدة البيانات العلئقية من ‪:‬‬
‫‪-1‬نظام تشغيل ثاعدة البيانات ويطلق عليه ‪Kernel‬‬
‫‪-2‬قاموس البيانات ‪Data Dictionary‬‬
‫ويتكون نظام تشغيل وتنظيم قاعدة البيانات (‪ (Kernel‬من مجموعة من الوحدان البرمجية ‪ Software‬والذي صمم‬
‫بيحكم وينظم وينعامل مع البيانات مابين حفظ واسترجاع وطباعة وكذلك تحديد المسؤليات وعمل نظم المان وحماية‬
‫البيانات‬
‫وعادة يحتفظ نظام قاعدة البيانات بقائمة من المستخدمين الذين لهم صلحية للتعمل مع تطبيق قاعدة البيانات والشكل‬
‫التالي يوضح بعضا من مكونات الـ ‪ Kernel‬في نظام أوراكل‬

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

‫‪6‬‬

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

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

‫‪7‬‬

‫العلقة بين الخادم والمستفيد(العميل) ‪Client/Server‬‬
‫يتكون نظام أوراكل من مكونين‬
‫‪-1‬الخادم ‪Server‬‬
‫‪-2‬المستفيد (العميل – المزود( ‪Client‬‬
‫الخادم ‪Server‬‬
‫يحوي الخادم قاعدة البيانات المركزية ووظائفها ‪ ،‬وكذلك كافة العمليات الخلفية لحفظ هذه الفاعدة وبحوي ايضا أدوات‬
‫تشغيل وإيقاف فاعدة البيانات‬
‫والشكل التالي يوضح البناء الداخلي لنظام الخادم‬

‫مدير الخادم‬
‫‪Server‬‬
‫‪Manager‬‬

‫بروتكول اتصال‬
‫الشبكة ‪Net8‬‬

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

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

‫نظام التحميل‬
‫‪LOADER‬‬

‫المترجمات‬
‫‪Pre‬‬
‫‪compliers‬‬

‫المستفيد ‪Client‬‬
‫أما المستفيد ‪ Client‬فيحتوي على برامج الخدمات والبرامج المساعده والتي بمكننا تشغيلها عن بعد باستخدام الشبكة‬
‫كما يتضمن نظام المستفيد الوسيط الرسومي ‪ Graphical Interface‬الذي يسهل علينا استخدامه وتوجد أداة التصال‬
‫بين الخادم والمستقيد وهي ‪ Net 8‬لتقوم بعمليات الربط والتصال عبر الشبكة‬
‫و تشمل حزمة البرامج لنظام المستفيد على‬
‫‪-1‬مدير المشروع ‪Enterprise Manager‬‬
‫ويحوي داخله المكونات التالية‬
‫•متحكم مدير المشروع ‪Enterprise Manager‬‬
‫•مدير مخطط قاعدة البيانات ‪Schema Manager‬‬
‫•مدير السرية ‪Security Manager‬‬
‫•مدير الطبعة ‪Instance Manager‬‬
‫•مدير التخزين ‪Storage Manager‬‬
‫‪8‬‬

‫•مدير البيانات ‪Data Manager‬‬
‫•مدير النسخ الحتياطي للبيانات ‪Backup and Recovery Manager‬‬
‫•ورقة عمل الستعلم ‪SQL Worksheet‬‬
‫•شريط أدوات المسؤول ‪Administrator Toolbar‬‬
‫‪-2‬المساعدون ‪Assistants‬‬
‫‪-3‬نظام الستعلم ‪SQL*PLUS‬‬

‫بروتكول اتصال‬
‫الشبكة‬
‫(‪(Net8‬‬

‫والشكل التالي يوضج مكونات حزمة البرامج للمستفيد ‪Client‬‬
‫نظام الستعلم ‪SQL*PLUS‬‬
‫المساعدون ‪Assistants‬‬
‫مدير المشروع ‪Enterprise Manager‬‬
‫متحكم مدير المشروع‬
‫ورقة عمل الستعلم ‪ SQL‬مدير مخطط قاعدة البيانات‬
‫‪Enterprise Manager‬‬
‫‪Schema Manager‬‬
‫‪Worksheet‬‬
‫مدير الطبعة ‪Instance‬‬
‫‪Manager‬‬

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

‫مدير السرية ‪Security‬‬
‫‪Manager‬‬

‫شريط أدوات المسؤول‬
‫‪Administrator‬‬
‫‪Toolbar‬‬

‫مدير التخزين ‪Storage‬‬
‫‪Manager‬‬

‫مدير البيانات ‪Data‬‬
‫‪Manager‬‬

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

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

‫أساسيات جملة ‪SELECT‬‬
‫جملة ‪SELECT‬‬
‫تستخدم جملة ‪ SELECT‬لسترجاع البيانات المخزنة في جدول أو عدة جداول حيث أن عملية السترجاع ل تعدل في‬
‫هذه البيانات ويمكننا من خلل جملة ‪ SELECT‬أن نقوم بالتالي‪:‬‬
‫‪-1‬اختيار وعرض مجموعة معينة من السجلت المخزنة في الجدول‬
‫‪-2‬استرجاع بيانات بعض حقول الجدول‬
‫‪-3‬استرجاع بيانات مخزنة في جداول مختلفة‬
‫ملحظة‬
‫يمكن أن نستخدم كل أو بعض هذه المزايا في جملة استفسار واحدة‬
‫ملحظة‬
‫أوامر محرر ‪SQL*PLUs‬‬
‫هنالك بعض الوامر البسيطة التي ستساعدك في كتابة وتحرير وتنفيذ الوامر على محرر ‪SQL‬‬
‫ومنها‬
‫‪-1‬المر ‪ EDIT‬ويمكن كتابته ‪ : ED‬يستخدم هذا المر لتحرير آخر امر تم كتابته على مرر ‪SQL‬‬
‫وعند تنفيذ هذا المر ستفتح لك شاشة المحرر (المفكرة( التي يمكنك خللها اعادة تحرير المر‬
‫وعند النتهاء من ذلك احفظ المر ثم اغلق شاشة المفكرة ولكن لحظ ل تكتب الفاصلة المنقوطة (;(‬
‫بعد نهاية المر في هذه الحالة فقط‬
‫‪ -2‬المر ‪ R‬وطريقة كتابته (‪ (/‬ويستخدم لعادة تنفيذ اخر امر ‪ SQL‬محفوظ‬
‫الشكل العام لجملة ‪SELECT‬‬
‫}… ‪SELECT { * , COLUMN [alies],‬‬
‫; ‪FROM table_name‬‬
‫حيث أن‬
‫‪ COLUMN‬اسم الحقل‬
‫‪table_name‬اسم الجدول‬
‫تسمية العمود‬
‫‪alies‬‬
‫يمكن أن نضع الرمز * للدللة على استرجاع جميع حقول الجدول‬

‫كتابة جمل ‪SQL‬‬
‫نوضح فيما يلي بعض القواعد الرشادية التي يجب أن توضع بعين العتبار غند كتابة جمل ‪SQL‬‬
‫‪-1‬يمكن كتابة جمل ‪ SQL‬بالحروف الكبيرة أو الصغيرة‬
‫‪-2‬يمكن كتابة جمل ‪ SQL‬في عذة أسطر‬
‫‪-3‬ل يمكن فصل الكلمات المحجوزة عبر السطور مثل ‪FROM‬‬
‫‪-4‬اترك مساقات بين مكونات الجملة لتسهيل عملية القراءة‬
‫‪-5‬في برنامج ‪ SQL *PLUS‬تكتب الوامر مع مؤشر ‪ SQL‬ويتم تخزين هذا المر مباشرة في الذاكرة‬
‫‪10‬‬

‫مثال‬

‫;‪SELECT * FROM s_dept‬‬
‫‪REGION_ID‬‬
‫‪---------‬‬‫‪1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪1‬‬

‫‪ID NAME‬‬
‫‪-------- ------------‬‬‫‪10 Finance‬‬
‫‪31 Sales‬‬
‫‪32 Sales‬‬
‫‪33 Sales‬‬
‫‪34 Sales‬‬
‫‪35 Sales‬‬
‫‪41 Operations‬‬
‫‪42 Operations‬‬
‫‪43 Operations‬‬
‫‪44 Operations‬‬
‫‪45 Operations‬‬
‫‪50 Administration‬‬
‫‪12 rows selected.‬‬

‫لتنفيذ جمل ‪SQL‬‬
‫‪-1‬نضع فاصلة منقوطة في نهاية الجملة في مؤشر ‪SQL‬‬
‫‪-2‬نضع علمة ‪ /‬في نهاية الجملة في مؤشر ‪SQL‬‬
‫‪-3‬نضع علمة ‪ /‬في نهاية الجملة في المر في الذاكرة (‪(BUFFER‬‬
‫‪-4‬كتابة عبارة ‪ RUN‬في نهاية الجملة في مؤشر ‪SQL‬‬

‫العمليات الحسابية‬
‫يمكن أن نستخدم العمليات الحسابية عند عرض البيانات دون أن تؤثر هذه المعالجة على البياانات المخزنة في‬
‫الجدول ‪ ،‬ويمكن أن يحتوي التعبير الحسابي على اسم الحقل قيمة ثابتة و العملية الحسابية‬
‫العمليات الحسابية‬
‫العمليات التي يمكن أن تستخدم هي‪:‬‬
‫‪+‬‬
‫‪ -1‬الجمع‬
‫‬‫‪ -2‬الطرح‬
‫÷‬
‫‪ -3‬القسمة‬
‫*‬
‫‪ -4‬الضرب‬
‫ويمكن استخدام هذه العمليات في حميع أجزاء جملة ‪ SELECT‬عدا الجزء الخاص بـ ‪FROM‬‬
‫أولويات العمليات‬
‫‪-1‬الفواس الداخلية ثم الخارجية ثم السس‬
‫‪-2‬الضرب والقسمة‬
‫‪-3‬الجمع والطرح‬

‫‪11‬‬

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

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

‫‪first_name||last_name‬‬
‫;‪s_emp‬‬

‫‪SELECT‬‬
‫‪FROM‬‬

‫‪Employees‬‬
‫‪------------------------------------------------‬‬‫‪CarmenVelasquez‬‬
‫‪LaDorisNgao‬‬
‫‪MidoriNagayama‬‬
‫‪MarkQuick-To-See‬‬
‫‪AudryRopeburn‬‬
‫‪MollyUrguhart‬‬
‫‪...‬‬
‫نلحظ ان السم الول اتصل بالسم الخير بدون وجود مسافات فظهر كانه اسم واحد ولكي توجد مسافات نكتب‬
‫;‪SELECT first_name ||' '|| last_name FROM s_emp‬‬

‫استخدام عبارة ‪DISTINCT‬‬
‫تستخدم عبارة ‪ DISTINCT‬لمنع تكرار ظهور بيانات السجل المسترجع فمثل إذا أردنا أن نعرف على الوائف‬
‫التي ينتسب إليها الموظفون والمخزنة في جدول الموظفين نجد أن هنالك وظائف تتكرر حسب عدد الموظفين الذين‬
‫ينتمون إليها لمنع تكرار نستخدم عبارة ‪DISTINCT‬‬
‫ويأخذ المر ‪ SELECT‬الشكل التالي‪:‬‬
‫}… ‪SELECT [DITINCT] { * , COLUMN [alies],‬‬
‫; ‪FROM table_name‬‬
‫حيث أن‬
‫‪ COLUMN‬اسم الحقل‬
‫‪table_name‬اسم الجدول‬
‫تسمية العمود‬
‫‪alies‬‬
‫‪ DITINCT‬لمنع التكرار‬

‫ملخص الفصل‬
‫‪12‬‬

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

‫‪13‬‬

‫استرجاع البيانات بشروط ترتيبها‬
‫اهداف الفصل‬
‫‪-1‬المعرفة التامة لسماء الجداول وأسماء الحقول وخصائصها وانواع البيانات‬
‫‪-2‬التعامل مع جملة ‪ SQL‬البسيطة (‪(SELECT Statement‬‬
‫‪-3‬استخدام أوامر محرر ‪SQL‬‬

‫استخدام جملة الشرط ‪WHERE CLAUSE‬‬
‫مقدمة‬
‫لقد قمنا في الوحدة السابقة بالتعرف الى جملة الستعلم البسيط (‪ (SELECT Statement‬التي من خللها تم‬
‫استرجاع البيانات من الجداول ‪ .‬وفي هذا الفصل سنتابع الحديث عن هذه الجملة يشكل أوسع ‪ ،‬حيث سنسترجع البيانات‬
‫من الجداول بناء على شروط معينة ‪ ،‬أو مرتبة حسب بيانات حقول معينة ‪ ،‬أي سندرس المور المتعلقة بجملة الشرط‬
‫في جملة السترجاع ‪ ،‬من حيث المعاملت الشرطية وطريقة التعبير عن الشرط والترتيب التصاعدي والترتيب‬
‫التصاعدي والترتيب التنازلي للبيانات‬
‫الصيغة العامة لجملة الشرط‬
‫}*|‪SELECT {Field1, Field2, ...,...‬‬
‫‪FROM Table1‬‬
‫;‪WHERE Condition‬‬
‫حيث أن‬
‫‪Field1.Field2‬‬
‫‪Table1‬‬
‫‪Condition‬‬

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

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

‫المور التي يجب أخذها بعين العتبار‬
‫‪ -1‬عند استخدام حقول النص وحقول التاريخ في جملة الشرط يجب وضع القيم بين علمتي تنصيص مفردتين (‘ ‘ (‬
‫‪ -2‬في حالة الحقول النصية يجب مراعاة حالة الحرف كبيرة أو صغيرة‬
‫‪ -3‬في الة حقول التاريخ يجب مراعاة صيغة التاريخ (‪ (FORMAT‬والصيغة السلسية للتاريخ هي كما يلي ‪DD-‬‬
‫‪MON-YY‬‬

‫معاملت المقارنة ‪COMPARISON OPERATORS‬‬
‫تشمل معاملت المقارنة الرموز التالية‪:‬‬
‫المعنى‬
‫يساوي‬
‫أكبر من‬
‫أقل من‬
‫أكبر من أو يساوي‬
‫اقل من أو يساوي‬
‫ل يساوي‬

‫المعامل‬
‫=‬
‫<‬
‫>‬
‫=<‬
‫=>‬
‫<>‬

‫تستخدم معاملت المقارنة في جملة الشرط لمقارنة تعبير بآخر في جملة ‪ WHERE‬كما في الصيغة التالية ‪:‬‬
‫تعبي ‪ OPERATOR‬تعبي ‪WHERE‬‬
‫مثال‬
‫’‪WHERE hiredate=’01-SEP-96‬‬
‫‪WHERE sal<=1500‬‬
‫’‪WHERE name=’Ahmed‬‬
‫‪WHERE sal>< other‬‬

‫معاملت مقارنة أخرى‬
‫المعامل‬
‫‪BETWEEN‬‬
‫‪IN‬‬
‫‪LIKE‬‬
‫‪IS NULL‬‬

‫‪15‬‬

‫نفى المعامل‬
‫‪NOT BETWEEN‬‬
‫‪NOT IN‬‬
‫‪NOT LIKE‬‬
‫‪IS NOT NULL‬‬

‫المعنى‬
‫بين قيمتين‬
‫ضمن قائمة من القيم‬
‫مطابقة نمط النص‬
‫هل هي قسمة فارغة‬

‫المعامل ‪BETWEEN‬‬
‫يستخدم هذا المعامل لسترجاع بيانات الصفوف التي تعتمد على مدى من القيم أي البيانات التي تقع بين قيمتين‬
‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫;‪WHERE sal BETWEEN 1500 AND 2500‬‬
‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين اقع رواتبهم بين ‪1500‬و ‪2500‬‬
‫ملحظة‬
‫ستم استرجاع بيانات الموظف الذي يببلغ راتبه تماما ‪ 1500‬أو ‪ 2500‬أي أن جملة ‪ BETWEEN‬تتضمن الحد‬
‫العلى والحد الدنى للقيم التي سيتم استرجاعها‬
‫‪-1‬المعامل ‪IN‬‬
‫يستخدم هذا المعامل للبحث عن قيمة داخل قائمة من القيم فتحتوي هذه القائمة قيما ثابتة أو قد تكون هذه القائمة عبارة‬
‫عن جملة استعلم فرعي‬
‫مثال‬
‫‪SELECT name, sal , deptno FROM S_EMP‬‬
‫;)‪WHERE detno IN (10,30‬‬
‫أي أنه سيتم استرجاع اسم الموظف وراتبه ورقم القسم الذي يعمل به للموظفين الذين يعملون في قسم رقم ‪ 10‬أو قسم‬
‫رقم ‪30‬‬
‫‪-2‬المعامل ‪.LIKE‬‬
‫يستخدم هذا المعامل للبحث عن نص معين داخل حقل نصي ‪ ،‬حيث سيتم مطابقة حروف النص المذكرة في جملة‬
‫الشرط‬
‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫;’‪WHERE name LIKE ‘S%‬‬
‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين تبدأ أسماؤهم بحرف ‪S‬‬
‫ملحظة‬
‫تستخدم الشارة ‪ %‬عوضا عن أي قيمة نصية ‪ ،‬قد تكون ل شيء أو أي عدد من الحروف للبحث مثل عن اسم معين‬
‫ينتهي بحرف ‪ A‬نكتب ‘‪ ’A%‬وللبحث عن نص يحتوي حرف ‪ A‬نكتب ‘‪ ’%A%‬وهكذا بإمكاننا أن نبحث عن أي‬
‫مقطع داخل حقل نصي معين‬

‫‪16‬‬

‫مثال‬
‫‪SELECT * FROM S_EMP‬‬
‫;’‪WHERE name LIKE ‘_A%‬‬
‫أي أنه سيتم استرجاع جمبع بيانات الموظفين الذين يكون الحرف الثاني في أسمائهم هو ‪A‬‬
‫ملحظة‬
‫تستخدم الشارة _ عوضا عن حرف واحد فقط‬
‫‪-3‬المعامل ‪IS NULL‬‬
‫يستخدم هذا المعامل لفحص القيمة (ل شيء( أي قيم القول التي ل تحتوي على بيانات‬
‫مثال‬

‫‪SELECT name, sal FROM S_EMP‬‬
‫;‪WHERE comm. IS NULL‬‬

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

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

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

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

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

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين يزيد راتبهم عن ‪ 2600‬وتقل عمولتهم في نفس الوقت عن‬
‫‪ 200‬أي انه يجب يتحقق الشرطين لسترجاع البيانات‬
‫‪-2‬المعامل ‪OR‬‬
‫‪17‬‬

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

‫‪SELECT name, sal FROM S_EMP‬‬
‫;‪WHERE sal <2000 OR deptno=30‬‬

‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموفين الذين يزيد راتبهم عن ‪ 2000‬أو يعملون في قسم رقم ‪ 30‬أي أنه‬
‫يجب يتحقق أي من الشرطين لسترجاع البيانات‬
‫‪-3‬المعامل ‪NOT‬‬
‫يقوم هذا المعامل بعكس قيمة منطقية من ‪ TRUE‬إلى ‪ FALSE‬والعكس‬
‫مثال‬
‫‪SELECT name, sal FROM S_EMP‬‬
‫;)‪WHERE deptno NOT IN (20,40‬‬
‫أي أنه سيتم استرجاع اسم الموظف وراتبه للموظفين الذين ل يعملون في القسمين رقم ‪ 20‬و رقم ‪ 40‬وفي هذه الحالة‬
‫تم عكس نتيجة المعامل ‪IN‬‬

‫أولويات المعاملت المنطقية ومعاملت المقارنة‬
‫إذا ورد أكثر من معامل منطقي في نفس ملة الشرط فإن أولوية تنفيذ هذه المعاملت من العلى إلى الدتى غي كالتالي‬
‫•‬
‫•القواس‬
‫•معاملت المقارنة (< ‪(>< ، = ، > ،‬‬
‫•‪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‬‬
‫‪18‬‬

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

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

‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ل يعملون في القسمين رقم ‪ 20‬ورقم ‪40‬وستكون البيانات مرتبة‬
‫تصاعديا حسب رقم الموظف‬
‫ويجوز كتابة الجملة السابقة دون المقطع ‪ 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‬‬
‫أي أنه سيتم استرجاع جميع بيانات الموظفين الذين ل يعملون في القسمين رقم ‪ 20‬ورقم ‪40‬وستكون البيانات مرتبة‬
‫تنازليا حسب رقم الموظف‬

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

‫‪19‬‬

‫الدوال الحرفية‬
‫اهداف الفصل‬
‫في نهاية هذا الفصل إن شاء ال ستكون قادر على ‪:‬‬
‫‪-1‬تحويل الحروف من صغيرة إلى كبيرة وبالعكس من خلل ‪SQL‬‬
‫‪-2‬ضبط ومحاذاة الحروف داخل النص الموجود في ‪SQL‬‬
‫‪-3‬القيام بحذف البيانات من الجداول‬
‫‪-4‬التعامل مع اللفظ الصوتي للبيانات‬
‫‪-5‬القيام بتعديل بيانات الجدول‬

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

‫)‪SELECT LOWER (name), LOWER (job‬‬
‫;‪FROM S_EMP‬‬

‫سيتم عرض اسم الموظف ووظبقته ولكن بحروف صغيرة‬
‫‪LOWER job‬‬
‫‪-------------------‬‬‫‪salesman‬‬
‫‪analyst‬‬
‫‪manager‬‬
‫‪manager‬‬

‫‪LOWER name‬‬
‫‪-------------------‬‬‫‪ali‬‬
‫‪ahmed‬‬
‫‪sami‬‬
‫‪khaled‬‬

‫دالة تحويل البيانات إلى حروف كبيرة ‪UPPER Function‬‬
‫تسنخدم هذه الدالة لتحويل البيانات من حروف صغيرة إلى حروف كبيرة ويتم استخدام هذه الدالة غاليا مع جمل أخرى‬
‫مثال‬
‫)‪SELECT UPPER (name), UPPER (job‬‬
‫;‪FROM S_EMP‬‬

‫‪20‬‬

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

‫)‪SELECT INITCAP (name), INITCAP (job‬‬
‫;‪FROM S_EMP‬‬

‫سيتم عرض اسم الموظف ووظبقته ولكن اول حرف في كلهما سيكون كبير‬
‫‪INITCAP job‬‬
‫‪-------------------‬‬‫‪Salesman‬‬
‫‪Analyst‬‬
‫‪Manager‬‬
‫‪Manager‬‬

‫‪INITCAP name‬‬
‫‪-------------------‬‬‫‪Ali‬‬
‫‪Ahmed‬‬
‫‪Sami‬‬
‫‪Khaled‬‬

‫دالة اقتطاع (قص) جزء من بيانات الحقل ‪SUBSTR‬‬
‫تستخدم لعرض أو قص جزء معين من بيانات العمود او الحقل‬
‫الصيغة العامة‬
‫)‪SUBSTR(Field1,N,M‬‬
‫حيث أن‬
‫‪String‬‬
‫‪N‬‬
‫‪M‬‬

‫الحقل المراد القتطاع منه‬
‫اول حرف يبدأ عنده القتطاع‬
‫عدد الحروف المراد اقتطاعها‬

‫مثال‬
‫)‪SUBSTR('Ahmed',1,3‬‬
‫قيكون الناتج‬
‫‪Ahm‬‬
‫مثال‬
‫(‪SELECT SUBSTR (name, 1,2‬‬
‫;‪FROM S_EMP‬‬
‫‪21‬‬

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

‫دالة نحديد موقع حرف في بيانات حقل ‪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‬‬
‫الحرف أو المتغير الذي سيتم ملء الفراغات به‬
‫‪String‬‬
‫‪22‬‬

‫مثال‬

‫)’‪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‬‬
‫‪LPAD SAL‬‬
‫‪-------------------‬‬‫‪####968‬‬
‫‪###1936‬‬
‫‪#1512.5‬‬
‫‪3599.75‬‬

‫‪23‬‬

‫‪NAME‬‬
‫‪-------------------‬‬‫‪Ali‬‬
‫‪Ahmed‬‬
‫‪SAMI‬‬
‫‪KHALED‬‬

‫حذف و تعديل البيانات‬
‫دالة حذف بيانات ناحية يمين الحقل ‪RTRIM Function‬‬
‫تستنخدم هذه الدالة لحذف بيانات من ناية يمين العمود او الحقل المحدد‬
‫الصيغة العامة‬

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

‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬
‫‪String‬‬

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

‫مثال‬
‫)’‪SELECT name, RTRIM (job,’man‬‬
‫;‪FROM S_EMP‬‬
‫سيتم حذف ‪ man‬من يمين العمود ‪job‬‬
‫‪RTRIM job‬‬
‫‪-------------------‬‬‫‪Sales‬‬
‫‪Analyst‬‬
‫‪Manager‬‬
‫‪Manager‬‬

‫‪name‬‬
‫‪-------------------‬‬‫‪ALI‬‬
‫‪AHMED‬‬
‫‪SAMI‬‬
‫‪Khaled‬‬

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

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

‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬
‫‪String‬‬
‫‪24‬‬

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

‫مثال‬
SELECT name, LTRIM (job,’man’)
FROM S_EMP;
job ‫ من يسار العمود‬man ‫سيتم حذف‬
name
-------------------ALI
AHMED
SAMI
Khaled

LTRIM job
-------------------Salesman
Analyst
ager
ager

LENGTH Function ‫دالة قياس طول بيانات الحقل‬
‫تستخدم هذه الدالة ليجاد طول بيانات متغير أو الحقل المحدد‬
‫الشكل العام‬

LENGTH (COL | VALUE)

‫مثال‬
SELECT LENGTH (name), LENGTH (‘WELCOME’)
FROM S_EMP;
.WELCOME ‫سيتم حساب طول اسم الموظف وطول كلمة‬
LENGTH name
-------------------3
5
4
6

LENGTH ‘WELCOME’
-------------------7
7
7
7

TRANSLATE Function ‫دالة تعديل بيانات في جدول‬
‫تستخدم هذه الدالة لنعديل أو لتبديل بيانات موجودة في جدول معين‬
TRANSLATE (COL|VALUE, FROM, TO)

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

25

‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬
‫‪FROM‬‬
‫‪TO‬‬
‫مثال‬

‫اسم القل أو العمود‬
‫القيمة البديلة للعمود (البيانات(‬
‫الحرف (الحروف( المطلوب تغييره‬
‫الحرف (الحروف( المطلوب احلله‬

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

‫سيتم استبدال الرفين ‪ MI‬بالحرفين ‪WY‬‬
‫‪name‬‬
‫)‪TRANSLATE(name‬‬
‫‪-------------------- -------------------‬‬‫‪SAMI‬‬
‫‪SAWY‬‬

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

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

‫)‪SOUNDEX (COL|VALUE‬‬

‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬

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

‫مثال‬
‫)‪SELECT name, SOUNDEX (name‬‬
‫;‪FROM S_EMP WHERE sal=1512.5‬‬

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

‫دوال التاريخ والتحويل‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل إن شاء ال تكون قادر على ‪:‬‬
‫‪-1‬التعامل مع دوال التاريخ في ‪SQL‬‬
‫‪-2‬التعامل مع أدوات التحويل في ‪SQL‬‬

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

‫الدالة ‪Sysdate‬‬
‫هذه الدالة تقوم بإعطاء تاريخ اليوم الحالي أي التاريخ المخزن في جهاز الكمبيوتر الذي ينفذ عليه هذا المر ويتم‬
‫تخزين التاريخ وهمي يسمى ‪ Dual‬وهو موجود أصل داخل لغة أوراكل لذلك يجب أن تتم عملية استدعاء التاريخ من‬
‫هذا الجدول‬
‫مثال‬
‫لستدعاء تاريخ اليوم الحالي نقوم بالتي ‪:‬‬
‫;‪SELECT SYSDATE FROM DUAL‬‬
‫الدالة ‪NEXT_DAY‬‬
‫تستخدم هذه الدالة لعرض التاريخ الذي يوافق التاريخ التالي للتاريخ المعطى‬
‫فعلى سبيل المثال إذا كان التاريخ الموجود هو ‪ 7/7/2003‬وطلب من الجهاز تحديد اليوم الذي يصادف يوم الجمعة من‬
‫نفس الشهر فإنه يعطي ‪11/7/2003‬‬
‫الشكل العام‬
‫)‪NEXT_DAY (DATE,CHAR‬‬
‫حيث إن ‪ DATE‬هو التاريخ المعطى والمراد إيجاد التاريخ لليوم الذي يليه من خلل وضع اسم اليوم داخل المتغير‬
‫‪CHAR‬‬
‫مثال‬
‫;‪SELECT NEXT_DAY (‘7/7/2003’,’MONDAY’) FROM DUAL‬‬
‫نتيجة التنفيذ‬
‫‪NEXT_DAY‬‬
‫‪------------------‬‬‫‪11/7/2003‬‬
‫‪27‬‬

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

‫)‪LAST_DAY (DATE‬‬

‫حيث أن ‪ DATE‬هو تاريخ الجهاز أو تاريخ تقوم بإدخاله‬
‫مثال‬
‫;‪SELECT LAST_DAY (SYSDATE) FROM DUAL‬‬
‫بفرض أن تاريخ الهاز ‪ SYSDATE‬هو ‪ 2/2/2003‬فإن نتيجة للجملة السابقة هي كما يلي ‪:‬‬
‫‪(LAST_DAY(SYSDATE‬‬
‫‪-------------------------------‬‬‫‪28/2/2003‬‬
‫ملحظة‬
‫يمكنك أن تقوم بطرح تاريخ من تاريخ آخر كالمثال التالي‬
‫‪SELECT SYSDATE – HIRDATE FROM S_EMP‬‬
‫حيث ‪ HIRDATE‬حفل تاريخ ‪.‬‬
‫الدالة ‪MONTHES_BETWEEN‬‬
‫تستخدم هذه الدالة لعرض مدة الفرق بين شهرين‬
‫الشكل العام‬
‫)‪(DATE1,DATE2‬‬

‫‪MONTHES_BETWEEN‬‬

‫مثال‬
‫)’‪(’01-SEP-95’,’11-JAN-94‬‬
‫سيكون الناتج‬
‫‪1.9774194‬‬

‫‪28‬‬

‫‪MONTHES_BETWEEN‬‬

‫الدالة ‪_MONTHES ADD‬‬
‫تستخدم هذه الدالة لضافة عدد من الشهر إلى التاريخ معطى‬
‫)‪ADD_MONTHES (DATE,M‬‬
‫حيث أن‬
‫‪DATE‬‬
‫‪M‬‬

‫التاريخ المعطى‬
‫عدد الشهر‬

‫مثال‬
‫)‪ADD_MONTHES (‘7-JAN-99’,6‬‬
‫عند التنفيذ سيكون الناتج‬
‫‪JUL-99-7‬‬
‫الدالة ‪ROUND‬‬
‫تستخدم هذه الدالة لعرض اقرب بداية شهر أو سنه لتاريخ معين تحدده‬
‫ملحظة ‪:‬تستخدم هذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحها في باب الدوال الرقمية‬
‫الصيغة العامة‬
‫)‪ROUND (DATE, M|Y‬‬
‫حيث أن‬
‫‪DATE‬‬
‫‪M‬‬
‫‪Y‬‬

‫التاريخ المعطى‬
‫نكتب ‪ MONTH‬اذا اردنا ان يعود باقرب شهر‬
‫نكتب ‪ YEAR‬اذا اردنا ان يعود باقرب سنة‬
‫مثال‬
‫)’‪ROUND (’07-MAY-96’, ‘MONTH‬‬

‫عند التنفيذ سيكون الناتج‬
‫‪JUN-96-01‬‬
‫‪29‬‬

‫مثال‬
‫)’‪ROUND (’07-MAY-96’, ‘YEAR‬‬
‫عند التنفيذ سيكون الناتج‬
‫‪JAN-96-01‬‬

‫الدالة ‪TRANCATE Function‬‬
‫تستخدم هذه الدالة لعرض تاريخ اول يوم في شهر أو سنه لتاريخ معين تحدده‬
‫ملحظة ‪:‬تستخدم هذه الدالة أيضا للبيانات الرقمية للتقريب وسيتم شرحها في باب الدوال الرقمية‬
‫الصيغة العامة‬
‫)‪TRUNC (DATE, M|Y‬‬
‫حيث أن‬
‫‪DATE‬‬
‫‪M‬‬
‫‪Y‬‬

‫التاريخ المعطى‬
‫نكتب ‪ MONTH‬اذا اردنا ان يعرض تاريخ اول يوم في شهر التاريخ المحدد‬
‫نكتب ‪ YEAR‬اذا اردنا ان يعود لول يوم لنفس سنة التاريخ‬
‫مثال‬
‫)’‪TRUNC (’07-MAY-96’, ‘MONTH‬‬
‫عند التنفيذ سيكون الناتج‬
‫‪MAY-96-01‬‬
‫مثال‬
‫)’‪TRUNC (’07-MAY-96’, ‘YEAR‬‬
‫عند التنفيذ سيكون الناتج‬
‫‪JAN-96-01‬‬

‫‪30‬‬

‫دوال التحويل‬
‫يتم تحويل البيانات من شكل إلى اخر وتوجد دوال خاصة بالتويل ومنها‬
‫‪-1‬التحويل الى حروف ‪TO_CHAR‬‬
‫‪-2‬التحويل إلى أرقام ‪TO_NUMBER‬‬
‫‪-3‬التحويل إلى تاريخ ‪TO_DATE‬‬

‫‪-1‬الدالة ‪TO_CHAR‬‬
‫تستخدم هذه الدالة لتحويل التاريخ او الرقام الى جملة حرفية حيث يتم تغيير شكل التاريخ او الرقام من‬
‫صورة إلى اخرى‬
‫اول من تاريخ الى جملة حرفية‬
‫الشكل العام‬
‫)’‪TO_CHAR (DATE,’FMT‬‬
‫حيث أن‬
‫‪ DATE‬قيمة التاريخ‬
‫الصورة الجديدة‬
‫‪FMT‬‬
‫مثال‬
‫)’‪SELECT TO_CHAR (SYSDATE,’DAY, DD MON YY‬‬
‫;‪FROM DUAL‬‬
‫لنفرض أن تاريخ الجهاز (‪ (SYSDATE‬هو ‪ 7/7/2003‬فإن نتيجة التنفيذ للجملة السايقة هي كمايلي‪:‬‬
‫‪(‘TO_CHAR (SYSDATE,’DAY, DD MON YY‬‬
‫‪----------------------------------‬‬‫‪MONDAY‬‬
‫‪7 JUL‬‬
‫‪03‬‬

‫ملحظة‬
‫‪-1‬اذا كتبنا ‪ YYYY‬فانه سوف يتم عرض السنة كاملة متل ‪2003‬‬
‫‪-2‬اذا كتبنا ‪ MM‬فإنه سوف يتم عرض رقم الشهر مثل ‪06‬‬
‫‪-3‬اذا كتبنا ‪ MONTH‬فانه سوف يتم عرض اسم الشهر كامل مثل ‪July‬‬
‫‪-4‬اذا كتبنا ‪ DY‬سيتم عرض أول ثلثة حروف من اليوم‬
‫‪-5‬اذا كتبنا ‪ DAY‬سيتم عرض اسم اليوم كامل‬
‫‪ -6‬اذا اردنا عرض الساعة نكتب ‪ HH24:MI:SS AM‬مثل ‪PM 15:45:32‬‬

‫‪31‬‬

‫ثانيا التحويل من أرقام الى جملة حرفية‬
‫الشكل العام‬
‫)’‪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‬‬
‫ملحظة‬
‫‪-1‬عندما نكتب ‪ 9‬فإننا نعني يها خاتة رقم‬
‫‪-2‬عندما نكتب (‪ ( ,‬يتم طباعة الفاصلة‬
‫‪-3‬عندما نكتب( ‪ ( .‬يتم طباعة الفاصلة العشرية‬

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

‫قيمة مخزنة على شكل أرقام حرفية سيتم عرضها على شكل قيم رقمية‬

‫مثال‬
‫لنفرض أن لدينا حقل اسمه ‪ NUM‬في جدول ‪ DATA‬به ارقام ولكنها ارقام رفيه أي انها تعامل معاملة الحروف فل‬
‫تدخل في العمليات الحسابية فعند تنفيذ هذه الدالة ستم تحويل القيم إلى فيم رقمية يمكن ان تدخل في العمليات الحسابية‬
‫)‪SELECT NUM, TO_ NUMBER (NUM‬‬
‫;‪FROM DATA‬‬
‫عند التنفيذ سيكون الناتج‬
‫‪32‬‬

‫‪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‬‬
‫‪-------------------------------------------------------------‬‬‫‪JUL-03-07‬‬

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

‫‪33‬‬

‫الدوال الرقمية‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل ان شاء ال ستكن قادر على‬
‫‪-1‬التعامل مع دالة القيمة المطلقة‬
‫‪-2‬إيجاد الجذر التربيعي للعداد‬
‫‪-3‬التعامل مع الدالة السية للعداد‬
‫‪-4‬تقريب العداد العشرية من خلل ‪SQL‬‬
‫‪-5‬تقريب العداد من خلل حذف المنزلة العشرية‬
‫‪-6‬إيجاد باقي القسمة للعداد‬
‫‪-7‬ايجاد اشارة العداد السالبة‬

‫الدوال المطلقة والسية والسية والجذر التربيعي‬
‫دالة القيمة المطلقة ‪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‬‬

‫‪34‬‬

‫نلحظ أن قم العمود ‪ 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‬‬

‫‪-2‬الدالة السية ‪POWER Function‬‬
‫تستخدم هذه الدالة ليجاد قيمة رقم مرفوع لس‬
‫الشكل العام‬
‫)‪POWER (COL|VALUE,P‬‬
‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬
‫‪P‬‬

‫اسم الحقل أو العمود‬
‫القيمة البديلة للعمود (البيانات(‬
‫قيمة الس‬

‫مثال‬
‫;‪SELECT DIGIT, POWER (DIGIT1, 2) FROM DIGIT‬‬
‫عند التنفيذ سيتم طباعة‪:‬‬
‫)‪POWER (DIGIT1, 2‬‬
‫‪-------------------‬‬‫‪400‬‬
‫‪625‬‬
‫‪650.25‬‬
‫‪930.25‬‬

‫‪35‬‬

‫‪DIGIT1‬‬
‫‪-------------------‬‬‫‪20‬‬
‫‪25‬‬
‫‪25.5‬‬
‫‪30.5‬‬

‫‪-3‬دالة الجذر التربيعي ‪SQRT Function‬‬
‫تستخدم هذه الدالة لياد الجذر التربيعي لرقم معين‬
‫الشكل العام‬
‫(‪SQRT (COL|VALUE‬‬
‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬

‫اسم الحقل أو العمود‬
‫القيمة البديلة للعمود (البيانات(‬

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

‫دوال التقريب وباقي القسمة والشارة‬
‫دالة التقريب العشري ‪ROUND Function‬‬
‫تستخدم هذه الدالة لتقريب العدد إلى اقرب رقم عشري أو صحيح‬
‫الشكل العام‬
‫)‪ROUND (COL|VALUE, N‬‬
‫حيث أن‬
‫‪COL‬‬
‫‪VALUE‬‬
‫‪N‬‬

‫‪36‬‬

‫اسم الحقل أو العمود‬
‫قيمة عددية‬
‫عدد المواقع العشرية‬

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

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

37

‫دالة باقي القسمة ‪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‬‬

‫دالة الشارة ‪SIGN Function‬‬
‫تستخدم هذه الدااة بفحص إشارة الرقم فإذا كانت الشاؤة موجبة تعود بالقيمة (‪ (1‬أما اذا كانت الشارة سالبة فتعود‬
‫بالقيمة (‪(-1‬‬
‫الشكل العام انظر المثال التالي ‪:‬‬
‫مثال‬
‫‪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‬‬
‫ملخص الفصل‬
‫‪38‬‬

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

‫استرجاع البيانات‬
‫أهداف اافصل‬
‫ان شاء ال بعد دراسة هذا الفصل ستكون قادر على‬
‫‪ -1‬استرجاع البيانات من أكثر‬
‫‪ -2‬استراع البيانات بأسماء مستعارة‬

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

‫وتوجد عدة أنواع للربط‬
‫‪:‬‬
‫‪EQUAI JOIN-1‬‬
‫الصيغة العامة‬
‫‪SELECT table.column, table.column‬‬
‫‪FROM table1, table2‬‬
‫;‪WHERE table1.column1 = table2.column2‬‬
‫‪39‬‬

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

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
LAST_NAME
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 ‫ويمكن اضافة شرط اخر بعد‬
40

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;

‫ عند التفيذ ينتج‬:
DEPT_ID
LAST_NAME
NAME
-----------------------------------------------41
NGAO
OPERATOPNS
41
URGIHART
OPERATOPNS
NON- EQUAI JOIN-2
‫يستخدم هذه النوع عندما ل يوجد اعمدة مشتركة بين الجدولين‬
‫مثال‬
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-3
‫يستخدم هذا النوع لرؤية السجلت في الجدول الثاني التي ل يقابلها سجلت في الجدول الول‬
‫الصيغة العامة‬
SELECT table.column, table.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
‫ملحظة‬
‫( في هذا النوع من الربط حيث نكتبه بجوار السم الحقل الذي ل يحتوي هلى قيمة‬+( ‫نسنخدم المعامل‬

41

‫مثال‬

‫اذا اردنا الستعلم عن الجزء الذي ل يتواجد به موظف نكتب‬
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-4
‫تستخدم لربط صف من جدول بصف اخر من نفس الجدول‬

42

: ‫مثال‬

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

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

‫مثال‬
SELECT
FROM
WHERE

e.ename, e.job, e.sal, s.grade
S_EMP e, salgrade s
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 ‫تناولنا في هذا الفصل جمل‬
‫جدول الموطفين وتطرقنا كذلك إلى عملية استرجاع البيانات من خلل اسم مستعار‬

43

‫الدوال الرياضية والحصائية ودوال المجموعات‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل ان شاء ال ستكون قادر على ‪:‬‬
‫‪-1‬التعامل مع الدوال الرياضية والحصائية‬
‫‪-2‬التعامل مع دوال المجموعات‬

‫الدوال الرياضية والحصائية‬
‫هناللك مجموعة من القترانات الرياضية والحصائية التي تتعامل مع مجموعة من السجلت لخراج قيمة واحدة‬
‫محدودة ومن هذه القترانات مايلي‪:‬‬
‫‪-1‬دالة العد ‪COUNT‬‬
‫‪-2‬دالة أكبر قيمة ‪MAX‬‬
‫‪-3‬دالة أصغر قيمة ‪MIN‬‬
‫‪-4‬دالة المجموع ‪SUM‬‬
‫‪-5‬دالة المتوسط الحسابي ‪AVG‬‬
‫‪-6‬دالة النحراف المعياري ‪STDDEV‬‬
‫‪-7‬دالة المعيار ‪VARIANCE‬‬
‫‪-1‬دالة العد ‪COUNT‬‬
‫تقوم هذه الدالة بعملية حصر الحقول في عمود معين والتي ل تحمل القيمة ‪NULL‬‬
‫الشكل العام‬
‫حيث أن‬
‫‪DISTINCT‬‬
‫‪ALL‬‬
‫‪EXP‬‬

‫)‪COUNT (DISTINCT|ALL|EXP‬‬
‫تستخدم لمنع احتساب الحقول التي تحمل القيمة ‪NULL‬‬
‫يكون المدى هنا جميع الحقول حتى المكررة‬
‫يمكن استخدام اسم العمود‬

‫مثال‬
‫;‪SELECT COUNT (DISTINCT NAME) FROM S_EMP‬‬
‫تقوم الجملة السايقة بتحديد عدد الصفوف للحقل ‪ NAME‬من الجدول ‪S_EMP‬‬
‫مثال‬
‫حساب عدد السجلت في الجدول‬

‫‪44‬‬

‫;‪SELECT COUNT (*) ”TOTAL” FROM S_EMP‬‬

‫‪-2‬دالة أكبر قيمة ‪MAX‬‬
‫تقوم هذه الدالة بعرض أكبر قيمة موجودة في عمود معين‬
‫الشكل العام‬
‫)‪MAX (DISTINCT|ALL|EXP‬‬
‫مثال‬
‫;‪SELECT MAX (DISTINCT salary( FROM S_EMP‬‬
‫تقوم هذه الجملة بعرض أكبر راتب في جدول الموظفين ‪S_EMP‬‬
‫‪-3‬دالة أكبر قيمة ‪MIN‬‬
‫تقوم هذه الدالة بعرض أكبر قيمة موجودة في عمود معين‬
‫الشكل العام‬
‫)‪MIN (DISTINCT|ALL|EXP‬‬
‫مثال‬
‫;‪SELECT MIN (DISTINCT salary( FROM S_EMP‬‬
‫تقوم هذه الجملة بعرض أصغر راتب في جدول الموظفين ‪S_EMP‬‬
‫‪-4‬دالة المجموع ‪SUM‬‬
‫تقوم هذه الدالة بعرض مجموع القيم الموجودة في حقل او عمود معين‬
‫)‪SUM (DISTINCT|ALL|EXP‬‬
‫مثال‬
‫;‪SELECT SUM (salary( FROM S_EMP‬‬
‫تقوم هذه الجملة بعرض مجموع رواتب الموظفين في جدول الموظفين ‪S_EMP‬‬
‫‪-5‬دالة المتوسط الحسابي ‪AVG‬‬
‫تقوم هذه الدالة بعرض المعدل لمجموعة قراءات قد تكون موجودة في جدول معين‬
‫الشكل العام‬
‫(‪AVG )COLUMN‬‬
‫‪ COLUMN‬هو اسم العمود الموجود في جدول معين‬
‫مثال‬
‫;‪SELECT AVG (SALARY( FROM S_EMP‬‬
‫تقوم هذه الجملة بحساب المتوسط الحسابي لمرتبات الموظفين‬
‫‪45‬‬

‫‪-6‬دالة النراف المعياري ‪STDDEV‬‬
‫تقوم هذه الدالة بإيجاد النحراف المعياري لمجموعة مشاهدات أو قراءات‬
‫الشكل العام‬
‫(‪STDDEV )DISTINCT|ALL‬‬
‫مثال‬
‫لبجاد النحراف المعياري للرقام الواردة في حقل الرواتب في جدول الموظفين ‪S_EMP‬‬
‫;‪SELECT STDDEV (SALARY( FROM S_EMP‬‬
‫‪-7‬دالة المعيار ‪VARIANCE‬‬
‫تقوم هذه الدالة بإيجاد المعيار لمجموعة مشاهدات أو قراءات‬
‫مثال‬
‫;‪SELECT VARIANCE (SALARY( FROM S_EMP‬‬

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

‫‪GROUP BY COL_NAME‬‬
‫هو اسم العمود في الجدول والذي سيتم تقسيم الجدول إلى مجموعات‬
‫صغيرة بناء غليه‬

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

‫‪SELECT‬‬
‫‪id, last_name, dept_id DEPARTMENT‬‬
‫‪FROM s_emp‬‬
‫;‪WHERE dept_id = 41‬‬

‫فان المخرجات هي‬
‫‪DEPARTMENT‬‬
‫‪---------‬‬‫‪41‬‬
‫‪41‬‬
‫‪41‬‬
‫‪41‬‬
‫نلحظ وجود اريع موظفين في القسم ‪ 41‬ولكن عند تطبق دالة المجموعات‬
‫‪46‬‬

‫‪LAST_NAME‬‬
‫‪--------‬‬‫‪Ngao‬‬
‫‪Urguhart‬‬
‫‪Maduro‬‬
‫‪Smith‬‬

‫‪ID‬‬
‫‪-‬‬‫‪2‬‬
‫‪6‬‬
‫‪16‬‬
‫‪17‬‬

‫”‪SELECT dept_id, COUNT (*) ”Number‬‬
‫‪FROM s_emp‬‬
‫‪WHERE‬‬
‫‪dept_id = 41‬‬
‫;‪GROUP BY dept_id‬‬
‫فان المخرجات هي‬
‫‪DEPT_ID Number‬‬
‫‪------- -----‬‬‫‪41‬‬
‫‪4‬‬
‫نلحظ ظهور سطر واحد من البيانات للقسم ‪ 41‬فالدالة ‪ GROUP BY‬قامت بتجميع القسم ‪ 41‬مع بعضه (وكأنها‬
‫عملت جدول خاص بها( وهذه واضح عندما استخدمنا دالة ‪ COUNT‬اظهرت ان عدد السجلت ‪ 4‬رغم أن عدد‬
‫السطر هو واحد‬
‫لستخدام شرط مع دالة المجموعات نكتب المر ‪HAVING‬‬
‫قبكون شكل جملة الستعلم كالتي‬
‫‪SELECT‬‬
‫‪column, group_function‬‬
‫‪FROM 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‬‬
‫والتي تقوم بفرز الجدول الى جدول اصغر منه أو يساويه‬
‫‪47‬‬

48

‫الستعلمات الفرعية‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل ان شاء ال ستكون قادرعلى‬
‫‪-1‬تحديد الحالت التي يمكن ان يستخدم فيها الستعلمات الفرعية‬
‫‪-2‬تعريف الستعلمات الفرعية والمتداخلة‬
‫‪-3‬معرفة أنواع الستعلمات الفرعية‬
‫‪-4‬كتابة استعلم فردي احادي الصف وآخر متعدد الصفوف‬

‫الستعلم الفرعي‬
‫مقدمة‬
‫لنفترض أنك ترغب في كتابة استعلم ليجاد بيانات الموظفين الذين تزيد رواتبهم عن راتب أحد الموظفين‬
‫في هذه الحالة تحتاج الى استعلمين‬
‫‪-1‬استعلم ليجاد راتب الموظف المعني‬
‫‪-2‬استعلم ليجاد الموظفين الذين تزيد رواتبهم عن المبلغ المحسوب في الستعلم الول‬
‫ويمكنك دمج الستعلمين وذلك برتكيب احد الستعلمين في الخر ‪ ،‬الستعلم الداخلي سوف يعود بقيمة (قيم( والتي‬
‫يستخدمها الستعلم الخارجي (الرئيسي(‬
‫إن استخدام الستعلمات الفرعية يشبه تماما تنفيذ الستعلمين بشكل متتال واستلعم نتيجة الستعلم الول كنتيجة‬
‫بحث في الستعلم الثاني‬

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

‫‪49‬‬

‫الشكل العام‬
SELECT select_list
FROM table
WHERE expr operator
(SELECT
select_list
FROM
table);

50

‫ملحظة‬
‫‪-1‬الستعلم الداخلي(الفرعي( ينفذ اول‬
‫‪-2‬ناتج الستعلم الداخلي(الفرعي( يستخدم في الستعلم الرئيسي‬

‫متطلبات الستعلم الفرعي‬
‫‪-1‬وضع الستعلم الفرعي بين قوسين (‪(.......‬‬
‫‪.-2‬وضع الستعلم الفرعي يمين عملية المقارنة‬
‫‪-3‬ل يمكن استخدام ‪ ORDER BY‬داخل الستعلم الفرعي‬
‫‪-4‬استخدام المعاملت أحادية الصف مع الستعلمات الفرعية الحادية الصف‬
‫‪-5‬استخدام المعاملت متعددة الصف مع الستعلمات الفرعية المتعددة الصف‬

‫‪51‬‬

‫أنواع الستعلمات الفرعية‬
‫يمكن تصنيف الستعلم الفرعي حسب‬
‫‪-1‬استعلم فرعي أحادي الصف يسترجع صفا واحدا‬
‫‪-2‬استعلم فرعي متعدد الصفوف يسترجع أكثر من صف واحد‬
‫‪-3‬استعلم فرعي متعدد العمدة يسترجع اكثر من عمود‬

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

‫>‪>< .=> ,=< ,< ,‬‬
‫‪-2‬استعلم فرعي متعدد الصفوف يسترجع أكثر من صف واحد‬
‫نستخدم هذا الستعلم في حالة ان الستعلم الفرعي يعود بعدة اسطر انظر المثال التالي‬
‫‪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‬‬
‫يقوم الستعلم الفرعي في هذا المثال ياستخراج أرقام الموظفين الذين اسمهم '‪ 'Finance‬او رقم منطقتهم ‪ 2‬من‬
‫جدول القسام فهذا لستعلم سيعود بعدة فيم يأخذها الستعلم الرئيسي ويستخرج اسماء الموظفين على اساسها‬
‫ملحظة‬
‫‪-1‬أنواع معاملت المقارتة الخاصة بهذا النوع هي‬
‫‪IN, ALL, ANY‬‬
‫‪-2‬اذا استخدمنا معاملت الستعلم احادي الصف مع استعلم متعدد فان البرنامج يعطيك رسالة خطأ‬
‫‪ORA-01427:single-row sub query returns more‬‬
‫‪than one row‬‬
‫ملخص الفصل‬
‫في هذا الفصل تعرفنا على الستعلمات الفرعية واهميتها وشروطها وانواعها الحادية والمتعددة‬
‫‪52‬‬

‫إنشاء الجداول‬
‫أهداف الفصل‬
‫قس نهابة هذا الفصل ستكون قادر انشاء ال على مايلي‪:‬‬
‫‪-1‬التعرف على الجداول وشروط تسميتها‬
‫‪-2‬التعرف على أنواع البيانات‬
‫‪-3‬إنشاء الجداول بواسطة المر ‪CREAT‬‬
‫‪-4‬إنشاء مفتاح أساسي في الجدول‬
‫‪-5‬إنشاء جدول بواسطة جدول اخر‬
‫‪-6‬عرض مواسفات الجدول‬

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

‫تسمية الجدول‪/‬ملف ‪TABLE/FILE NAMES‬‬
‫‪-1‬ل يتجاوز طول اسم الجدول أو الملف عن ‪ 30‬حرف‬
‫‪-2‬يمكن ان يكون حروفا كبيرة أو صغيرة‬
‫‪-3‬السم يبدأ بحرف ول يمكن أن يبدأ برقم‬
‫‪-4‬يمكن أن يحتوي السم على رموز خاصة مثل ‪ .... %,$,#‬الخ‬

‫أنواع الحقول ‪Fields Types‬‬
‫‪-1‬المتغير الحرفي ‪CHAR‬‬
‫يتكون هذا الحقل من الحروف البجدية ‪ ,‬الرقام ‪ ,‬والرموز الخاصة ‪ .‬وطول أو عرض هذا الحقل يصل الى ‪240‬‬
‫حرف ول بد من تحديد طول أو عرض الحقل وهو اجباري واذا لم يتم التحديد سيفتض البرنامج انه ‪1‬‬
‫الشكل العام‬

‫)‪var CHAR (size‬‬

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

‫‪53‬‬

‫‪-2‬المتغير الحرفي ‪VARCHAR2‬‬
‫يتكون هذا الحقل من الحروف البجدية ‪ ,‬الرقام ‪ ,‬والرموز الخاصة ‪ .‬وطول أو عرض هذا الحقل يصل الى ‪240‬‬
‫حرف ل يوجد طول افتراضي للحقل‬
‫مثال‬

‫)‪FirstName VARCHAR2 (20‬‬

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

‫)‪Serial_No NUMBER (10‬‬

‫‪ -4‬المتغير الرفمي ذو العلمة العشرية‬
‫ويتكون من الرقام (‪(9-0,1,2‬‬
‫مثال‬
‫(‪Mark NUMBER (10,3‬‬
‫‪-5‬متغير طويل ‪LONG‬‬
‫يستخدم للحقول التي تحتوي على بيانات تصل مساحتها الى ‪ 2‬جيجا‬
‫مثال‬
‫‪Detail LONG‬‬
‫‪-6‬المتغير الدال على التاريخ (‪)Date‬‬
‫يتكون هذا الحقل من مجموعة الرقام للدللة على اليوم والشهر والسنة وطول هذا الحقل ‪ 8‬خانات على القل ويمكن‬
‫أن يتغير شكل كتابة التاريخ بذكر اسم الشهر‬
‫مثال‬
‫‪HireDate DATE‬‬

‫‪54‬‬

‫إنشاء جدول‬
‫إنشاء جدول باستخدام أمر ‪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‬‬

‫‪1‬‬

‫‪55‬‬

‫اسم التقييد‬
‫نوع التقييد‬

‫ غير فارغ ‪NOT NULL‬‬‫هذا المر ل يسمح بترك حقل فارغ‬
‫مثال‬

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

‫‪ -2‬فريد ‪UNIQUE‬‬
‫هذا المر بجعل الحقل (العمود( فريد فل يسمح بتكرار صف من الصفوف فكل صف ل يوجد ال مرة واحدة‬
‫ملحظة‬
‫‪ -1‬يمكن أن يحتوي الحقل الفريد ‪ UNIQUE‬على قيمة فارغة بشرط أن يكون حقل واحد فقط فريد ‪UNIQUE‬‬
‫‪ -2‬وبمكن أن يوجد في الجدول أكثر حقل فريد‬
‫مثال‬
‫‪... phone‬‬
‫)‪VARCHAR2(10‬‬
‫‪CONSTRAINT s_emp_phone_uk UNIQUE,...‬‬
‫‪ -3‬مفتاح أساسي ‪Primary Key‬‬
‫ل يمكن لي جدول أن يحتوي ال على مفتاح أساسي واحد وإذا قمنا بتحويل حقل الى مفتاح أساسي فهذا الحقل يعتبر‬
‫حقل فريد ولكن ل يمكن أن يحتوي على قيم فارغة‬
‫مثال‬
‫‪... id‬‬

‫)‪NUMBER(7‬‬
‫‪CONSTRAINT s_emp_id_pk PRIMARY KEY,...‬‬
‫‪ -4‬مفتاح خارجي ‪Foreign Key‬‬

‫يمكن تعيين حفل (عمود( واحد أو أكثر ليكون مفتاح خارجي حيث يكون هذا العمود مرتبط بعمود اخر به مفتاح‬
‫اساسي او فريد من نفس الجدول أو جدول اخر ومن الضروري أن يكون مرتبط بقيمة اخرى من عمود اخر او يكون‬
‫فارغ‬
‫انظر المثال التالي‬
‫)‪... dept_id NUMBER(7‬‬
‫‪CONSTRAINT s_emp_dept_id_fk‬‬
‫)‪FOREIGN KEY (department_id‬‬
‫)‪REFERENCES s_dept(id‬‬
‫;‪ON DELETE CASCADE‬‬
‫‪56‬‬

‫‪Foreign Key -1‬‬
‫تكتب بجوارها اسم الحقل المراد أن يكون مفتاح خارجي في الجدول البن‬
‫‪REFERENCES -2‬‬
‫نكتب بجوارها الحقل الذي سيتم الربط به من الجدول الخر‬
‫‪ON DELETE CASCADE -3‬‬
‫اذا تم مسح احد الصفوف في الجدول الب سيمسح الصف المقابل له في الجدول البن‬

‫انشاء جدول بواسطة جدول آخر‬
‫لنشاء جدول بواسطة جدول آخر يجب أن يكون الجدول الخر منشأ مسبقا ثم نكتب المر كالتالي‬
‫الشكل العام‬
‫‪CREATE TABLE tablename‬‬
‫])‪[column(, column...‬‬
‫;‪AS Select statement‬‬
‫مثال‬
‫‪CREATE TABLE EMPLOYEE‬‬
‫‪AS‬‬
‫‪SELECT NAME, SAL, JOB FROM S_EMP‬‬
‫قمنا في هذه الجملة بعمل جدول جديد ثم نقلنا بيانات الجدول ‪ S_EMP‬اليه‬

‫انشاء جدول بواسطة استعلم فرعي‬
‫لنشاء جدول بواسطة استعلم فرعي يجب أن يكون الستعلم الفرعي قائم على الستعلم من جدول منشأ مسبقا ثم‬
‫نكتب المر كالتالي‬
‫الشكل العام‬
‫‪CREATE TABLE tablename‬‬
‫])‪[column(, column...‬‬
‫;‪AS subquery‬‬
‫مثال‬
‫‪CREATE TABLE‬‬
‫‪emp_41‬‬
‫‪AS‬‬
‫‪SELECT‬‬
‫‪id, last_name, userid, start_date‬‬
‫‪57‬‬

‫‪s_emp‬‬
‫;‪dept_id = 41‬‬

‫‪FROM‬‬
‫‪WHERE‬‬

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

‫;‪DESCRIBE tablename‬‬

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

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

‫‪58‬‬

‫تعديل بنية الجدول وحذفه‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل ستكون قادر ان شاء ال على‪:‬‬
‫‪-1‬التعرف على جميع عمليات التغديل على الجدول‬
‫‪-2‬إضافة حقول جديدة إلى الجدول‬
‫‪-3‬تعديل مواصفات حقول الجدول‬
‫‪-4‬حذف المفتاح الساسي من الجدول‬
‫‪-5‬حذف الجدول‬

‫تعديل الجداول‬
‫تتيح لك الـ ‪ SQL‬غملية تعديل الجدول بعد إنشائها في الحالة التالية‬
‫‪-1‬اضافة حفل جديد‬
‫‪-2‬تعديل مواصغات حقل‬
‫‪-3‬حذف المفتاح الساسي من الجدول‬
‫ويجب النتباه الى عدم إمكانية حذف حفل من الجدول‬
‫جملة تعديل الحقول ‪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‬‬
‫‪59‬‬

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

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

‫حذف المفتاح الساسي‬
‫نكتب المر التالي‬
‫‪ALTER TABLE tablename‬‬
‫;‪DROP PRIMARY KEY CASCADE‬‬
‫عبارة ‪ CASCADE‬هنا للغاء أي علقة تعتمد على المفتاح الساسي‬

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

‫‪60‬‬

‫إدخال البيانات إلى الجداول‬
‫أهداف الفصل‬
‫إن شاء ال في نهاية هذا الفصل ستكون قادر على‬
‫‪-1‬اللمام بالطرق المختلفة لدخال البيانات إلى الجدول‬
‫‪-2‬إدخال سجل واحد إلى جدول البيانات‬
‫‪-3‬إضافة عدة سجلت الى السجل‬

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

‫إدخال البيانات إلى الجداول ‪INSERT‬‬
‫هي العملية التي يتم بها إدخال سجل ‪ /‬سجلت إلى جدول البيانات من خلل جملة ‪ INSERT‬وتتنم هذه اغلملية بعدة‬
‫طرق‬
‫أول ‪ :‬إضافة سجل واحد إلى جدول البيانات‬
‫الصيغة العامة‪:‬‬
‫])]‪table [(column1 [, column2...‬‬
‫;)]‪(value1 [, value2...‬‬
‫حيث أن‬
‫‪Table‬‬
‫‪Column1,Column2‬‬
‫‪Value1, value2‬‬

‫‪61‬‬

‫اسم الجدول المراد إلحاق السجل به‬
‫اسماء العمدة(الحقول( المطلوب إدخال البيانات إليها‬
‫القيم المطلوب إضافتها في حقول السجل الجديد‬
‫وكل قيمة يتم إدراجها في الحقل المناسب في القائمة‬
‫وبالتالي سيتم إضلفة القيمة ‪ 1‬في الحقل ‪ 1‬وهكذا‬

‫‪INSERT INTO‬‬
‫‪VALUES‬‬

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

‫القواعد التي يجب التقيد بها في هذه الطريقة‬
‫‪-1‬يجب أن يكون عدد القيم التي سيتم إدخالها هو نفس عدد الحقول المذكور في جملة ‪INSERT‬‬
‫‪-2‬يجب أن يكون نوع بيانات القيم التي سيتم إدخالها من نفس نوع بيانات الحقول وأن تكون هذه القيم مرتبة حسب‬
‫ترتيب الحقول في جملة ‪INSERT‬‬
‫مثال‬
‫‪s_dept‬‬
‫;)‪(11, 'Finance', 2‬‬

‫‪INSERT INTO‬‬
‫‪VALUES‬‬

‫‪-3‬عند إدخال حقول التاريخ والنصوص يجب وضع القيم المخلة بين علمتي تنصيص مفردتين‬
‫‪-4‬يجب مراعاة وجوب إدخال قيم في الحقول الجبارية التي تم تعريفعا على أنها ل تحتوي فراغ ‪NOT NULL‬‬
‫ويتم ادخال ‪ NULL‬في الحقول التي بها فراغ‬
‫مثال‬

‫‪INSERT INTO s_dept‬‬
‫‪VALUES‬‬
‫;)‪(13, 'Administration', NULL‬‬

‫‪-5‬يجوز عدم ذكر أسماء الحقول في جملة ‪ INSERT‬في حالة إدخال بيانات جميع الحقول لهذا السجل على أن‬
‫تكون القيم المخلة مرتبة حسب الترتيب الفتراضي للحفول في الجدول عند بنائه‬
‫ملحظة‬
‫لمعرفة الترتيب الفتراضي للحقول في الجدول نستخدم المر ‪DESC‬‬
‫مثال‬
‫ثانيا ‪ :‬اضافة عدة سجلت إلى جدول البيانات‬
‫من خلل هذه الطريقة يمكن ادخال أكثر من سجل واحد إلى جدول البيانات عن طريق استخدام متغيرات الدخال وهي‬
‫عبارة عن متغيرات توضع في جملة الدخال بدل من القيم نفسها ةيمكن أن نطلق على هذه الطريقة جملة الدخال‬
‫متعددة السجلت‬
‫])]‪table [(column1 [, column2...‬‬
‫;)]‪(&variable1 [,&variable1 ...‬‬
‫حيث ان‬
‫‪Table‬‬
‫‪Column1,Column2‬‬

‫‪62‬‬

‫اسم الجدول المراد إلحاق السجل به‬
‫اسماء العمدة(الحقول( المطلوب إدخال البيانات إليها‬

‫‪INSERT INTO‬‬
‫‪VALUES‬‬

‫‪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‬‬

‫القواعد التي يجب التقيد بها في هذه الطريقة‬
‫تنطبق على هذه الطريقة جميع القواعد المذكورة في الطريقة الولى ويضاف إليها مايلي ‪:‬‬
‫‪-1‬تستبدل القيم في جملة الدخال بمتغيرات‬
‫‪-2‬يعود اختيار أسماء المتغيرات إلى المستخدم مع مراعاة شروط تسمية المتغيرات‬
‫‪-3‬يجب أن توضع علمة & قبل متغير الدخال‬
‫‪-4‬في جملة الدخال يمكن وضع علمتى تنصيص مفردتين حول متغير الدخال الخاص بالحقول النصبة‬

‫‪63‬‬

‫إضافة سجلت عن طريق نسخها من جدول آخر‬
‫من خلل هذه الطريقة يمكن إدخال أكثرمن يجل واحد إلى جدول البيانات عن طريق نسخ هذا السجل ‪ /‬السجلت من‬
‫جدول آخر بوتسطة جملة الستفسار ‪ 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‬‬
‫الشرح‬
‫بعد تنفيذ جملة الدخال بهذه الطريقة ينم نسخ السجلت التي تحقق الشرط من الجدول لمصدر إلى الجدول الهدف‬
‫وللحقول االمذكورة في جملة الدخال‬

‫‪64‬‬

‫القواعد التي يجب التقيد بها في هذه الطريقة‬
‫‪-1‬كتابة جملة الدخال ‪ INSERT‬محتوية على جملة استفسار ‪SELECT‬‬
‫‪-2‬تستبدل القيم في جملة الدخال بأسماء حقول الجدول المصدر‬
‫‪-3‬عدم استخدم العبارة ‪VALUES‬‬
‫‪-4‬يجب مراعاة وجوب إدخال قيم في القول الجبارية التي تم نعريفها على أنها ل تحتوي فراغ ‪NOT NULL‬‬
‫‪-5‬مطابقة الحقول بين الجدولين من حيث ترتيب الحقول ونوع البيانات وعدد الحقول‬

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

‫‪65‬‬

‫تعديل وحذف بيانات الجداول‬
‫أهداف الفصل‬
‫بعد نهاية هذا الفصل ستكون ان شاء ال قادر على‬
‫‪-1‬اللمام بالطرق المختلفة لتعديل البيانات في الجدول‬
‫‪-2‬إتقان تعديل بيانات سجل واحد أو أكثر في جدول البيانات‬
‫‪-3‬إتقان تعديل بيانات جميع السجلت في جدول البيانات‬
‫‪-4‬إتقان حذف سجل أو أكثر من جدول البيانات‬
‫‪-5‬إتقان حذف جميع السجلت من جدول البيانات‬

‫تعديل بيانات الجدول‬
‫في هذا الفصل سنتعلم كيفية تعديل البيانات وحذف السجلت كما أن هذا الفصل يشكل جزأ أساسيا مكمل للغة تناول‬
‫البيانات ‪ DML‬فس نظام أوراكل التي يعتبر احدى النظم القوية في نظم إدارة قواعد البيانات ‪ DBMD‬لما لها من أثر‬
‫فعال في معالجة البيانات داخل الجدول حيث تشتمل لغة تناول البيانات ‪ DML‬على الجزاء التالية‬
‫‪-1‬إدخال البيانات إلى الجداول ‪INSERT‬‬
‫‪-2‬تعديل البيانات في الجداول ‪UPDATE‬‬
‫‪ -3‬حذف البيانات من الجداول ‪DELETE‬‬
‫ولقد تناولنا ادخال البيانات في الفصل السابق وسندرس تعديل البيانات وخذفها في هذا الفصل‬

‫تعديل البيانات في الجدول‬
‫هي العملية التي يتم بها تعديل بيانات قل ‪ /‬حقول في سجل واد أو اكثر في جدول البيانات من خلل جملة‬
‫‪UPDATE‬وتتم هذه العملية بطريقتين‪:‬‬
‫أول‪ :‬تعديل بيانات حقل ‪ /‬حقول لسجل واحد أو اكثر‬
‫الصيغة العامة‬
‫‪table‬‬
‫]‪column1 = value [, column2 = value‬‬
‫;]‪condition‬‬
‫اسم الجدول المراد تعديل البيانات فيه‬
‫‪Table‬‬
‫اسماء الحقول(العمده( المراد تعديل بياناتها‬
‫‪Column1,column2‬‬
‫القيم الجديدة التي سيتم إعطاؤها للحقول (العمدة(‬
‫‪Value1, value2‬‬
‫حقل ‪ 1‬وحقل ‪ 2‬وبالتالي فإن قيمة ‪ 1‬ستؤول الى‬
‫الحقل ‪ 1‬وهكذا‬
‫‪ Condition‬جملة شرط تحدد السجلت التي سيتم تعديل بياناتها هي السجلت‬
‫التي تحقق الشرط‬
‫‪66‬‬

‫‪UPDATE‬‬
‫‪SET‬‬
‫‪[WHERE‬‬
‫حيث أن‬

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

‫القواعد التي يجب التقيد بها في هذه الطريقة‬
‫‪-1‬قد تكون القيمة الجديدة عبارة عن تعبير حسابي يعتمد على قيم الحقول في الجدول‬
‫‪-2‬قد تكون القيمة الجديدة ناتجة عن جملة استعلم فرعي ‪SELECT‬‬
‫‪-3‬يجب أن يكون نوع بيانات القيم الجديدة من نفس نوع بيانات الحقول التي سيتم تعديلها‬
‫‪-4‬عند تعديل حقول التاريخ والنصوص يجب وضع القيم الجديدة بين علمتي تنصيص مفردتين‬
‫‪-5‬يجب مراعاة وجوب إعطاء قيم للحقول التي سيتم تعديلها والتي تم تعريفها على أنها حقول إجبارية أي ل تحتوي‬
‫فراغ ‪NOT NULL‬‬
‫مثال‬
‫‪s_emp‬‬
‫‪dept_id = 10‬‬
‫;‪id = 2‬‬

‫‪UPDATE‬‬
‫‪SET‬‬
‫‪WHERE‬‬

‫ثانيا ‪ :‬تعديل بيانات حقل ‪ /‬حقول لجميع السجلت في الجدول‬
‫الصيغة العامة‬
‫‪table‬‬
‫]‪column1 = value [, column2 = value‬‬

‫‪UPDATE‬‬
‫‪SET‬‬

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

‫‪67‬‬

‫‪UPDATE‬‬
‫‪SET‬‬

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

‫‪DELETE [FROM] table‬‬
‫‪[WHERE‬‬
‫;]‪condition‬‬

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

‫القواعد التي يجب التقيد بها في هذه الطريقة ‪:‬‬
‫‪-1‬يجب التأكد من بيانات السجلت التي سيتم حذفها قبل تنفيذ جملة الحذف وكذلك التأكد من الشرط في الجملة‬
‫الشرطية لن السجلت التي ستحذف تعتمد على الشرط المذكور‬
‫ثانيا‪ :‬حذف جميع سجلت الجدول‬
‫الصيغة العامة‬
‫‪;DELETE [FROM] table‬‬
‫الشرح‬
‫بعد تنفيذ جملة الحذف بهذه الطريقة سوف يتم حذف جميع السجلت في الجدول‬
‫ملخص الفصل‬
‫تناولنا في هذا الفصل موضوع تعديل البيانات في الجدول بواسطة جملة ‪ UPDATE‬وهنالك طريقتان لجراء عملية‬
‫التعديل وهما‬
‫أول تعديل بيانات حقل‪ /‬حقول لسج واحد أو اكثر‬
‫حيث يتم الغاء القيم الموجودة بها لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما بأن السجلت التي سيتتم‬
‫التعديل بها هي السجلن التي تحقق الشرط‪.‬‬
‫ثانيا‪ :‬نعديل بيانات حفل ‪ /‬حقول لجميع السجلت في الجدول‬
‫حيث يتم الغاء القيم الموجودة بها لتحتوي على القيم الجديدة المذكورة في جملة التعديل علما انه سيتم تعديل بيانات‬
‫جميع الحقول لعدم وجود شرط‬
‫ثم تناولنا موضوع حذف السجلت عن ‪ DELETE‬وهنالك طريقتان لجراء عمليةا الحذف‬
‫أول‪ :‬حذف سجل أو أكثر من الجدول‬
‫بهذه الطريقة سوف يتم حذف السجل ‪ /‬السجلت التي تحقق الشرط في جملة الشرط‬
‫ثانيا ‪ :‬حذف جميع سجلت الجدول‬
‫‪68‬‬

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

‫‪69‬‬

‫المتسلسلت والفهارس والعروض‬
‫أهداف الفصل‬
‫في نهاية هذا الفصل ستكون ان شاء ال قادر على‬
‫‪-1‬التعامل مع المتسلسلت‬
‫‪-2‬تكوين متسلسلة‬
‫‪-3‬التعديل في متسلسلة‬
‫‪-4‬حذف متسلسله‬
‫‪-5‬معرفة الفرق بين الفهرسه التلقائية والفهرسه العادية‬
‫‪-6‬عمل فهرسه للبيانات‬
‫‪-7‬الغاء الفهرسه‬
‫‪-8‬التعامل مع العروض ‪View‬‬
‫‪-9‬تكوين عرض‬
‫‪-10‬تعديل العرض‬
‫‪-11‬الغاء عرض‬

‫‪70‬‬

‫المتسلسلت‬
‫‪.‬المتسلسلة عبارة عن مجموعه من الرقام المتتالية تتولد تلقائيا مثل ‪1‬و ‪2‬و ‪ ,,, 3‬حيث تستخدم كمفتاح أساسي‬
‫‪ 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‬حيث يمكن للمتسلسلة ان تصل الى( ‪ (1027‬للمتسلسلة التصاعديه وللتنازليه (‪(1-‬‬
‫•السطر الخامس يتم تحديد ادنى قيمه للمتسلسله والوضع الفتراضي عدم وجود قيمة ‪NOMINVALUE‬‬
‫حيث يمكن للمتسلسلة تصل الى (‪ (1‬في حالة المسلسلة التصاعدية وحالة التنازليه الى (‪(1026-‬‬

‫•السطر السادس ‪ cycle‬يسمح بتكرارا المتسلسلة اذا وصلت الى أقصى قيمه وأدنى قيمه‬
‫والوضع الفتراضي هو عدم التكرار‬

‫•السطر السادس يتم فيه حجز اماكن في الذاكره للمتسلسلة وذلك لسرعه التعامل مع المتسلسلة حيث نكتب‬
‫في ‪ n5‬عدد الخانات والوضوع الفتراضي أن اكون ‪ 20‬واذا اخترنا ‪ NOCACHE‬فانه ليتم حجز‬
‫اماكن في الذاكره‬
‫مثال‬
‫‪CREATE SEQUENCE s_dept_id‬‬
‫‪INCREMENT BY 1‬‬

‫‪START WITH 51‬‬

‫‪MAXVALUE 9999999‬‬
‫‪NOCACHE‬‬
‫;‪NOCYCLE‬‬
‫‪71‬‬

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

‫•استخدام المتسلسلت‬
‫اذا اردنا اضافة قيمه جديدة الى متسلسلة تستخدم‬
‫‪Table_name.NEXTVAL-2‬‬
‫واذا اردنا القيمة الحاليه نستخدم‬
‫‪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‬‬

‫ملحظة‬
‫لكن توجد ثغرات في المتسلسلت‬
‫‪ -1‬اذا تم نقل سجل من مكان الى اخر فإانه يحدث خلل في المتسلسلة‬
‫‪ -2‬المتسلسلة يمكن أن نتستخدم في اكثر من جدول‬

‫تعديل متسلسلة‬
‫يمكن تعديل مقدار الزياده أو القيمه البتدائية للمتسلسله ونحديد اكبر وقيمه وادنى قيمه أو تغيبر خيار التكراراو الذاكره‬
‫عن طريق المر ‪ALTER‬‬
‫الصيغه العامه‬
‫‪ALTER SEQUENCE sequence‬‬
‫]‪[INCREMENT BY n‬‬
‫]}‪[{MAXVALUE n | NOMAXVALUE‬‬
‫]}‪[{MINVALUE n | NOMINVALUE‬‬
‫]}‪[{CYCLE | NOCYCLE‬‬
‫]}‪[{CACHE n | NOCACHE‬‬
‫‪72‬‬

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

‫حذف متسلسلة‬
‫يتم حذف متسلسلة عن طريق المر ‪DROP‬‬
‫مثال‬
‫;‪DROP SEQUENCE s_dept_id‬‬

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

‫كيف تتم الفهرسة ؟‬
‫الفهرسه التلقائية‬
‫عندما نقوم بتعريف حقل على انه مفتاح أساسي أو اذا جعلناه حقل فريد فانه تلقائيا يفهرس‬
‫الفهرسة العادية‬
‫يمكن أن نقوم بفهرسة بيانات غير فريدة لتسهيل الوصول اليها‬
‫أنواع الفهرسة‬
‫توجد عدة أنواع للفهرسه يث يمكن فهرسة حقل (عمود( واحد او مجموعة من العمدة منها‬

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

‫الفهرسة الغير فريدة ‪nonunique index‬‬
‫هي عبارة عن قيم مفهرسة ولكن بدون أي تقييد‬
‫‪73‬‬

‫الفهرسة المركبة ‪composite index‬‬
‫حيث يتم فهرسة عدة اعمدة حيث أن كل عمود له قيم مختلفة‬
‫وتستخدم الفهرسة المركبه عندما تعود جملة ‪ SELECT‬بعدة قيم فيتم ترتيبها عن طريق استخدام الفهرسة المركبة‬

‫كيف يقوم الوراكل بالتعامل مع الفهرسة‬
‫عندما نقوم بفهرسة حقل فإن الوراكل يقوم بتكوين مايسمى ‪ index segment‬بتم فيها تخزين معلومات خاصة‬
‫بالفهرسة والتي تسرع الوصول الى البيانات حيث أن هذه المعلومات توضح أماكن السجلت وتوضح أقصر الطرق‬
‫للوصول اليها عن طريق وسائل الخرج والدخال‬
‫والمصطلح الذي تعتمد عليه الفهرسة يسمى ‪ B*-tree index‬هي عبارة عن محطط شجري لمجموعة من القيم مرتبة‬
‫تنازليا حيث كلما ننتقل الى قيمة تاليه يتم مقارنتها مع كتلة القيم التي تعلوها وتسمى هذه الكتل ‪ branch blocks‬وناتج‬
‫هذه المقارنه يتم مقارنته مع كتل اخرى إلى أدنى درجة في هذه الكتل ويسمى ‪ leaf blocks‬حبث تحتوي هذه الكتلة‬
‫على كل البيانات المفهرسه ويوجد ما يسمى ‪ ROWID‬لهذه البيانات‬

‫اذا كانت البيانات فردية فإنه يوجد ‪ ROWID‬لكل قيمة ولكن اذا لمت تكن فردية فانه يمكن ان يتواجد أكثر من‬
‫‪ ROWID‬وفي هذه الحالة يتم ترتيبها البيانات حسب مفتاح الفهرسه ثم حسب ‪ROWID‬‬
‫الصيغة العامة‬
‫‪CREATE INDEX index‬‬
‫;)‪ON table (column[, column]...‬‬
‫حيث أن‬
‫‪ Index‬اسم الفهرس‬
‫‪Table‬‬
‫‪74‬‬

‫‪Column‬‬
‫مثال‬
‫‪CREATE INDEX‬‬
‫‪s_emp_last_name_idx‬‬
‫‪ON‬‬
‫;)‪s_emp(last_name‬‬
‫عند الفهرسة يجب مراعاة مايلي‬
‫‪-1‬ل نفهرس الجداول التي استعلم عنها بعدد كبير من الصفوف يث نستخدم الفهرسه عندما يكون الستعلم ل‬
‫يتجاوز ‪ % 5‬من الجدول‬
‫‪-2‬ل نفهرس الحقول التي ينم التعديل قيها باستمرار‬
‫‪-3‬ل نفهرس الجداول التي تحتوي على قيم متكررة بكثرة‬
‫‪-4‬نفهرس الحقول التي يكون الستعلم عنها سهل عالبا فل نستخدم الفهرسه مع استعلمات شروطها معقدة‬
‫‪-5‬ل نفهرس غالبا الحقول التي ل تحتوي على قيم فريدة‬
‫‪-6‬نفهرس الحقول التي تعتبر حقول رابطه بين جدول واخر‬

‫حذف الفهرسة‬
‫لحذف الفهرسة نستخدم المر ‪DROP INDEX‬‬
‫مثال‬
‫;‪DROP INDEX s_emp_last_name_idx‬‬

‫العروض‬
‫العرض عبارة عن استعلم من جدول واحد أو اكثر حيث يعتبر جدول وهمي يحتوي على البيانات التي يأخذها‬
‫من جملة ‪ SELECT‬ولكن حقيقة ان هذا الجدول غير موجود‬
‫ويمكن استخدم العلض في عدة مهام منها ‪:‬‬
‫•يحافظ على التحكم في مستوي المان‬
‫•اخفاء تعقيد البيناتا عن المستخدم‬
‫•اعادة تسمية العمدة‬
‫الصيغة العامة‬
‫‪CREATE VIEW view-name‬‬
‫)‪(column1,...,columnN‬‬
‫‪AS‬‬
‫‪select-statement‬‬
‫حيث أن‬
‫‪ view-name‬اسم العرض‬
‫‪ Column1‬اسم الحقول التي ستم عرضها‬
‫‪75‬‬

‫مثال‬
‫‪CREATE VIEW empvu45‬‬

‫‪AS SELECT id, last_name, title‬‬
‫‪FROM s_emp‬‬
‫;‪WHERE dept_id = 45‬‬

‫ويمكنك مشاهدة المعلومات الخاصة بهذا العرض عن طريق المر ‪ 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‬‬
‫‪76‬‬

‫ثالثا‬
‫‪update S_EMP‬‬
‫'‪set Manager = 'Y‬‬
‫‪where‬‬
‫;‪ID = 1001‬‬
‫في اخر خطوتين قمنا بتحديد شرط وهو في حالة اذاكان رقم الموظف ‪ 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‬ل يتم عرض حقل المرتب‬
‫فلنفرض أن ‪ Ahmed‬هو المدير فاذا قام بكتابة الستعلم‬
‫* ‪select‬‬
‫;‪from Re_Salary‬‬
‫فان المخرجات ستكون‬
‫‪77‬‬

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

78

‫تعديل العرض‬
‫يتم التعديل في العرض عن طريق المر‬
‫‪3-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‬‬

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

‫‪79‬‬

‫نبذه ‪pl/sql‬‬
‫أهداف الفصل‪.‬‬
‫‪-1‬التعرف على ‪PL/SQL‬‬
‫‪-2‬استخدام قاعدة ‪.IF‬‬
‫‪-3‬استخدام التكرار‬
‫‪-4‬‬

‫‪80‬‬

‫التعرف على ‪PL/SQL‬‬
‫هي عبارة عن كتل برمجية تشيه في في طريقة كتابتها لغة ‪ C‬بالضافة لدعمها ‪ SQL‬وتحتوي هذه اللغة على‬
‫اجراءات خاصة بها واومر مثل ‪ IF‬وغيرها وكذلك دوال وكتل برمجية مجهولة وهي التي ل تحتوي على اومر و ل‬
‫تعود بقيمة‬
‫ويمكن تمثيل بنية البرنامج في ‪ PL/SQL‬في الشكل التالي‬

‫برامج ‪ pl/sql‬تتم كتابتها في كتل من اوامر البرمجة تحتوي على مقاطع منفصلة للعلن عن المتغيرات واوامر‬
‫البرامج ومعالجة الستثناءت(الخطاء( ‪.‬‬
‫ومن الممكن تخزبن الجراء في قاعدة البيانات كبرنامج فرعي له اسم محدد او كتابتها مباشرة في ‪ sql * plus‬ككتله‬
‫مجهولة‪.‬‬
‫وكتلة البرنامج كمايلي‪:‬‬
‫سنبدا اول كتابة الجراء مباشرة في ‪ sql * plus‬وهي كمايلي‪:‬‬
‫‪DECLARE‬‬
‫هنا توجد تعريفات التغيات والوشرات‬
‫‪BEGIN‬‬
‫جسم البنامج‬
‫‪EXCEPTION‬‬
‫رموز معالة الخطاء‬
‫‪END:‬‬
‫مع ملحظة مايلي‪:‬‬
‫ان قسم ‪ declare‬وقسم ‪ exception‬هما اختيارين اي ليشترط وجودهما‬
‫اي اذا كان ليوجد لديك تعريف متغيرات لتستخدم ‪ declare‬واذا كنت لن تتعامل مع الخطاء لتستخدم‬
‫‪exception‬‬
‫والصيغة العامة لتعريف المتغيرات في ‪declare‬‬
‫‪81‬‬

‫]‪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‬‬
‫ومن انواع المتغيرات التي تدعمها ‪ PL/SQL‬بالضافة الى المتغيرات التي توجد ‪SQL‬‬
‫‪-1‬المتغير ‪BINARY_INTEGER‬‬
‫وتشمل الرقام الصحيحة بين –‪2.147.483.647‬و ‪2.147.483.647‬‬
‫‪-2‬المتعير ‪PLS_INTEGER‬‬
‫وتشمل الرقام الصحيحة بين –‪2.147.483.647‬و ‪ 2.147.483.647‬وهذا النوع ل يشغل مساحة كبيرة من الذاكر ة‬
‫وأسرع من ‪ BINARY_INTEGER‬و ‪Number‬‬
‫‪NATURAL -3‬‬
‫وتشمل الرقام من ‪ 0‬الى ‪2.147.483.647‬‬

‫‪POSITIVE -4‬‬
‫وتشمل الرقام الموجبة فقط من ‪ 1‬الى ‪2.147.483.647‬‬
‫‪BOOLEAN-3‬‬
‫وهو متغير يحمل القيمة ‪ TRUE‬أو ‪ FALSE‬أو ‪NULL‬‬
‫‪TYPE%-4‬‬
‫صمم هذا المتغير ليحمل نفس توع البيانات التي يحملها حقل معين‬
‫‪ROWTYPE%-4‬‬
‫صمم هذا المتغير ليكون متغير مركب يحمل نفس توع البيانات التي يحملها صف معين‬
‫طريقة تعريف المتغير من النوع ‪TYPE%‬‬
‫الصيغة العامة‬
‫;‪table-name.column-name%TYPE‬‬
‫‪82‬‬

‫‪variable-name‬‬

‫مثال‬
‫‪;s_emp.last_name%TYPE‬‬
‫‪v_last_name‬‬
‫في هذا السطر نقوم بتعريف المتغير ‪ v_last_name‬أنه من نفس نوع الحقل ‪ last_name‬في جدول‬
‫‪ S_EMP‬ويحتوي على نفس القيم‬
‫طريقة تعريف المتغير من النوع ‪ROWTYPE %‬‬
‫الصيغة العامة‬
‫;‪table-name%ROWTYPE‬‬

‫‪variable-name‬‬

‫مثال‬
‫‪emp_record‬‬
‫;‪s_emp%ROWTYPE‬‬
‫قمنا بتعريف المتغير المركب ‪ emp_record‬الذي يحمل قيمة صف من صفوف الجدول ‪s_emp‬‬
‫طرق السناد‬
‫مثل اذا اردت ان تقول ان قيمة ‪ i=5‬فيتم ذلك كمايلي‪:‬‬
‫‪;i:=5‬‬
‫يجب وضع النقطتين قبل =‬
‫سوف ناخذ مثال على ذلك‬
‫يوجد ضمن اوامر ‪ sql‬المر ‪DBMS_OUTPUT.PUT_LINE‬‬
‫يستخدم لكي تعرض النتيجة في ‪ sql * plus‬وهو أمر تابع للحزمة ‪DBMS_OUTPUT‬‬
‫فهذا المر يقوم بعرض الجمل ويمكن أن يعرض كذلك التواريخ والرقام واذا اردنا ان يعرض انواع بيانات اخرى‬
‫نستخدم المر ‪TO_CHAR‬‬
‫والصيغة العامة له ‪:‬‬
‫)‪DBMS_OUTPUT.PUT_LINE(massege‬‬
‫حيث‬
‫‪massage‬‬

‫هي النص او الشي الذي تريد عرضة‬

‫تم شرح هذا المر لكي نبدأ به ونستخدمه لفهم اوامر ال ‪ pl/sql‬لكن في المستقبل سوف تعرف ان هذا المر ليهمك‬
‫كثيرا‬

‫‪83‬‬

‫‪.‬مثال ‪:‬‬
‫نريد طباعة "‪ "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‬‬
‫فائدة || الموجدة ضمن عملة الطباعة هي للوصل بين التعبيرين‬

‫‪84‬‬

‫الشرط عبارة ‪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‬‬
‫الشرط باستخدام اكثر من شرط‬
‫‪85‬‬

‫;)'‪|| ' > 1‬‬
‫;)'‪|| ' < 1‬‬
‫;)'‪|| ' = 1‬‬

‫‪Declare‬‬
‫‪i‬‬
‫;)‪number(5‬‬
‫‪BEGIN‬‬
‫;‪i:=5‬‬
‫‪IF i>1 then‬‬
‫‪DBMS_OUTPUT.PUT_LINE(i‬‬
‫‪ELSIF i<1 then‬‬
‫‪DBMS_OUTPUT.PUT_LINE(i‬‬
‫‪ELSIF i=1 then‬‬
‫‪DBMS_OUTPUT.PUT_LINE(i‬‬
‫;‪END IF‬‬
‫;‪END‬‬

‫الـــتكرار‬
‫يوجد عدة اوامر للتكرار وهي‪:‬‬

‫‪loop-exit-end -1‬‬
‫وهنا لبد من وضع شرط لنهاء الحلقة‬
‫نأخذ مثال بسيط على ذلك‬

‫الشرح‬
‫السطر الثاني ‪ :‬تعريف متغير من نوع رقم‬
‫السطر الثالث ‪:‬البداية‬
‫السطر الرابع ‪ :‬اعطاء المتغير قيمة ابتدائية وهي ‪i=1‬‬
‫السطر الخامس ‪ :‬شرط النهاء‬
‫السطر السادس ‪ :‬النهاء اذا كان ‪ i<10‬ول يكمل‬
‫السطر السابع ‪:‬انها ‪if‬‬
‫السطر الثامن ‪ :‬طباعة ‪i‬‬
‫السطر التاسع ‪:‬زيادة قيمة ‪ i‬بواحد‬
‫السطر العاشر ‪ :‬نهاية الحلقة‬
‫‪86‬‬

‫‪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 =2
i=3
i =4
i =5
i =6
i =7
i =8
i =9
i =10

LOOP- EXIT WHEN - END -2
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 -3
Declare
i
number(5);
BEGIN
i:=1;
WHILE i <= 10 LOOP
DBMS_OUTPUT.PUT_LINE('i =' || i);
i:=i+1;
End loop;
END;
/
87

‫ويكون الناتج نفس المثال السابق‬

‫‪FOR - IN - LOOP - END-4‬‬
‫وهذه ايضا طريقة اخرى لستخدام حلقات التكرار وهي نفس عمل اسلوب حلقات ‪ for‬في اي لغة برمجة‬
‫والصيغة العامه لها هي على التي‬
‫‪IN‬‬

‫‪i‬‬

‫‪FOR‬‬

‫النهاية‪ ..‬البداية ‪LOOP‬‬
‫المل الراد تكرارها‬
‫‪END LOOP‬‬

‫مثـــال‪:‬‬
‫‪Declare‬‬
‫‪;(i‬‬
‫‪number(5‬‬
‫‪BEGIN‬‬
‫‪FOR i‬‬
‫‪IN 1..10 LOOP‬‬
‫‪;(DBMS_OUTPUT.PUT_LINE('i =' || i‬‬
‫‪;End loop‬‬
‫‪;END‬‬
‫‪/‬‬
‫وسوف يكون الناتج كمايلي(نفس السابق(‪:‬‬
‫‪i =1‬‬
‫‪i =2‬‬
‫‪i =3‬‬
‫‪i =4‬‬
‫‪i =5‬‬
‫‪i =6‬‬
‫‪i =7‬‬
‫‪i =8‬‬
‫‪i =9‬‬
‫‪i =10‬‬
‫جملة ‪GOTO‬‬
‫كما في باقي لغات البرمجة فان ‪ GOTO‬تنقل تسلسل عمل البرامج من نقطه الى اخرى‬
‫الصيغة العامة‬
‫>>‪GOTO <<my_label‬‬
‫حيث أن‬
‫‪my_label‬‬
‫‪88‬‬

‫عنوان النقظة التي سيتم النتقال اليها‬

‫مثال‬
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 ‫يمكن كتابة التعليقات في‬
‫( ثم التعليق‬--( ‫كتابة‬-1
‫مثال‬
-- DON’T FORGET

MY NAME

‫كتابة (***( ثم التعليق ثم (***( مرة أخرى‬-2
‫مثال‬
*** DON’T FORGET

MY NAME ***
‫*( مرة اخرى‬/ ( ‫*( ثن التعليق ثم‬/( ‫كتابة‬-3

*/ DON’T FORGET

MY NAME /*

‫مثال‬

89

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 ‫في هذا المثال قمنا باستخدام المر‬

90

‫المؤشرات ‪CURSORS‬‬
‫اهداف الفصل‬
‫قي مهاية هذا الفصل إن شاء ال ستكون قادر على‬
‫‪-1‬التعامل مع المؤشرات الصريحه‬
‫‪-2‬النعامل مع المؤشرات الضمنية‬

‫المؤشرات ‪CURSORS‬‬
‫تستخدم ‪ pl/sql‬المؤشرات ‪ cursors‬لدارة عبارات التحديد ‪ select‬في لغة ‪ sql‬وكما لحظنا الوامر السابقة مثل ‪if‬‬
‫والتكرار لم نستخدمها مع بيانات الجداول المخزنه ولعمل ذلك لبد من استخدام هذه المؤشرات‪.‬‬
‫وهناك نوعين من المؤشرات هي الضمنية والصريحة وسوف نتطرق لك واحد بالتفصيل والمثلة اللزمة‪.‬‬

‫‪ -1‬المؤشرات الصريحه ‪:‬‬
‫يتم تعريف هذا النوع من المؤشرات كجزء من العلن ‪ declare‬ويجب ان تشتمل عبارة ‪ sql‬المعرفه على عبارة‬
‫التحديد ‪ select‬فقط حيث ليمكن استخدام الكلمات الساسية ‪insert,update,delete‬‬
‫وعند استخدام المؤشرات الصريحه دائما ماستكتب اربعة مكونات كمايلي‪:‬‬
‫‪ -1‬يتم تعريف المؤشر في الجزء ‪declare‬‬
‫‪ -2‬يتم فتح المؤشر بعد عبارة ‪begin‬‬
‫الصيغة العامة لتعريف المؤشر الصريح كمايلي‪:‬‬
‫‪CURSOR‬‬

‫اسم الؤشر‬

‫‪DECLARE‬‬
‫‪IS‬‬
‫الستعلم‬

‫تقوم باستبدال اسم المؤشر باسم مؤشر حقيقي‬
‫وتقوم بوضع جملة الستعلم ‪ select‬في مكان الستعلم‬
‫ولكي تقوم بفتح هذا المؤشر وتستخدمه نقوم بفتحه باستخدام المر ‪ open‬كمايلي‪:‬‬
‫اسم المؤشر ‪OPEN‬‬
‫وبعد فتح المؤشر تقوم باسترجاع او تحميل البيانات سطر(سجل( واحد من المؤشر الذي تم تعريفه باستخدام المر‬
‫‪ FETCH‬كمايلي‪:‬‬

‫‪,.......‬متغي ‪,2‬متغي ‪INTO 1‬‬
‫‪91‬‬

‫اسم الؤشر ‪FETCH‬‬

‫ الى المتغيرات كع ملحظة ان عدد‬into ‫ومعنى هذا اي قم باسترجاع البيانات من المؤشر المعطى اسمه وحملها‬
.‫المتغيرات يساوي عدد الحقول الموجودة في استعلم المؤشر‬
:‫وبعد النتهاء من اجراء العمليات على المؤشر يجب عليك اغلقه ويتم اغلقه كمايلي‬
close cursor_name
: ‫مثال على طريقة تعريف مؤشر‬
‫افرض انه لدينا هذا الجدول‬
age
23
22
24

name
mohammed
talal
majed

no
111
222
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
/
:‫بعد التنفيذ سوف يظهر لك الناتج كمايلي‬
mohammed
92

‫وهذا الشي صحيح‬
‫لحظ اننا اتبعنا نفس الخطوات التي ذكرناه لكي نتعامل مع مؤشر صريح‬
‫لحظنا في المثال السابق ان الستعلم في ‪ cursor‬سوف يعود بسجل واحد لكن ماذا يحدث لو اعاد المؤشر اكثر من‬
‫سجل واردنا المرور على كافة السجلت ؟‬
‫لحل السؤال السابق لبد من استخدام حلقة بها شرط وهذا هو هل سجلت المؤشر انتهت ام ل ونعرف ذلك من خلل‬
‫خاصية ‪ found‬للمؤشر كمايلي‪:‬‬
‫‪mycur%found‬‬
‫حيث ‪:‬‬
‫‪ : mycur‬هي اسم المؤشر‪.‬‬
‫‪ : %‬توضح انا مايلي اسم المؤشر هي احد خصائصه‪.‬‬
‫‪ : found‬خاصية التي من خللها نعرف هل تم النتهاء من جميع السجلت ام ل‬
‫مثال ‪:‬‬
‫الدرجة‬
‫النتيجة‬
‫‪MARK RESULT‬‬

‫كود المقرر‬
‫‪SUBJECT‬‬
‫‪88‬‬
‫‪75‬‬
‫‪40‬‬

‫اسم الطالب‬
‫‪NO_STU‬‬
‫‪216CS‬‬
‫‪225CS‬‬
‫‪225CS‬‬

‫‪111‬‬
‫‪222‬‬
‫‪333‬‬

‫نريد انشاء اجراء يقوم بالمرور على الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر ام ل فاذا كان ‪mark‬‬
‫اكبر او يساوي ‪ 50‬ضع قيمة ‪ true‬في حقل ‪ result‬وال ضع قيمة ‪ false‬في حقل ‪result‬‬

‫نقوم اول بانشاء هذا الجدول ‪:‬‬
‫(‪create table stu_study‬‬
‫‪NO_STU number(4),‬‬
‫‪SUBJECT varchar2(8),‬‬
‫‪MARK number(3),‬‬
‫;))‪RESULT varchar2(20‬‬
‫وبعد انشاء الجدول نقوم بادخال المدخلت السابقة‬
‫‪insert into stu_study (NO_STU,SUBJECT,MARK) values‬‬
‫;)‪(111,'216CS',88‬‬
‫‪93‬‬

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
111
222
333

SUBJECT
216CS
88
225CS
75
225CS
40

MARK

RESULT
TRUE
TRUE
FALSE

‫ تم تعريفه على انه من نوع‬no_Stu ‫هناك طريقة اخرى لتعريف المتغيرات لحظ في الجدول السابق ان الحقل‬
‫ ايضا لكي يتم وضع رقم الطالب فيه لكن لحظ لو‬number ‫ في الجراء على انه‬no ‫ وتم تعريف المتغير‬number
‫ في الجراء ايضا‬no ‫ فانه يجب عليك تغير نوع المتغير‬varchar2 ‫ الى‬number ‫تم تغير نوع الحقل في الجدول من‬
‫ في الجراء‬no ‫لكن هناك طريقه تجعلك لتعدل الجراء كل مرة وهي استخدام المر التالي لتعريف المتغير‬

94

NO

stu_study.no_stu%type
: ‫حيث‬
‫ هي اسم المتغير‬NO
‫ اسم الجدول‬: stu_study
‫ الحقل المطلوب في الجدول‬: no_stu
‫ خاصية نوع الحقل‬: type%

‫ الموجود في الجدول‬NO_STU ‫ له نفس نوعية الحقل الذي اسمه‬no ‫ومعنى ماسبق قم بتعريف متغير اسمه‬
. 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;
end loop;
close res_stu;
end;
/

95

‫المؤشرات الضمنية‬

‫تعرفنا سابقا على فائد المؤشرات ‪ cursors‬ودرسنا النوع الول منها وفي هذا الفصل عندنا نوع اخر وهو المؤشرات‬
‫الضمنية وهي اسهل من المؤشرات الصريحه‬
‫وتوجد نقطتين هامتين عند التعامل مع المؤشرات الضمنيه ‪:‬‬
‫* يظهر المؤشر الضمني في جسم الجراء ‪ body‬وليس في ‪ declare‬الخاص بالجراء كمافي المؤشرات الصريحه‬
‫* لبد ان يسترجع مؤشر ‪ select‬الضمني سطر واحد‪.‬‬
‫والصيغة العامه للمؤشر الضمني كمايلي‪:‬‬
‫‪SELECT COLUM1,COLUM2,....... INTO‬‬
‫‪.....,VARIABLE1,VARIABLE2‬‬
‫‪table_name‬‬

‫‪FROM‬‬

‫ومعنى هذا قم باختيار الحقل ‪ 1‬و الحقل ‪ 2‬وضعها في المتغيرات منغير ‪ 1‬و متغير ‪ 2‬من الجدول ‪table_name‬‬
‫سوف نأخذ مثال على ذلك وسوف نستخدم الجدول الذي انشئناه سابق في الدرس الثاني عندما تعاملنا مع المؤشرات‬
‫الصريحة وكان اسم الجدول ‪stud‬‬
‫‪age‬‬
‫‪23‬‬
‫‪22‬‬
‫‪24‬‬

‫‪name‬‬
‫‪mohammed‬‬
‫‪talal‬‬
‫‪majed‬‬

‫‪no‬‬
‫‪111‬‬
‫‪222‬‬
‫‪333‬‬

‫واردنا مثل كتابة اجراء يقوم بحساب متوسط اعمار الطلب ( قد يقول البعض انه ليحتاج ذلك الى اجراء فمجرد‬
‫استخدام جملة ‪ select‬نستطيع عمل ذلك انا اقول نعم هذا صحيح لكن احب استخدام الجراء في هذا المثال لكي نرى‬
‫طريقة عمل المؤشر الضمني ولكن سوف نرى بعد قليل مثال شامل يتم فيه استخدام الموشرات الصريحه والضمنية‬
‫في نفس الوقت( والن نقوم بكتابة الجراء كمايلي ‪:‬‬
‫;‪set serveroutput on‬‬
‫‪declare‬‬
‫;)‪aveage number(4,2‬‬
‫‪begin‬‬
‫)‪select avg(age‬‬
‫‪into aveage‬‬
‫;‪from stud‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(aveage‬‬
‫;‪end‬‬
‫‪/‬‬
‫‪96‬‬

: ‫*** مثال شامل لستخدام الموشرات الصريحة والضمنيه في نفس الوقت‬
:(‫ (المقررات‬courses ‫ الجدول الول اسمه‬: ‫لنفرض انه لدينا الجدولين التاليين‬

‫رقم المقرر‬
code
216CS
225CS
325CS

‫اسم المقرر‬
course_name
NETWORK3
ASSEMBLY3
DATABASE4

‫عدد الساعات‬
hours

:‫وقم بانشاء الجدول كمايلي‬

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);
insert into courses values('325CS','DATABASE',4);
: studys ‫ثم نقوم بتكوين الجدول الثاني وهو‬

‫اسم الطالب‬
‫كود المقرر‬
‫الدرجة‬
NO_STU COURSE_CODE
MARK
111
216CS
88
222
225CS
75
333
225CS
40
111
225CS
90
222
216CS
78

‫عدد النقاط‬
POINT

97

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
values
insert
values
insert
values
insert
values
insert
values
insert
values

into studys(NO_STU,COURSE_CODE,MARK)
('111','216CS',88);
into studys(NO_STU,COURSE_CODE,MARK)
('222','225CS',75);
into studys(NO_STU,COURSE_CODE,MARK)
('333','225CS',40);
into studys(NO_STU,COURSE_CODE,MARK)
('111','225CS',90);
into studys(NO_STU,COURSE_CODE,MARK)
('222','216CS',75);
into studys(NO_STU,COURSE_CODE,MARK)
('333','216CS',85);

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

MARK
95-100
90-94
85-89
80-84
75-79
70-74

average
5
4.75
4.5
4
3.5
3
98

65-69
60-64
1-59

2.5
2
1
: ‫ويتم حساب النقاط كمايلي‬

‫عدد النقاط في اي مقرر = معدل المادة (وليس الدرجة كمافي الجدول السابق( * عدد ساعات المقرر‬
216CS ‫ في المقرر‬111 ‫مثال لحساب معدل الطالب الذي رقمه‬
-85 ‫ ونلحظ ان الدرجة من الجدول السابق هي بين‬88 ‫ ان الطالب قد تحصل على درجة‬studys ‫نلحظ من جدول‬
‫ ومن جدول‬, (‫ (وهي الطريقة المتبعة في اغلب الجامعات‬4.5 ‫ وبالتالي فإن معدل الطالب في هذا المقرر هو‬89
: ‫ نحصل على عدد الساعات للمقرر وبالتالي فان‬courses
.‫ وهكذا في جميع الطلب وهذا هو المطلوب من الجراء عمله‬13.5 = 3 * 4.5 = ‫عدد النقاط‬
:‫وبالتالي فان الجراء سوف يكون كمايلي‬
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
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
99

‫;‪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‬والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كل مرة يدور بالحلقة‪.‬‬

‫شرح الجراء ‪:‬‬
‫في التعريفات اتوقع انه لتوجد هناك مشكلة لديكم ‪ ,‬اما جسم البرنامج ابتدأً من ‪ begin‬فهو كمايلي ‪:‬‬
‫اول يفتح المؤشر الصريح والذي يحتوي على جميع سجلت الجدول ‪ studys‬ثم يكون حلقة دورانية لكي يمر على‬
‫جميع سجلت الطلب الموجودة في المؤشر الصريح وطبعا شرط النهاء لهذه الحلقة هو الوصول الى اخر سجل ‪ .‬ثم‬
‫يقوم بعملية تحديث سجلت الطالب الولى في المتغيرات كمايلي‪:‬‬
‫;‪fetch st_point into no_Student,cou_code,mark‬‬
‫وطبعا المتغيرات هي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض الن نحن الن عند السجل الول ووهو‬
‫الطالب الذي رقمه ‪ 111‬ورقم المقرر ‪ 216CS‬ودرجته هي ‪ 88‬سوف يضع هذه البيانات في المتغيرات‪ ,‬ثم يستخدم‬
‫مؤشر ضمني لكي يحضر عدد ساعات المادة التي درسها الطالب ‪ 111‬وهي ‪ 216CS‬و المؤشر هو‬

‫‪select hours‬‬
‫‪into hou‬‬
‫‪from courses‬‬
‫; ‪where code=cou_code‬‬
‫ومعنى هذا احضر عدد ساعات المقرر الذي رقمه هو ‪ cou_code‬وهذا المتغير هو معروف من المؤشر الصريح‬
‫الول وسبب استخدامنا هذا المؤشر هو ان عدد ساعات المقرر موجودة في جدول اخر ولبد من استخدام هذا المؤشر‬
‫لكي يحضر عدد الساعات‪ .‬وبما اننا فرضنا اننا عند السجل الول فسوف يحضر عدد ساعات المقرر ‪ 216CS‬وهي‬
‫‪ 3‬ساعات ثم بدأ يختبر الدرجة وذلك طبقا للجدول الدرجات والمعدلت حيث كانت درجة الطالب الذي رقمه ‪ 111‬في‬
‫المقرر ‪ 216cCS‬هي ‪ 88‬وبالتالي يكون عدد النقاط كمايلي = ‪ , 13.5 = 3 * 4.75‬وبعد النتهاء من حساب المعدل‬
‫‪100‬‬

‫يقوم بنعديل الجدول وتحديث قيمة ‪ point‬بقيمتها الجديدة ‪ ,‬وهكذا يمر على كل طالب بنفس الطريقة السابقة الى ان‬
‫يصل الى نهاية السجلت‪.‬وبالتالي تكون النتائج كمايلي في الجدول ‪: 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‬‬
‫بعد النتهاء من هذا المثال نكون انهينا المؤشرات بنوعيها بشكل تام وبامثله واقعيه‬

‫‪101‬‬

‫المصفوفات و الجرائيات و الدوال المخزنة‬
‫اهداف الفصل‬
‫سنتعلم في هذا القصل باذن ال‬
‫‪-1‬انشاء المصفوفات والتعامل معها‬
‫‪-2‬كيفية انشاء اجراء‬
‫‪-3‬التعامل مع الوظائف المخزنة‬

‫الجـداول في ‪ ( 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‬‬
‫‪102‬‬

‫‪FOR i IN 1..10 LOOP‬‬
‫;) )‪DBMS_OUTPUT.PUT_LINE(i || '*' || i || '= ' || num(i‬‬
‫;‪END LOOP‬‬
‫;‪END‬‬
‫‪/‬‬
‫وويكون عمل هذا الجراء كمايلي ‪ :‬الحلقة الولى تقوم بضرب العدد ‪ 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‬‬

‫الجرائيات المخزنة‬
‫شاهدنا في الدروس الماضية ان اي اجراء نقوم بكتابة اني اذا اردت استخدامة اكثر من مرة فاني اقوم بكتابة كل مرة‬
‫في ‪ 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‬فهي توضع حينما تعلم ان الجراء موجود من السابق‪.‬‬
‫‪103‬‬

‫اما عن المغيرات التي بين القوسين فهي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب معدل طالب وتريد تمرير‬
‫رقم الطالب الذي تريد حساب معدله فهذه هي تعتبر كمدخلت ولتعريف متغير بهذا الشكل يكون كمايلي ‪:‬‬
‫)‪in number(9‬‬

‫‪student_id‬‬

‫لحظ اسم المتغير هو ‪ student_id‬ثم بعده وضعنا الكلمة ‪ in‬ومعنى ان هذا المتغير يعتبر كمدخل‬
‫اما لتعريف متغير يعود بقيمة من الجراء مثل لو اردنا تعرف متغبر يرجع بمعدل الطالب يتم التعريف كمايلي ‪:‬‬
‫)‪ave out number(5,2‬‬
‫بعد تنفيذ الجراء يكون هذا المتغير يحتوي على معدل الطالب الذي تم تمرير رقمه مثل‪.‬‬
‫مع العلم انه يمكن تعريف متغير للمدخلت والمخرجات حيث تمرر به القيمه اول وبعد تنفيذ الجراء يتم وضع القيمه‬
‫في نفس المتغير وتتم كمايلي ‪:‬‬
‫)‪ave in out number(5,2‬‬
‫ومعنى هذا اي مدخل ومخرج في نفس الوقت ‪.‬‬

‫مــــثال ‪:‬‬
‫في الجدول الذي قمنا بدراسته في الفصول السابقة وكان بأسم ‪studys‬‬
‫وكان كمايلي ‪:‬‬

‫‪POINT‬‬
‫‪13.5‬‬
‫‪10.5‬‬
‫‪3‬‬
‫‪14.25‬‬
‫‪10.5‬‬
‫‪13.5‬‬

‫‪MARK‬‬

‫‪NO_STU COURSE_CODE‬‬
‫‪111‬‬
‫‪216CS‬‬
‫‪88‬‬
‫‪222‬‬
‫‪225CS‬‬
‫‪75‬‬
‫‪333‬‬
‫‪225CS‬‬
‫‪40‬‬
‫‪111‬‬
‫‪225CS‬‬
‫‪90‬‬
‫‪222‬‬
‫‪216CS‬‬
‫‪78‬‬
‫‪333‬‬
‫‪216CS‬‬
‫‪85‬‬

‫لو اردنا تصميم اجراء مخزن لكي يقوم بطباعة درجة الطالب بعد تمرير رقم الطالب ورقم المقرر‪.‬‬
‫الجراء المخزن سوف يكون كمايلي ‪:‬‬
‫(‪create or replace procedure stu_mark‬‬
‫‪stu_id in studys.NO_STU%type,‬‬
‫)‪cou in studys.COURSE_CODE%type‬‬
‫‪as‬‬
‫;‪mar studys.mark%type‬‬
‫‪104‬‬

‫‪begin‬‬
‫‪select mark‬‬
‫‪into mar‬‬
‫‪from studys‬‬
‫‪where NO_STU=stu_id‬‬
‫;‪and COURSE_CODE=cou‬‬
‫;)‪DBMS_OUTPUT.PUT_LINE(mar‬‬
‫;‪end‬‬
‫‪/‬‬
‫بعد النتهاء من تنفيذ الجراء يكون الجراء مخزن في قاعدة البيانات ولكي نقوم باستدعاءه نقوم بمايلي‬
‫‪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‬‬
‫‪105‬‬

‫;‪end‬‬
‫وسوف يكون الناتج هو ‪ 90‬وهذا صحيح بناء على الجدول‪/‬‬

‫‪.‬‬

‫الوظائف المخزنة‬
‫كان درسا السابق عن الجراءات المخزنة واليوم لدينا درس مشابه له وهو الوظائف المخزنة لكن الفرق ان الوظائف‬
‫لبد ان تعيد قيمة‬
‫والصسغة العامة لتكوين وظيفة كمايلي‪:‬‬
‫‪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‬اسم الوظيفة المستخدمه‪.‬‬
‫اما ‪ OR REPLACE‬فهي توضع حينما تعلم ان الجراء موجود من السابق‪.‬‬
‫اما عن المغيرات التي بين القوسين فهي اما متغيرات مدخله مثل اذا كان لديك اجراء حساب معدل طالب وتريد تمرير‬
‫رقم الطالب الذي تريد حساب معدله فهذه هي تعتبر كمدخلت ‪ ,‬وهي بنفس الطريقة التي تعاملنا بها مع الجراءت‬
‫المخزنة لتغير على المتغيرات وطرق تعريفها‪.‬اما ‪ RETURN datatype‬فهي تدل على نوع القيمة المعادة من‬
‫الوظيفة ‪.‬‬
‫مثــــــــال ‪ :‬في الجدول الذي قمنا بدراسته في الدرس الرابع وكان بأسم ‪ studys‬وكان كمايلي ‪:‬‬
‫‪POINT‬‬
‫‪13.5‬‬
‫‪10.5‬‬
‫‪3‬‬
‫‪14.25‬‬
‫‪10.5‬‬
‫‪13.5‬‬

‫‪MARK‬‬

‫‪NO_STU COURSE_CODE‬‬
‫‪111‬‬
‫‪216CS‬‬
‫‪88‬‬
‫‪222‬‬
‫‪225CS‬‬
‫‪75‬‬
‫‪333‬‬
‫‪225CS‬‬
‫‪40‬‬
‫‪111‬‬
‫‪225CS‬‬
‫‪90‬‬
‫‪222‬‬
‫‪216CS‬‬
‫‪78‬‬
‫‪333‬‬
‫‪216CS‬‬
‫‪85‬‬

‫لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى الوظيفة ثم يتم حساب المعدل‬
‫الفصلي للطالب‬
‫ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات لمقررات‬
‫‪106‬‬

: ‫ولنشاء الوظيفة كمايلي‬

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;
: ‫الشرح‬
‫ لتعريف الوظيفة‬:1 ‫السطر رقم‬
‫ نوع القيمة التي سوف ترجع بها الوظيفة‬:2 ‫السطر رقم‬
courses ‫ تعريف متغير عدد الساعات وهو نفس حقل عدد ساعات المقرر الموجودة في جدول‬:4 ‫السطر رقم‬
‫ تعريف متغير الذي سوف نضع به المعدل‬:5 ‫السطر رقم‬
‫ تعريف متغير لكي يوضع به مجموعات الساعات للطلب في كل المواد‬:6 ‫السطر رقم‬
‫ تعريف متغير لكي يوضع به عدد نقاط الطلب في اي مقرر‬:7 ‫السطر رقم‬
‫ تعريف متغير لكي يوضع به مجموع عدد نقاط الطالب في كل المقرر‬:8 ‫السطر رقم‬
‫ تعريف متغير لكود المادة‬:9 ‫السطر رقم‬
107

‫السطر رقم ‪ :10‬تعريف مؤشر صريح للحصول على كود المادة لكي نستفيد منه في الحصول على عدد الساعات وعدد‬
‫النقاط في ذلك المقرر لكي نضيفها الى مجموع النقاط‬
‫السطر رقم ‪ :16‬فتح هذا المؤشر لكي نتعامل معه‬
‫السطر رقم ‪ :17‬الدخول على حلقة لكي نمر على جميع الجدول‬
‫السطر رقم ‪ :18‬تحديث قيم المؤشر للسجل الحالي في المتغيرات ‪codem,point‬‬
‫السطر رقم ‪ :19‬شرط انهاء الحلقة وهو اذا لم يجد اي سجل في المؤشر‬
‫السطر رقم ‪ :20‬مؤشر ضمني لكي يقوم بالحصول على عدد ساعات الطلب في المقرر الموجود حاليا في المؤشر‬
‫الصريح ويضع عدد الساعات في المتغير ‪hour‬‬
‫السطر رقم ‪ :24‬اضافة عدد النقاط للمقرر الحالي الى مجموع النقاط السابق‬
‫السطر رقم ‪ :25‬اضافة عدد الساعات للمقرر الحالي الى مجموع الساعات السابق‬
‫السطر رقم ‪ :26‬الخروج من الحلقة‬
‫السطر رقم ‪ :27‬انهاء المؤشر الضمني‬
‫السطر رقم ‪ :28‬حساب المعدل وهو مجموع النقاط تقسيم مجموع عدد الساعات‬
‫السطر رقم ‪ :29‬الرجوع بقيمة المعدل‬
‫السطر رقم ‪ :30‬النهاء‬

‫الن بعد النتهاء من شرح طريقة تصميم الوظيفة جاء دور طريقة الستدعاء ‪:‬‬
‫لكن قبل الستدعاء لنحسب يدويا معدل الطالب الذي رقمه ‪ 111‬مثل لكي نقارنه بالنتائج بعد الستعلم ‪:‬‬
‫مجموع نقاط الطالب = ‪27.75 =14.25+13.5‬‬
‫مجموع عدد الساعات = (عدد ساعات المقرر ‪( + ( 216CS‬عدد ساعات المقرر ‪( 225CS‬‬
‫=‪6=3+3‬‬
‫وبالتالي فان معدل الطالب = ‪4.63 = 6 ÷ 27.75‬‬
‫لكن الن دعنا نستدعي الدالة ونشاهد النتائج‬
‫)‪SELECT distinct(NO_STU),stu_avea(no_stu‬‬
‫‪from studys‬‬
‫;‪where no_stu=111‬‬
‫لحظ كيف تم استدعاء الدالة من خلل الستعلم ولحظ استخدام الدالة ‪ distinct‬وهي لعدم تكرار السجل واليك‬
‫النتائج ‪:‬‬
‫(‪STU_AVEA(NO_STU‬‬
‫‪---------------‬‬‫‪4.63‬‬

‫‪NO_STU‬‬
‫; ‪------‬‬
‫‪111‬‬

‫لحظ لو كان الستعلم بدون وجود الدالة ‪ distinct‬فسوف يتكرر رقم الطالب عدد ظهوره في الجدول لذلك لوكان‬
‫كمايلي ‪:‬‬
‫‪108‬‬

SELECT NO_STU,stu_avea(no_stu)
from studys
where no_stu=111;

‫فان النتائج ستصبح هكذا‬
NO_STU
-----111
111

;

STU_AVEA(NO_STU)
---------------4.63
4.63
distinct ‫وهذا سبب ظهور الدالة‬

109

‫الحزم البرمجية و الزنادات‬
‫أهداف الفصل‬
‫سنتناول في هذا الفصل ان شاء ال ‪:‬‬
‫‪-1‬ماهية الحزم البرمجية‬
‫‪-2‬كيقية انشاء الحزم البرمجية ومكوناتها‬
‫‪-3‬ماهية الزنادات‬
‫‪-4‬التعامل مع الزنادات‬
‫‪-5‬قوائد الزنادات‬

‫الحزم البرمجية‬
‫تعلمنا سابقا كيفية انشاء الجراءت والوظائف المخزنة‪ .‬لكن مارأيك لو وجد لدينا قاعدة بيانات كبيرة جدا ولنضرب‬
‫مثال انها تحتوي على ‪ 50‬اجراء او وظيفة وظيفة او اجراء لها عمل خاص ولنفرض ان هذه القاعدة هي لمحل تجاري‬
‫ضخم يحتوي على بيانات العملء وبيانات الموظفين وبيانات الصناف التجارية وبيانات المخزون وغيرها من بيانات‬
‫‪ ,‬ولذلك فان بعض هذه الجرائيات والوظائف المخزنة مختص بالعملء مثل وجود اجراء لحساب اجمالي عميل‬
‫وغيرها من الجرائيات ‪ ,‬ومثل وجود اجرئيات خاصة بالموظفين مثل اجرائية خاصة بحساب راتب الموظف بعد‬
‫حذف الحسومات واضافة العلوات وغيرها ايضا ‪ ,‬لكن وضعها في هذا الشكل في قاعدة البيانات قد يسسب لك بعض‬
‫الرباك لذلك مارأيك بان تجمع كل الوظائف والجرائيات الخاصة بكل قسم في مجموعة لوحدها وهذه المجموعة‬
‫تدعي الحزمه ‪ package‬مثل نجمع كل اجرائيات والوظائف الخاصة بالعملء في حزمة خاصة‬
‫فوائد استخدام الحزمة‬
‫‪ -1‬تجميع وحدات ‪ pl/sql‬المرتبطة‪.‬‬
‫‪ -2‬اداء افضل‪.‬‬
‫‪ -3‬تكون السرية افضل‪.‬‬
‫‪ -4‬اهم شيء هو في عملية الصيانه حيث تسهل عملية الصيانة باستخدامم الحزم‪.‬‬
‫مكونات الحزم‬
‫تتكون الحزمة من جزءين الول وهو الوصف ‪ specification‬ويحتوي على التعاريف مثل متغيرات او مؤشرات او‬
‫اسماء الجراءت ومتحولتها‪.‬‬
‫اما الجز الثاني فهو جسم الحزمة ويحتوي على تفاصيل الجراءت والعمليات وغيرها‬
‫والصيغة العامة لنشاء الجزء الول كمايلي ‪:‬‬
‫‪CREATE OR REPLACE PACKAGE pack_name AS‬‬
‫‪.........‬‬
‫‪.........‬‬
‫‪.........‬‬
‫;‪end‬‬
‫‪110‬‬

: ‫والصيغة العامة لنشاء الجزء الثاني كمايلي‬
CREATE OR REPLACE PACKAGE BODY pack_name AS
.........
‫جسم الزمة‬
.........
end;

.‫لكن يجب ان يكون اسم الحزمة في الجزء الول هو نفس اسم الحزمة في الجزء الثاني‬

: ‫مــثال‬
‫لنقم بانشاء حزمة تحتوي على وظيفة لحساب معدل طالب واجراء لطباعة المعدل‬
‫ والتي تقوم بحساب معدل‬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;
111

‫;‪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‬‬
‫;‪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‬‬
‫‪/‬‬

‫وبعد التفيذ يكون الناتج هو معدل الطالب الذي رقمه ‪ 111‬لحظ اول شي استدعينا داله حساب المعدل ووضعناها في‬
‫المتغير ‪ aa‬ثم استدعينا اجراء الطباعة ليتم طبعة على الشاشة‪.‬‬
‫والن و بعد ان تعرفت على فائدة الحزم مارأيك من الن فصاعد ان تستخدم الحزم في كتابة الجرائيات والوظائف‬
‫‪112‬‬

‫الزنادات ‪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‬او‬
‫بكليهما‪..‬‬
‫ويوجد اربعة انواع من الزنادات‪:‬‬
‫‪ -1‬صف ‪.after‬‬
‫‪ -2‬جملة ‪.after‬‬
‫‪ -3‬صف ‪.before‬‬
‫‪ -4‬جملة ‪.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‬‬
‫‪:‬لكل صف **‬
‫يعد هذا الخيار ما اذا كان الزناد سوف ينطلق مرة واحدة لكل صف تاثر بالزناد ‪for each row‬‬
‫يمكنك من الوصول الى القيم القديمة والحديثة للصف الحالي ‪ for each row ,‬في نص الزناد الخاص بزناد السطر‬
‫فمن الطبيعي ‪ delete‬يمكنك الوصول من القيم القديمة والحديثة اما بالنسبة لعملية ‪ update‬و ‪ insert‬حيث في عمليتي‬
‫‪113‬‬

‫ان المتاح هو القيم القديمة فقط‬
‫وسوف تكون القيم القديمة والحديثة هي الموجودة ‪ before‬و ‪ after‬ويمكنك استخدام القيم القديمة والحديثة في زنادات‬
‫‪.‬فانه يقوم بالتقاط القيمة بعد التحديث ‪ after trigger‬اما اذا كان‪ before trigger .‬فقط في‬
‫قيد الزناد‬
‫يحدد هذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد‪.‬‬
‫على سبيل المثال الزناد التالي ‪ stduent_trigger‬ل يتم حدوثة ال اذا كان رقم الطالب ‪ student_id‬اقل من ‪100‬‬
‫‪create or replace trigger stduent_trigger‬‬
‫‪before insert or update on student‬‬
‫‪for each row‬‬
‫(‪when(new.student_id>100‬‬
‫قيود على انشاء الزنادات‪:‬‬
‫‪ -1‬يمكن للنص ان يحتوي على جمل ‪ dml sql‬لكن جمل ‪ select‬يجب ان تكون جمل ‪select into‬‬
‫‪ -2‬ليسمح بجمل التحكم ( ‪(commit,savepoint,rollback‬‬
‫‪-3‬ليمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد‪.‬‬
‫مـــــــــــــــــثال ‪:‬‬
‫لنفرض انه لدينا الثلث جداول التالية‪:‬‬
‫الول ‪ :‬هو جدول ‪ player‬بيانات جميع اللعبين في النادي سواء درجة شباب او درجة ممتاز ‪:‬‬
‫‪levels‬‬
‫‪1‬‬
‫‪2‬‬
‫‪2‬‬
‫‪1‬‬

‫‪address‬‬
‫‪riyadh1‬‬
‫‪riyadh2‬‬
‫‪riyadh3‬‬
‫‪riyadh4‬‬

‫‪phone‬‬
‫‪123456‬‬
‫‪654321‬‬
‫‪123789‬‬
‫‪123123‬‬

‫‪no_player‬‬
‫‪name date_birth‬‬
‫‪1‬‬
‫‪talal 11/11/1973‬‬
‫‪2 mohammed 1/1/1982‬‬
‫‪3‬‬
‫‪sami 1/1/1988‬‬
‫‪4‬‬
‫‪yosif 12/3/1970‬‬

‫حيث ‪ level‬تمثل الدرجة التي يلعب بها اللعب حيث ‪ 1‬تمثل الدرجة الولى الممتاز ‪ -‬و ‪ 2‬تمثل الشباب ‪.‬‬
‫ولنشاء الجدول كمايلي ‪:‬‬
‫(‪create table player‬‬
‫‪no_player varchar2(6( primary key,‬‬
‫‪name varchar2(50(,‬‬
‫‪date_birth date,‬‬
‫‪phone varchar2(9(,‬‬
‫‪address varchar2(20(,‬‬
‫;((‪levels number(2‬‬
‫‪114‬‬

larg_player ‫ هو جدول اللعبين في درجة الممتاز وهو خاص بالرواتب واسم الجدول‬: ‫الثاني‬
no_player
1
4

level_no
1
1

salary

: ‫ولنشاء الجدول كمايلي‬
create table larg_player(
no_player varchar2(6( primary key,
level_no number(2(,
salary number(7,2((;

youth ‫ هو جدول اللعبين في درجة الشباب وهو خاص بالرواتب واسم الجدول‬: ‫الثالث‬
no_player
2
3

level_no
2
2

salary

: ‫ولنشاء الجدول كمايلي‬
create table youth(
no_player varchar2(6( primary key,
level_no number(2(,
salary number(7,2((;
‫الن نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم لعب جديد وتحديد مستواه (شباب او ممتاز( يقوم الزناد‬
‫باختبار المستوى فاذا كان شباب اضاف رقم اللعب في جدول الشباب وكذلك لوكان مستواه درجة اولى الممتاز فانه‬
: ‫ وبذلك يكون الزناد كمايلي‬larg_player ‫يضيف رقم اللعب في جدول‬
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;
115

‫بعد ذلك قم بادخال مايلي ‪:‬‬
‫;(‪insert into player values('1','talal','11/11/1973','123456','riyadh1',1‬‬
‫لحظ ان المدخلت تمت على جدول ‪ player‬بعد ذلك اذهب وقما بالستعلم في جدول ‪ larg_player‬سوف تجد انه‬
‫اضاف رقم اللعب هناك‪.‬‬

‫التجميعات‬
‫انواع التجميعات في قاعدة البيانات‪:‬‬
‫التجميعة هي مجموعة من العناصر من نفس النوع‬
‫والتجميعات هي على نوعين‪:‬‬
‫•التجميعة ‪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‬‬
‫‪116‬‬

‫ونقوم فيمايلي بتنفيذبعض اوامر ‪ sql‬على الجدول‬

‫‪-1‬‬

‫الدراج ‪: insert‬‬
‫‪;(('Insert into deptv values(10,'medical',namev('ali','sami','fahad','fady‬‬

‫‪ -2‬التحديث ‪: update‬‬
‫لتحديث العناصر في التجميعة يتطلب استخدام ‪ pl/sql‬وليمكن تنفيذ ذلك من خلل ‪ 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‬‬
‫شرح المثال السابق‪:‬‬
‫سوف يقوم بتغير اسم الموظف ‪ sami‬الذي قمنا بادخال وتبديلة الى ‪ mohammed‬وشرح الخطوات كمايلي‬
‫اول قمنا بتعريف متغير ‪ editname‬من نفس نوع التجميعة ‪ namev‬وذلك لكي نقوم بتخزين المؤشر والذي‬
‫يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير ‪ I‬وهو من يستخدم كعداد‪.‬‬
‫ثم نقوم بعمل مؤشر لستخراج اسماء الموظفين وهي كمايلي‬
‫‪Select emp into editname‬‬
‫‪;From deptv where nodept=10‬‬
‫يقوم هنا باستخراج اسماء الموظفين للقسم ‪ 10‬وتخزين ناتج الستعلم في المتغير ‪ editname‬والذي هو من نفس‬
‫نوع التجميعة‬
‫ثم يبدأ حلقة ومن ثم يختبر هل ‪ I‬وصلت الى نهاية التجميعة اذا كان نعم قام بانهاء الجراء واذا لم يصل الى نهاية‬
‫التجميعة يختبر عنصر التجميعة الحالي هل هو يساوي ‪ sami‬ام ل اذا كان يساوي ‪ sami‬يقوم بتغير هذه القيمة‬
‫الى ‪ mohammed‬ومن ثم يزيد العداد بواحد ومن ثم يعود من جديد الى ان يصل الى نهاية التجميعة وبعد‬
‫النتهاء من جميع العناصر يقوم بعمل التحديث للجدول‬
‫‪117‬‬

‫‪;update deptv set emp=editname where nodept=10‬‬
‫ومن ثم يقوم بانهاء الجراء‪.‬‬
‫‪-2‬‬

‫الحذف ‪: )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‬‬
‫‪/‬‬
‫‪ -4‬التحديث بالضافة ‪)update)append‬‬
‫هذا المر يستخدم للضافة‬
‫ألم يتبادر الى ذهنك كيف نضيف مزيدا من الموظفين الى القسم ‪ 10‬يمكن ان تقول نستخدم المر ‪ insert‬لكن هذا غير‬
‫صحيح لننا عندما نستخدم المر ‪ insert‬وندخل رقم القسم ‪ 10‬يظهر لنا خطاء لن حقل رقم القسم مفتاح رئسي‬
‫لذلك اذا اردنا اضافة المزيد من الموظفين اول نقوم بعمل توسع ‪ extend‬للتجميعة لكي تسمح لنا باضافة عنصر جديد‬
‫‪.‬ونستخدم الجراء لذلك‬
‫ويكون الجراء كمايلي‪:‬‬
‫‪Declare‬‬
‫‪;Newname namev‬‬
‫‪Begin‬‬
‫‪Select emp into newname‬‬
‫‪;From deptv where nodept=10‬‬
‫‪;Newname.extend‬‬
‫‪;'Newname(newname.last):='khaled‬‬
‫‪;update deptv set emp=newname where nodept=10‬‬
‫‪;end‬‬
‫‪/‬‬

‫‪118‬‬

‫ب ‪ -‬التجميعة ‪ varray‬من النوع الشيء‪:‬‬
‫هذه التجميعة هي تجميعة معرفة بواسطة المستخدم‬
‫مثال ذلك ‪:‬‬
‫لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر نكّون تجميعة تحتوي على اسم الموظف وراتبة‬
‫لجميع موظفين هذه الوظيفة‬
‫‪JOB_NAME‬‬
‫‪manager‬‬
‫‪Analysis‬‬
‫‪Programming‬‬

‫‪EMPLOYEE‬‬
‫(‪(ali,5000(,(sami,6000(,(fahad,4000‬‬
‫(‪(laui,7500(,(mohammed,7500‬‬
‫(‪(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‬‬
‫‪;(employee employeeobj‬‬
‫وبعد انشاء الجدول سوف نتعرف الن على كيفية التعامل مع هذا الجدول من خلل ‪sql * plus‬‬
‫‪ -1‬الضافة ‪:‬‬
‫لضافة صف إلى الجدول السابق نقوم بمايلي ‪:‬‬
‫‪Insert into jobobj values‬‬
‫('‪( manager',employeeobj‬‬
‫‪,(empobj('ali',5000‬‬
‫‪119‬‬

,(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((
‫ونلحظ لقد تم اضافة الصف الجديد‬

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

: ‫ التحديث‬-2
:‫ كمايلي‬pl/sql ‫يجب تطبيق قطعة‬

10000 ‫ وجعل راتبه‬manager ‫ الموجود في قسم‬sami ‫وبهذا يتم تعديل راتب الموظف الذي اسمه‬
120

‫‪ -3‬الحذف‪:‬‬
‫‪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‬من النوع البسيط والتي نقوم بتعريفها بواسطة احد انواع البيانات الموجودة‬
‫مثل ‪ number‬و ‪ varchar2‬وسوف نستخدم هنا نفس المثال الذي استخدمناه في التجميعة ‪ varray‬من النوع الشيئ ‪.‬‬
‫مثال‪ /‬نفرض انك تريد انشاء جدول القسام في مستشفى والذي سوف يحتوي على رقم القسم ‪ ,‬اسم القسم ‪ ,‬واسم القسم ‪,‬‬
‫ومن ثم اسماء موظفين القسم ‪.‬مع العلم ان اسماء الموظفين سوف تكون في تجميعة ‪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‬‬

‫‪121‬‬

sql ‫**التعامل مع الجدول السابق من خلل اوامر‬
: ‫ الضافة‬-1
;(('Insert into deptnested values(1,'medical',namenested('ali','sami','fahad','fady
: update ‫ التحديث‬-2
:‫ القياسية مثال‬sql ‫ وليمكن تنفيذ ذلك من خلل‬pl/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
/

:‫شرح المثال السابق‬
‫ وشرح الخطوات كمايلي‬mohammed ‫ الذي قمنا بادخال وتبديلة الى‬sami ‫سوف يقوم بتغير اسم الموظف‬
‫ وذلك لكي نقوم بتخزين المؤشر‬namenested ‫ من نفس نوع التجميعة‬editname ‫اول قمنا بتعريف متغير‬
.‫ وهو يستخدم كعداد‬I ‫والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير‬
‫ثم نقوم بعمل مؤشر لستخراج اسماء الموظفين وهي كمايلي‬

Select emp into editname
;From deptnested where nodept=1

122

‫يقوم هنا باستخراج اسماء الموظفين للقسم ‪ 1‬وتخزين ناتج الستعلم في المتغير ‪ editname‬والذي هو من نفس‬
‫نوع التجميعة‬
‫ثم يبدأ حلقة ومن ثم يختبر هل ‪ I‬وصلت الى نهاية التجميعة اذا كان نعم قام بانهاء الجراء واذا لم يصل الى نهاية‬
‫التجميعة يختبر عنصر التجميعة الحالي هل هو يساوي ‪ sami‬ام ل اذا كان يساوي ‪ sami‬يقوم بتغير هذه القيمة‬
‫الى ‪ mohammed‬ومن ثم يزيد العداد بواحد ومن ثم يعود من جديد الى ان يصل الى نهاية التجميعة وبعد‬
‫النتهاء من جميع العناصر يقوم بعمل التحديث للجدول‬
‫‪;update deptnested set emp=editname where nodept=1‬‬
‫ومن ثم يقوم بانهاء الجراء‪.‬‬

‫‪ -3‬التحديث بالضافة ‪: )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‬‬
‫‪/‬‬
‫‪-4‬الحذف ‪:‬‬
‫هناك طريقتان الولى باستخدام ‪ trim‬وهذه الطريقة تحذف اخر صف في التجميعة وليمكن اختيار اي عنصر في‬
‫التجميعة‪:‬‬
‫‪Declare‬‬
‫‪;Namedel namenested‬‬
‫‪Begin‬‬
‫‪Select emp into namedel‬‬
‫‪;From deptnested where nodept=1‬‬
‫‪;(Namedel.trim(1‬‬
‫‪;update deptnested set emp=namedel where nodept=1‬‬
‫‪;end‬‬
‫‪/‬‬
‫‪123‬‬

‫اما الطريقة الثانية فهي باستخدام المر ‪ (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‬‬
‫مثال ذلك ‪:‬‬
‫لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل اخر نكّون تجميعة تحتوي على اسماء الموظف وراتبة‬
‫لجميع موظفين هذه الوظيفة‬

‫اول خطوة هي انشاء الشيء ‪ empobj‬والذي تم انشاءه سابق عندما قمنا بشرح ‪ vaaray‬من النوع الشيء واذا‬
‫كنت لم تقم بانشاءه فهذا الكود ‪:‬‬
‫‪Create type empobj‬‬
‫‪;((as object (nameemp varchar2(50),salary number(6‬‬
‫‪/‬‬
‫ثاني خطوة هي إنشاء التجميعة ‪ nested table‬باستخدام الشيء ‪ empobj‬كمايلي‬
‫‪;Create type empnestedobj as table of empobj‬‬
‫‪/‬‬

‫‪124‬‬

:‫ثالث خطوة نقوم بإنشاء الجدول كمايلي‬
Create table jobnested
,(job_name varchar2(50)
(employee empnestedobj
;nested table employee store as nestedtablesimple
sql ‫* التعامل مع الجدول السابق من خلل اوامر‬
: ‫ الضافة‬-1
:‫لكي تقوم بادراج بيانات في الجدول السابق نقوم بمايلي‬
Insert into jobnested
Values('manager',
empnestedobj(empobj('ali',6000),
empobj('sami',7000),
empobj('fahad',6500)));
: ‫التحديث‬

-1

:‫ كمايلي‬pl/sql ‫يتم التحديث باستخدام‬
9000 ‫ الى‬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;
125

/

-: )update)append ‫ التحديث بالضافة‬-3
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 ‫ الحذف‬-4
‫ وهذه الطريقة تحذف اخر صف في التجميعة وليمكن اختيار اي عنصر في‬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

126

‫الطريقة الثانية‬
declare
empdel empnestedobj;
begin
Select employee into empdel
From jobnested where job_name='manager';
Empdel.delete(2);
update jobnested set employee=empdel where
job_name='manager';
end;
/
‫المراجع‬
Oracle 8 Unleashed Second Edition – Sams-1
Introduction to Oracle: SQL and PL/SQL Using-2
Procedure Builder (Electronic Presentation(1995
Oracle8 How-To-3
Teach Yourself Oracle 8 In 21 Days-4

127

Sign up to vote on this title
UsefulNot useful